我試圖解決一個問題,我進入我沒能解決一些障礙,在這裏出發是問題:Codeforces - 817D試圖瞭解這個解決方案
現在我試圖蠻力它,使用基本得到我可以生成的數組中的每個段的最小值和最大值,然後跟蹤它們我將它們相減並將它們加在一起以獲得最終的不平衡,這看起來不錯,但它給了我一個超出時間限制的原因暴力強制n *( n + 1)/ 2數組的子節點給出n是10^6,所以我只是無法繞過它,之後像幾個小時沒有得到任何新的想法,我決定看到一個解決方案,我什麼都不懂在說實話:/,這裏是解決方案:
#include <bits/stdc++.h>
#define ll long long
int a[1000000], l[1000000], r[1000000];
int main(void) {
int i, j, n;
scanf("%d",&n);
for(i = 0; i < n; i++) scanf("%d",&a[i]);
ll ans = 0;
for(j = 0; j < 2; j++) {
vector<pair<int,int>> v;
v.push_back({-1,INF});
for(i = 0; i < n; i++) {
while (v.back().second <= a[i]) v.pop_back();
l[i] = v.back().first;
v.push_back({i,a[i]});
}
v.clear();
v.push_back({n,INF});
for(i = n-1; i >= 0; i--) {
while (v.back().second < a[i]) v.pop_back();
r[i] = v.back().first;
v.push_back({i,a[i]});
}
for(i = 0; i < n; i++) ans += (ll) a[i] * (i-l[i]) * (r[i]-i);
for(i = 0; i < n; i++) a[i] *= -1;
}
cout << ans;
}
我試圖追蹤它,但我一直想知道爲什麼是矢量使用,我得到的唯一想法是他想使用向量作爲一個堆棧,因爲他們都行爲相同(幾乎),但然後事實,我不甚至不知道爲什麼我們需要一個堆棧,而這個等式ans += (ll) a[i] * (i-l[i]) * (r[i]-i);
真的令我困惑,因爲我不知道它從哪裏來。
一個提高複雜度的小技巧,不要做單個元素集。然而他們的不平衡值是零。 –
是的,你是對的。但是,這確實會影響「真實」世界的執行時間,但並不會改變時間複雜度。 – AquilaRapax