社区讨论
动态开点线段树求调
P2205[USACO13JAN] 刷墙 Painting the Fence S参与者 2已保存回复 1
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 1 条
- 当前快照
- 1 份
- 快照标识符
- @mlriabmp
- 此快照首次捕获于
- 2026/02/18 12:02 昨天
- 此快照最后确认于
- 2026/02/19 08:04 6 小时前
CPP
#include<bits/stdc++.h>
using namespace std;
#define int unsigned long long
int n,k,pos=1000000005,a,root,cnt,ls[110000],rs[110000],tree[110000],ans[110000],tag[110000];
char b;
void pushup(int pos,int l,int r){
if(l==r){
if(tree[pos]>=k)ans[pos]=1;
else ans[pos]=0;
return;
}
ans[pos]=ans[ls[pos]]+ans[rs[pos]];
return;
}
void pushdown(int pos,int l,int r){
if(!tag[pos])return;
int mid=(l+r)/2;
if(!ls[pos])cnt++,ls[pos]=cnt;
if(!rs[pos])cnt++,rs[pos]=cnt;
tree[ls[pos]]+=tag[pos];
tree[rs[pos]]+=tag[pos];
tag[ls[pos]]+=tag[pos];
tag[rs[pos]]+=tag[pos];
pushup(ls[pos],l,mid);
pushup(rs[pos],mid+1,r);
tag[pos]=0;
return;
}
void upd(int &pos,int nl,int nr,int l,int r,int v){
if(!pos)cnt++,pos=cnt;
if(l<=nl&&r>=nr){
tree[pos]+=v;
tag[pos]+=v;
pushup(pos,nl,nr);
return;
}
pushdown(pos,nl,nr);
int mid=(nl+nr)/2;
if(l<=mid)upd(ls[pos],nl,mid,l,r,v);
if(r>mid)upd(rs[pos],mid+1,nr,l,r,v);
pushup(pos,nl,nr);
return;
}
signed main(){
cin>>n>>k;
for(int i=1;i<=n;i++){
cin>>a>>b;
if(b=='R'){
upd(root,1,2100000000,pos,pos+a,1);
pos+=a;
}
else{
upd(root,1,2100000000,pos-a,pos,1);
pos-=a;
}
}
cout<<ans[root];
return 0;
}
样例输出 5,不知道问题在那里。感觉逻辑都是对的啊?
回复
共 1 条回复,欢迎继续交流。
正在加载回复...