0
点赞
收藏
分享

微信扫一扫

标题:构建编程学习的知识宝库:高效笔记策略

Hyggelook 2024-08-15 阅读 4

链接: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];
	}
}
举报

相关推荐

0 条评论