TLE10
查看原帖
TLE10
681351
Tobiichi_Origami楼主2022/12/24 18:43
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int INF=0x3f3f3f3f;
struct tree{
    int s[2],fa;
    int val,wei;
    void init(int V,int W,int F){
        val=V;wei=W;
        fa=F;
    }
}t[1000001];
int ans1,ans2;
int root,idx;
void rotate(int u)
{
    int x=t[u].fa,y=t[x].fa;
    int k=(t[x].s[1]==u);
    t[y].s[t[y].s[1]==x]=u;t[u].fa=y;
    t[x].s[k]=t[u].s[k^1];t[t[u].s[k^1]].fa=x;
    t[u].s[k^1]=x;t[x].fa=u;
}
void splay(int u,int k)
{
    while(t[u].fa!=k)
    {
        int x=t[u].fa,y=t[x].fa;
        if(y!=k)
        {
            if((t[x].s[1]==u)^(t[y].s[1]==x))
                rotate(u);
            else rotate(x);
        }
        rotate(u);
    }
    if(!k) root=u;
}
void insert(int val,int wei)
{
    int u=root,fa=0;
    while(u&&t[u].val!=val) fa=u,u=t[u].s[val>t[u].val];
    if(!u)
    {
        u=++idx;
        ans1+=wei,ans2+=val;
        if(fa) t[fa].s[val>t[fa].val]=u;
        t[u].init(val,wei,fa);
    }
    splay(u,0);
}
void find(int val)
{
    int u=root;
    if(!u) return ;
    while(t[u].s[val>t[u].val]&&val!=t[u].val)
        u=t[u].s[val>t[u].val];
    splay(u,0);
}
int pre(int val)
{
    find(val);
    int u=t[root].s[0];
    while(t[u].s[1]) u=t[u].s[1];
    return u;
}
int next(int val)
{
    find(val);
    int u=t[root].s[1];
    while(t[u].s[0]) u=t[u].s[0];
    return u;
}
void remove(int val)
{
    int l=pre(val),r=next(val);
    splay(l,0);splay(r,l);
    t[r].s[0]=0;
}
signed main()
{
    insert(-INF,0);insert(INF,0);
    while(1)
    {
        int op,x,y;
        scanf("%lld",&op);
        if(op==-1) 
        {
            printf("%lld %lld",ans1,ans2);
            return 0;
        }
        else if(op==1)
        {
            scanf("%lld %lld",&x,&y);
            insert(y,x);
        }
        else if(op==3)
        {
            int u=pre(INF);
            if(u!=-INF)
            {
                ans1-=t[u].wei;ans2-=t[u].val;
                remove(t[u].val);
            }
        }
        else
        {
            int u=next(-INF);
            if(u!=INF)
            {
                ans1-=t[u].wei;ans2-=t[u].val;
                remove(t[u].val);
            }
        }
    }
    return 0;
}
2022/12/24 18:43
加载中...