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 可能是环境的问题,可以检查一下自己代码有没有不规范的地方