求助平衡树,TLE,80pts
查看原帖
求助平衡树,TLE,80pts
394729
Weight_of_the_Soul楼主2023/2/3 22:29
#include<bits/stdc++.h>
using namespace std;
struct fhq{
    int val,key,siz,ch[2];
}t[840010];
int rt,tot,cnt;
int n,minn,add;
void maintain(int x){t[x].siz=t[t[x].ch[0]].siz+t[t[x].ch[1]].siz+1;}
int create(int x)
{
    int u=++tot;
    t[u].siz=1;t[u].ch[0]=t[u].ch[1]=0;
    t[u].val=x;
    t[u].key=rand()*rand()%2147483647;
    return u;
}
void split(int now,int key,int &x,int &y)
{
    if(now==0)
    {
        x=y=0;return ;
    }
    if(t[now].val<=key)
    {
        x=now;split(t[now].ch[1],key,t[x].ch[1],y);
    }
    else
    {
        y=now;split(t[now].ch[0],key,x,t[y].ch[0]);
    }
    maintain(now);
}
int merge(int x,int y)
{
    if(x==0||y==0)
    {
        return x+y;
    }
    if(t[x].key>t[y].key)
    {
        t[x].ch[1]=merge(t[x].ch[1],y);
        maintain(x);
        return x;
    }
    else
    {
        t[y].ch[0]=merge(x,t[y].ch[0]);
        maintain(y);
        return y;
    }
}
int kth(int k)
{
    int u=rt;
    while(1)
    {
        // cout<<t[u].siz<<endl;
        // cout<<t[t[u].ch[1]].siz<<endl;
        // break;
        if(t[t[u].ch[0]].siz>=k)
        {
            u=t[u].ch[0];
        }
        else if(t[t[u].ch[0]].siz+1<k)
        {
            k-=(t[t[u].ch[0]].siz+1);
            u=t[u].ch[1];
        }
        else
        {
            return t[u].val;
        }
    }
}
void del(int k)
{
    
    int x,y;
    split(rt,k-1,x,y);
    rt=y;maintain(rt);
    cnt+=t[x].siz;
}
void insert(int k)
{
    int x,y;
    split(rt,k-1,x,y);
    rt=merge(merge(x,create(k)),y);
}
signed main(){
    srand(time(0));
    cin>>n>>minn;
    for(int i=1;i<=n;i++)
    {
        char op;int k;
        cin>>op>>k;
        if(op=='I')
        {
            if(k>=minn) insert(k-add);
        }
        if(op=='A')
        {
            add+=k;
        }
        if(op=='S')
        {

            add-=k;del(minn-add);
        }
        if(op=='F')
        {
            // cout<<t[rt].siz<<" ";
            if(t[rt].siz<k) cout<<-1<<endl;
            else cout<<kth(t[rt].siz-k+1)+add<<endl;
        }
    }
    cout<<cnt<<endl;
	return 0;
}
2023/2/3 22:29
加载中...