MnZn求助,本地AC luogu全T
查看原帖
MnZn求助,本地AC luogu全T
667381
userLCX楼主2023/12/30 16:14

rt,下了#1的数据,能过,但在洛谷全T了 code:

#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define inl inline
#define endl '\n'
#define gc cin.get
#define pc cout.put
const int N=1e6+5;
const int M=2e8+5;
const int inf=0x3f3f3f3f;
const int mod=997;
const int base=13131;
inl int read(){
    int x=0,f=1;char c=gc();
    while(c<'0'||c>'9'){if(c=='-')f=-1;c=gc();}
    while(c>='0'&&c<='9'){x=(x<<1)+(x<<3)+(c^48);c=gc();}
    return x*f;
}
int n,m,a[N],rt;
struct balanced_tree{
    int siz[N],ls[N],rs[N],rd[N],fa[N];
    inl void pushup(int k){siz[k]=siz[ls[k]]+1+siz[rs[k]];}
    inl void build(int &k,int l,int r){
        if(l>r)return;
        int mid=l+r>>1;k=a[mid];siz[k]=1;rd[k]=rand();
        if(l==r)return;
        build(ls[k],l,mid-1);
        build(rs[k],mid+1,r);
        if(ls[k])fa[ls[k]]=k;
        if(rs[k])fa[rs[k]]=k;
        pushup(k);
    }
    inl void split(int k,int x,int &l,int &r){
        if(!k)return l=r=0,void();
        if(siz[ls[k]]+1<=x){
            l=k;
            split(rs[k],x-siz[ls[k]]-1,rs[k],r);
            if(rs[k])fa[rs[k]]=k;
        }else{
            r=k;
            split(ls[k],x,l,ls[k]);
            if(ls[k])fa[ls[k]]=k;
        }
        pushup(k);
    }
    inl int merge(int x,int y){
        if(!x||!y)return x+y;
        if(rd[x]<rd[y]){
            rs[x]=merge(rs[x],y);
            if(rs[x])fa[rs[x]]=x;
            return pushup(x),x;
        }else{
            ls[y]=merge(x,ls[y]);
            if(ls[y])fa[ls[y]]=y;
            pushup(y);
            return pushup(y),y;
        }
        return -1;
    }
    inl int find(int x){
        int ans=siz[ls[x]];
        while(x){
            if(rs[fa[x]]==x)ans+=siz[ls[fa[x]]]+1;
            x=fa[x];
        }
        return ans+1;
    }
}fhq;
signed main(){
    // freopen("1.in","r",stdin);
    // freopen("1.out","w",stdout);
    ios::sync_with_stdio(false);
    cin.tie(0),cout.tie(0);
    n=read();m=read();
    for(int i=1;i<=n;i++)a[i]=read();
    fhq.build(rt,1,n);
    while(m--){
        string s;cin>>s;
        if(s[0]=='T'){
            int l,r,q,rk=fhq.find(read());
            fhq.split(rt,rk,l,r);
            fhq.split(l,rk-1,l,q);
            rt=fhq.merge(q,fhq.merge(l,r));
        }
        if(s[0]=='B'){
            int l,r,q,rk=fhq.find(read());
            fhq.split(rt,rk,l,r);
            fhq.split(l,rk-1,l,q);
            rt=fhq.merge(fhq.merge(l,r),q);
        }
        if(s[0]=='I'){
            int l,r,p,q,x=fhq.find(read()),y=x+read();
            if(x>y)swap(x,y);
            fhq.split(rt,y,l,r);
            fhq.split(l,y-1,l,q);
            fhq.split(l,x-1,l,p);
            rt=fhq.merge(fhq.merge(l,q),fhq.merge(p,r));
        }
        if(s[0]=='A')
            cout<<fhq.find(read())-1<<endl;
        if(s[0]=='Q'){
            int rk=read(),l,q,r;
            fhq.split(rt,rk,l,r);
            fhq.split(l,rk-1,l,q);
            cout<<q<<endl;
            rt=fhq.merge(fhq.merge(l,q),r);
        }
    }
    return 0;
}

#1 input:

5 9
2 1 5 3 4 
Top 3
Insert 2 0
Ask 4
Bottom 2
Insert 5 -1
Bottom 2
Query 3
Ask 4
Ask 5

#1 output:

4
1
3
1
2023/12/30 16:14
加载中...