FHQ WA+TLE 20pts 已过普通版 快读 求调
查看原帖
FHQ WA+TLE 20pts 已过普通版 快读 求调
1117784
yeyou26楼主2023/11/30 21:06

FHQ WA+TLE 20pts

已过普通版 快读 求调

如题,蒟蒻调了三个小时没调出来 马蜂正常,跟着董晓老师敲的

#include<bits/stdc++.h>
using namespace std;
#define int long long

void read(long long &ans)
{
    ans=0;
    bool flag=0;
    char ch=getchar();
    if(ch=='-')
    {
        ch=getchar();
        flag=1;
    }
    while(ch<'0' || ch>'9') ch=getchar();
    while(ch>='0' && ch<='9')
    {
        ans=ans*10+(ch^48);
        ch=getchar();
    }
    if(flag) ans=-ans;
}

void write(long long temp)
{
    if(temp<0)
    {
        temp=-temp;
        putchar('-');
    }
    if(temp>=10)
    {
        write(temp/10);
    }
    putchar((temp%10)^48);
}

int n,idx,root,m;
int seed=1;

struct Node
{
    int l;
    int r;
    int value;
    int key;
    int child;
}t[2000005];


int Newnode(int v)
{
    idx++;
    t[idx].value=v;
    t[idx].child=1;
    t[idx].key=(seed*=20070509);
    return idx;
}

void Pushup(int p) {t[p].child=t[t[p].l].child+t[t[p].r].child+1;}

void Split(int p,int v,int &x,int &y)
{
    if(p==0){x=0,y=0;return ;}
    if(t[p].value<=v)
    {
        x=p;
        Split(t[x].r,v,t[x].r,y);
    }
    else
    {
        y=p;
        Split(t[y].l,v,x,t[y].l);
    }
    Pushup(p);
}

int Merge(int x,int y)
{
    if(!x || !y) return x+y;
    if(t[x].key<t[y].key)
    {
        t[x].r=Merge(t[x].r,y);
        Pushup(x);
        return x;
    }
    else
    {
        t[y].l=Merge(x,t[y].l);
        Pushup(y);
        return y;
    }
}

void Insert(int v)
{
    int z=Newnode(v);
    int x,y;
    Split(root,v,x,y);
    root=Merge(Merge(x,z),y);
}

void Delete_all(int v)
{
    int x,y,z;
    Split(root,v,x,y);
    Split(x,v-1,x,z);
    root=Merge(x,y);
}

void Delete_one(int v)
{
    int x,y,z;
    Split(root,v,x,z);
    Split(x,v-1,x,y);
    y=Merge(t[y].l,t[y].r);
    root=Merge(Merge(x,y),z);
}

int Get_k(int p,int k)
{
    if(k==t[t[p].l].child+1) return p;
    if(k>t[t[p].l].child+1) return Get_k(t[p].r,k-t[t[p].l].child-1 );
    return Get_k(t[p].l,k);
}

int Get_pre(int v)
{
    int x,y;
    Split(root,v-1,x,y);
    int ans=t[Get_k(x,t[x].child)].value;
    root=Merge(x,y);
    return ans;
}

int Get_post(int v)
{
    int x,y;
    Split(root,v,x,y);
    int ans=t[Get_k(y,1)].value;
    root=Merge(x,y);
    return ans;
}

int Get_rank(int v)
{
    if(v==0) return 1;
    int x,y;
    Split(root,v-1,x,y);
    int ans=t[x].child+1;
    root=Merge(x,y);
    return ans;
}

int Get_nth_value(int k)
{
    return t[Get_k(root,k)].value;
}

void solve1()
{
    scanf("%lld",&n);
    for(int i=1;i<=n;i++)
    {
        int opt,x;
        scanf("%lld%lld",&opt,&x);
        switch(opt)
        {
            case 1:{Insert(x);break;};
            case 2:{Delete_one(x);break;}
            case 3:{printf("%lld\n",Get_rank(x));break;}
            case 4:{printf("%lld\n",Get_nth_value(x));break;}
            case 5:{printf("%lld\n",Get_pre(x));break;}
            case 6:{printf("%lld\n",Get_post(x));break;}
        }
    }
}

int lst,ans;
void solve2()
{
    read(n);
    read(m);
    for(int i=1;i<=n;i++)
    {
        int x;
        read(x);
        Insert(x);
    }
    for(int i=1;i<=m;i++)
    {
        int x,opt;
        read(opt);
        read(x);
        switch(opt)
        {
            case 1:{Insert(x^lst);break;};
            case 2:{Delete_one(x^lst);break;}
            case 3:{lst=Get_rank(x);ans^=lst;write(ans);break;}
            case 4:{lst=Get_nth_value(x);ans^=lst;write(ans);break;}
            case 5:{lst=Get_pre(x);ans^=lst;write(ans);break;}
            case 6:{lst=Get_post(x);ans^=lst;write(ans);break;}
        }
    }
}

signed main()
{
    srand(time(0));
//    solve1();
    solve2();
    return 0;
}

2023/11/30 21:06
加载中...