90分splay求助,#4WA

P3586 [POI2015] LOG

TH讠NK @ 2019-08-16 15:48:00

RT

糊了一颗 splay ,自认为没什么问题 ,结果 #4 WAQAQ ,求各位大佬帮忙康康

#include <bits/stdc++.h>
using namespace std;
#define il inline
#define ll long long
#define ls t[p].ch[0]
#define rs t[p].ch[1]
#define get(x) (t[t[x].fa].ch[1]==x)
const int maxn=2000005, inf=1<<30;
int tot,root,a[maxn];
il int read(){
    int x=0,f=1; char c=getchar();
    while(c<'0' || c>'9') {if(c=='-') f=-1; c=getchar();}
    while(c>='0' && c<='9') x=x*10+c-48, c=getchar();
    return x*f;
}
struct tree{
    int ch[2],size,cnt,fa,w;
    ll sum;
} t[maxn];
il void pushup(int p){
    t[p].size=t[ls].size+t[rs].size+t[p].cnt;
    t[p].sum=t[ls].sum*(ls!=1)+t[rs].sum*(rs!=2)+t[p].cnt*t[p].w;
}
il void rotate(int x){
    int y=t[x].fa, yson=get(x);
    int z=t[x].ch[yson^1], rt=t[y].fa;
    t[x].fa=rt, t[rt].ch[get(y)]=x;
    t[y].fa=x, t[x].ch[yson^1]=y;
    t[z].fa=y, t[y].ch[yson]=z;
    pushup(y), pushup(x);
}
il void splay(int x,int to){
    while(t[x].fa!=to){
        int y=t[x].fa;
        if(t[y].fa!=to) get(x)==get(y)? rotate(y):rotate(x);
        rotate(x);
    }
    if(to==0) root=x;
}
il void find(int w){
    int p=root;
    while(t[p].w!=w && t[p].ch[w>t[p].w]) p=t[p].ch[w>t[p].w];
    splay(p,0);
}
il int Next(int w,int d){
    find(w);
    int p=root;
    if(t[p].w!=w && (t[p].w>w)==d) return p;
    p=t[p].ch[d]; d^=1;
    while(t[p].ch[d]) p=t[p].ch[d];
    splay(p,0);
    return p;
}
il void add(int w){
    int p=root,f=0;
    while(p && t[p].w!=w) f=p, p=t[p].ch[w>t[p].w];
    if(p) t[p].cnt++;
    else{
        p=++tot;
        if(f) t[f].ch[w>t[f].w]=p;
        t[p].size=t[p].cnt=1;
        t[p].ch[0]=t[p].ch[1]=0;
        t[p].fa=f, t[p].w=t[p].sum=w;
    }
    splay(p,0);
}
il void del(int w){
    int lst=Next(w,0), nxt=Next(w,1);
    splay(lst,0), splay(nxt,lst);
    int p=t[nxt].ch[0];
    if(t[p].cnt>1) t[p].cnt--, splay(p,0);
    else t[nxt].ch[0]=0;
}
il void ask(int c,int s){
    int x=Next(s,0);
    splay(x,0);
    int y=t[x].ch[1];
    ll sum=t[x].sum*(x!=1)-t[y].sum*(y!=2);
    if(c-t[y].size+1<=0 || sum>=1ll*(c-t[y].size+1)*s) printf("TAK\n");
    else printf("NIE\n");
}
int main(){
    int n,m,x,y;
    char opt[2];
    add(-inf), add(inf);
    n=read(), m=read();
    for(int i=1;i<=n;i++) a[i]=0, add(0);
    while(m--){
        scanf("%s",opt);
        x=read(), y=read();
        if(opt[0]=='U'){
            del(a[x]);
            a[x]=y;
            add(y);
        }
        else ask(x,y);
    }
    return 0;
}

by Vanity_ @ 2019-08-16 18:44:23


|