就离谱
查看原帖
就离谱
339846
RuntimeErr楼主2021/1/18 20:39

写了对拍文件跟std的答案一模一样,

结果还听取WA声一片

code:

#include<cstdio>
#include<cstdlib>
#include<iostream>
#define ls(now) fhq[now].l
#define rs(now) fhq[now].r
using namespace std;
const int N=2e5+10;
#define int long long
struct fhqTreap {
    int l,r;
    int val,key,size,sum;
    bool tag;
} fhq[N<<7];
int n,m,cnt=0,rt[N],last;

inline int newnode(int val) {
    fhq[++cnt].val=fhq[cnt].sum=val;
    fhq[cnt].key=rand();
    fhq[cnt].size=1;
    return cnt;
}
inline void pushup(int now) {
    fhq[now].size=fhq[ls(now)].size+fhq[rs(now)].size+1;
    fhq[now].sum=fhq[ls(now)].sum+fhq[rs(now)].sum+fhq[now].val;
}
inline int clone(int now) {
    int res=newnode(0);
    fhq[res]=fhq[now];
    return res;
}
inline void pushdown(int now) {
    if(ls(now))ls(now)=clone(ls(now)),fhq[ls(now)].tag^=1;
    if(rs(now))rs(now)=clone(rs(now)),fhq[rs(now)].tag^=1;
    swap(ls(now),rs(now));
    fhq[now].tag=0;
}
int merge(int x,int y) {
    if(!x||!y)return x|y;
    if(fhq[x].tag)pushdown(x);
	if(fhq[y].tag)pushdown(y);
    if(fhq[x].key>fhq[y].key) {
        rs(x)=merge(rs(x),y);
        pushup(x);return x;
    } else {
        ls(y)=merge(x,ls(y));
        pushup(y);return y;
    }
}
void split(int now,int sz,int &x,int &y) {
    if(!now)x=y=0;
    else {
        if(fhq[now].tag)pushdown(now);
        if(fhq[ls(now)].size<sz) {
            x=clone(now);
            split(rs(x),sz-fhq[ls(now)].size-1,rs(x),y);
            pushup(x);
        } else {
            y=clone(now);
            split(ls(y),sz,x,ls(y));
            pushup(y);
        }
    }
}
signed main() {
	srand(114514);
    scanf("%lld",&n);
    int v,op,a,b,x,y,z;
    for(int i=1; i<=n; i++) {
        scanf("%lld%lld",&v,&op);
        switch(op) {
        	case 1:
           	 scanf("%lld%lld",&a,&b);
            	a^=last;b^=last;
            	split(rt[v],a,x,y);
           	 rt[i]=merge(merge(x,newnode(b)),y);
           	 break;
        	case 2:
            	scanf("%lld",&a);
            	a^=last;
            	split(rt[v],a,x,z);
            	split(x,a-1,x,y);
            	rt[i]=merge(x,z);
        		break;
        	case 3:
            	scanf("%lld%lld",&a,&b);
            	a^=last;b^=last;
            	split(rt[v],b,x,z);
            	split(x,a-1,x,y);
            	fhq[y].tag^=1;
            	rt[i]=merge(merge(x,y),z);
            	break;
        	case 4:
            	scanf("%lld%lld",&a,&b);
            	a^=last;b^=last;
            	split(rt[v],b,x,z);
            	split(x,a-1,x,y);
            	printf("%lld\n",last=fhq[y].sum);
            	rt[i]=merge(merge(x,y),z);
            	break;
        }
    }
    return 0;
}
2021/1/18 20:39
加载中...