玄学错误求助

P3391 【模板】文艺平衡树

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了吧


|