codeforces round721 div2. E
生活随笔
收集整理的這篇文章主要介紹了
codeforces round721 div2. E
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
給n(n<=35000)個數,要求分成k(k<=100)個區間。每個區間當中如果有多個相同的數,那么答案就會加上這個數最后一個減去最前一個的位置。要求劃分后答案最小的值是多少。
最近四邊形優化做的有點多,下意識覺得可以用決策單調性,但是想想好像不太能夠存的下(可能要用一些比較高級的數據結構),看了其他人的代碼,發現都是用的線段樹。
首先寫出dp方程:,
然后我們考慮a[j]對于答案的貢獻,假設a[j]上一次出現的位置是pre[j]:
1.?a[j]在區間(pre[j]?+?1,j)沒有出現過:
2.?a[j]在區間(1,pre[j])出現過,
這就相當于,在的基礎上,在做了一次區間加法。而最小值也要從這一段求出來,所以每一次初始化線段樹的值為,然后每一次求的時候,就通過區間加法來獲得的值,之后詢問區間最小值即可。
復雜度
const int N = 35010, K = 110, inf = 1e9; int a[N], dp[N][K], pre[N], last[N];struct tree {int l, r, mn, lazy; }; tree t[N << 2];void buildtree(int l, int r, int x, int k) {t[x].l = l; t[x].r = r; t[x].lazy = 0;if (l == r) t[x].mn = dp[l - 1][k];else{int mid = (l + r) >> 1;buildtree(l, mid, x << 1, k);buildtree(mid + 1, r, x << 1 | 1, k);t[x].mn = min(t[x << 1].mn, t[x << 1 | 1].mn);} }void pushdown(int x) {t[x << 1].mn += t[x].lazy;t[x << 1].lazy += t[x].lazy;t[x << 1 | 1].mn += t[x].lazy;t[x << 1 | 1].lazy += t[x].lazy;t[x].lazy = 0; }void change(int l, int r, int x, int d) {if (l <= t[x].l && t[x].r <= r){t[x].mn += d;t[x].lazy += d;return;}if (l > t[x].r || r < t[x].l)return;pushdown(x);change(l, r, x << 1, d);change(l, r, x << 1 | 1, d);t[x].mn = min(t[x << 1].mn, t[x << 1 | 1].mn); }int search(int l, int r, int x) {if (l <= t[x].l && t[x].r <= r)return t[x].mn;if (l > t[x].r || r < t[x].l)return inf;pushdown(x);return min(search(l, r, x << 1), search(l, r, x << 1 | 1)); }int main() {int T = 1;//T = read();while (T --){int n, k;n = read(); k = read();for (int i = 1; i <= n; i ++){a[i] = read();if (last[a[i]])dp[i][1] = dp[i - 1][1] + i - last[a[i]];elsedp[i][1] = dp[i - 1][1];pre[i] = last[a[i]];last[a[i]] = i;}for (int j = 2; j <= k; j ++){dp[0][j - 1] = inf; buildtree(1, n + 1, 1, j - 1); // for (int k = 1; k <= n; k ++) // printf ("%d ", search(k, k, 1)); // printf ("\n");for (int i = 1; i <= n; i ++){change(1, pre[i], 1, i - pre[i]);dp[i][j] = search(1, i, 1); // for (int k = 1; k <= n; k ++) // printf ("%d ", search(k, k, 1)); // printf ("\n");}}cout << dp[n][k];}return 0; } 與50位技術專家面對面20年技術見證,附贈技術全景圖總結
以上是生活随笔為你收集整理的codeforces round721 div2. E的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 辽宁沈阳计算机学校王斯琪,青春正好,理所
- 下一篇: Yinchuan-B The Great