社区讨论

动态开点线段树求调

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 条回复,欢迎继续交流。

正在加载回复...