我试图解决一个问题,我进入我没能解决一些障碍,在这里出发是问题: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