社区讨论
非暴力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 条回复,欢迎继续交流。
正在加载回复...