logicYZL @ 2019-09-16 22:35:37
一份相同的代码
BZOJ: AC
LOJ:
c++ RE+TLE
c++11 RE+TLE
c++11(NOI) AC
luogu:至今尚未AC,疯狂RE+TLE(c++,c++11,c++14,c++17)
以下是代码,哪位好心大佬帮我看一看 (数据下载下来能过,在线IDE也没问题)
#include<cstdio>
#include<algorithm>
using namespace std;
const int N=2e6+5;
struct node{
int val,cnt,ch[2],sz,f,tag;
}t[N];
int tot,rt,n,m;
inline void pushup(int x) {t[x].sz=t[t[x].ch[0]].sz+t[t[x].ch[1]].sz+t[x].cnt;}
inline int get(int x) {return x==t[t[x].f].ch[1];}
inline void pushdown(int x)
{
if(t[x].tag)
{
t[t[x].ch[0]].tag^=1,t[t[x].ch[1]].tag^=1;
swap(t[x].ch[0],t[x].ch[1]),t[x].tag=0;
}
}
inline void rotate(int x)
{
int y=t[x].f,z=t[y].f,k=get(x);
if(z)t[z].ch[get(y)]=x;
t[x].f=z;
t[y].ch[k]=t[x].ch[k^1],t[t[x].ch[k^1]].f=y;
t[x].ch[k^1]=y,t[y].f=x;
pushup(y),pushup(x);
}
inline void splay(int x,int s)
{
while(t[x].f!=s)
{
int y=t[x].f,z=t[y].f;
if(z!=s&&(x==t[y].ch[0])==(y==t[z].ch[0])) rotate(y);
rotate(x);
}
if(!s) rt=x;
}
inline void insert(int x)
{
int u=rt,f=0;
while(t[u].val!=x && u)
{
f=u;
u=t[u].ch[x>t[u].val];
}
if(u) ++t[u].cnt;
else
{
u=++tot;
if(f) t[f].ch[x>t[f].val]=u;
t[u].ch[0]=t[u].ch[1]=0;
t[u].sz=t[u].cnt=1;
t[u].val=x,t[u].f=f;
}
splay(u,0);
}
inline int kth(int x)
{
int u=rt;
while(1)
{
pushdown(u);
int v=t[u].ch[0];
if(x>t[u].cnt+t[v].sz)
{
x-=t[u].cnt+t[v].sz;
u=t[u].ch[1];
}
else if(x<=t[v].sz && v) u=v;
else return u;
}
}
inline int Reverse(int l,int r)
{
int x=kth(l),y=kth(r+2);
splay(x,0),splay(y,x);
t[t[y].ch[0]].tag^=1;
}
inline void print(int x)
{
pushdown(x);
if(t[x].ch[0]) print(t[x].ch[0]);
if(t[x].val && t[x].val<=n) printf("%d ",t[x].val);
if(t[x].ch[1]) print(t[x].ch[1]);
}
int main()
{
// freopen("testdata.in","r",stdin);
// freopen("ans.out","w",stdout);
scanf("%d%d",&n,&m);
for(int i=0;i<=n+1;++i) insert(i);
for(int i=1;i<=m;++i)
{
int a,b;scanf("%d%d",&a,&b);
if(a<=b)Reverse(a,b);
}
print(rt);
return 0;
}
by pmt2018 @ 2019-09-16 22:59:27
@logicYZL 你尝试insert一个INF和-INF节点应该就不会re了吧