Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include<iostream>
- #include<vector>
- #include<algorithm>
- #include<string>
- #include<set>
- #include<iterator>
- #include<map>
- #include<deque>
- #include<math.h>
- #include<numeric>
- #include<queue>
- #include<stack>
- #include<iomanip>
- #include<unordered_set>
- #include<chrono>
- #include<random>
- #define int long long
- #define pb push_back
- #define ld long double
- using namespace std;
- int32_t main() {
- ios_base::sync_with_stdio(false);
- cin.tie(0);
- int n, t;
- cin >> n >> t;
- vector<int> a(n);
- for (int i = 0; i < n; i++) {
- cin >> a[i];
- }
- vector<vector<pair<int, int>>> dp(n + 1);
- vector<int> ind(n + 1);
- vector<vector<int>> pref(n + 1);
- for (int i = 1; i <= n; i++) {
- int sum = 0;
- for (int j = i - 1; j > -1; j--) {
- sum += a[j];
- if (j == 0) {
- dp[i].pb({ sum * sum, sum * sum });
- }
- else {
- if (dp[j][0].first > sum* sum) {
- continue;
- }
- while (ind[j] < dp[j].size() - 1 && dp[j][ind[j]].first <= sum * sum) {
- ind[j]++;
- }
- dp[i].pb({ sum * sum, sum * sum + pref[j][ind[j]] });
- }
- }
- int mn = 1e18;
- for (auto to : dp[i]) {
- mn = min(mn, to.second);
- pref[i].pb(mn);
- }
- }
- int mn = 1e18;
- for (auto to : dp[n]) {
- mn = min(mn, to.second);
- }
- cout << mn;
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement