P3391求助,本地跑的飞快但是提上去6个T

P3391 【模板】文艺平衡树

Lidozs55 @ 2021-04-29 19:28:27

rt

下了第一个测试数据,本地跑不到0.2s,提上去直接T,裂开,有谁能帮帮忙吗

6个T的评测 record/50087500

代码如下

#include<cstdio>
#include<algorithm>
using namespace std;
int n,m,tot,rt,siz[1000005],f[1000005],tag[1000005],num[1000005],s[1000005][2],ans[1000005];
inline void down(int k){
    if(tag[k]){
        tag[s[k][0]]^=1,tag[s[k][1]]^=1,tag[k]=0;
        swap(s[k][0],s[k][1]);
    }
}
inline void rotate(int k){
    int x=f[k],y=f[x],side=(k==s[x][1]);
    s[y][s[y][1]==x]=k,f[k]=y;
    s[x][side]=s[k][side^1];
    f[s[k][side^1]]=s[k][side^1]=x,f[x]=k;
    siz[x]=siz[s[x][1]]+siz[s[x][0]]+1;
    siz[k]=siz[s[k][1]]+siz[s[k][0]]+1;
}
inline void splay(int k,int pos){
    int x,y;
    while(f[k]!=pos){
        x=f[k],y=f[x];
        if(y!=pos)(k==s[x][0])^(x==s[y][0])?rotate(k):rotate(x);
        rotate(k);
    }
    if(!pos)rt=k;
}
inline int find(int k){
    int u=rt;
    while(1){
        down(u);
        if(siz[s[u][0]]>=k)u=s[u][0];
        else if(siz[s[u][0]]+2>k)return u;
        else k-=siz[s[u][0]]+1,u=s[u][1];
    }
}
int build(int l,int r,int k){
    if(l>r)return 0;
    int pos=(l+r)>>1;
    f[pos]=k,num[pos]=ans[pos],s[pos][0]=build(l,pos-1,pos),s[pos][1]=build(pos+1,r,pos);
    siz[pos]=siz[s[pos][0]]+siz[s[pos][1]]+1;
    return pos;
}
void update(int k){
    if(!k)return;
    down(k),update(s[k][0]),ans[++tot]=num[k],update(s[k][1]);
}
int main(){
    scanf("%d%d",&n,&m);
    for(int i=0;i<n+2;i++)ans[i+1]=i;
    rt=build(1,n+2,0);
    for(int i=0,x,y;i<m;++i)scanf("%d%d",&x,&y),x=find(x),y=find(y+2),splay(x,0),splay(y,x),tag[s[s[rt][1]][0]]^=1;
    update(rt);
    for(int i=1;i<=n;i++)printf("%d ",ans[i+1]);
    return 0;
}

by Lidozs55 @ 2021-04-29 19:30:41

附:洛咕IDE也是T 可能是系统的问题吗


by chen_qian @ 2021-04-29 19:49:32

@Lidozs55 可能是环境的问题,可以检查一下自己代码有没有不规范的地方


|