社区讨论

非暴力50分求助

P7870「Wdoi-4」兔已着陆参与者 1已保存回复 1

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
1 条
当前快照
1 份
快照标识符
@lt2o0dhv
此快照首次捕获于
2024/02/26 16:16
2 年前
此快照最后确认于
2024/02/26 19:56
2 年前
查看原帖
CPP
#define _CRT_SECURE_NO_WARNINGS
#include<bits/stdc++.h>
using namespace std;

int n;
int p,l,r,k;
long long ans = 0;

struct node{
	int l, r;
};

stack<node> a;//

int main(){
	scanf("%d", &n);
	node t;//
	for(int i = 1; i <= n; i++){
		scanf("%d", &p);
		if(p == 1){
			scanf("%d%d", &t.l, &t.r);//
			a.push(t);
		}
		else{
			node ta = a.top();
			scanf("%d", &k);
			if(ta.r - ta.l + 1 >= k){//删除的个数不超过区间的个数
				ans += ((ta.r - k + 1 + ta.r) * k) / 2;//加起来
				if(ta.r - ta.l + 1 == k) a.pop();//刚好删完
				else{
					//没删完更新右边界
					a.pop();
					ta.r -= k;
					a.push(ta);
				}
			}
			else{
				while(k > 0){//删除的个数超过了区间的个数
					ta = a.top();
					if(ta.r - ta.l + 1 <= k){//超过了区间的个数就全部删完
						ans += (ta.r + ta.l) * (ta.r - ta.l + 1) / 2;
						a.pop();//删除区间
						k -= ta.r - ta.l + 1;//已经被删掉的数的个数
					}
					else{ //没超过
						ans += (ta.r - k + 1 + ta.r) * k / 2;
						ta.r -= k;
						a.push(ta);
						k = 0;
					}
				}
			}
			cout << ans << endl;
		}
		ans = 0;
	}
	return 0;
}

回复

1 条回复,欢迎继续交流。

正在加载回复...