链接:https://codeforces.com/contest/2002/problem/E
思路:我们使用前缀处理的方法进行简化计算,减少时间复杂度,也就是把不必要存在的对数删除,那我们需要删除哪些?
对于每次新加入的对数,如果与上次的对数的b相同那么就加一次即可,然后往前遍历,如果遇到权值不同的,长度比他长,那么就删除,他没有必要存在,如果比他短,就循环结束,把当前对数加到前缀里面。
对于新加入的对数,如果与上次的b不同,那么就直接往前遍历,接下来同上。
那么为什么有的对数没必要存在,需要大家想一想。
代码:
void solve(){
int N;
cin >> N;
ll ans = 0;
vector<pair<ll, int> > freq;
for(int i = 0; i < N; i++){
ll A;
int b;
cin >> A >> b;
ll popmax = 0;
while(true){
if(freq.empty()){
ans = max(ans, A);
freq.push_back({A, b});
break;
}
if(freq.back().second == b){
A += freq.back().first - popmax;
popmax = 0;
freq.pop_back();
} else if(freq.back().first <= A){
popmax = max(popmax, freq.back().first);
freq.pop_back();
} else {
freq.push_back({A, b});
ans = max(ans, A);
break;
}
}
cout << ans << " \n"[i == N - 1];
}
}