Loading

「刷题记录」洛谷 P2073 送花 treap 无指针

看了那么多题解都没做对,结果今早上按自己的思路和模板做了做,然后过了。
\(\text{me}\) :......
平衡树裸题
直接上代码:

#include<bits/stdc++.h>
#define rint register int
typedef long long ll;
using namespace std;
inline ll read()
{
    ll x=0;
    bool fg=false;
    char ch=getchar();
    while(ch<'0'||ch>'9')
    {
        if(ch=='-')    fg=true;
        ch=getchar();
    }
    while(ch>='0'&&ch<='9')
    {
        x=(x<<3)+(x<<1)+(ch^48);
        ch=getchar();
    }
    return fg?~x+1:x;
}
const int N=1e5+10;
int cnt,rt;
int ch[N][2];
ll ml_sum,jg_sum;
ll ml[N],jg[N],pri[N];
//ml 美丽值 jg 价格 
int add(ll w,ll c)
{
    ml[++cnt]=w;
    jg[cnt]=c;
    ml_sum+=w;//记录总和 
    jg_sum+=c;
    pri[cnt]=rand();
    return cnt;
}
void spin(int &id,int d)
{
    int temp=ch[id][d^1];
    ch[id][d^1]=ch[temp][d];
    ch[temp][d]=id;
    id=temp;
}
void insert(int &id,ll w,ll c)
{
    if(!id)
    {
        id=add(w,c);
        return;
    }
    if(jg[id]==c)    return;
    int d=c<jg[id]?0:1;
    insert(ch[id][d],w,c);
    if(pri[ch[id][d]]>pri[id])
        spin(id,d^1);
}
int find(bool f)
{
    int id=rt;
    if(f)    while(ch[id][1])    id=ch[id][1];//找最大值 
    else
    {
        while(ch[id][0])    id=ch[id][0];//找最小值 
    }
    return id;
}
void del(int &id,ll c)
{
    if(!id)    return;
    if(jg[id]==c)
    {
        if(ch[id][0]||ch[id][1])
        {
            int d=pri[ch[id][0]]>pri[ch[id][1]]?1:0;
            spin(id,d);
            del(ch[id][d],c);
        }
        else
        {
            jg_sum-=jg[id],jg[id]=0;//更新总和 
            ml_sum-=ml[id],ml[id]=0;
            pri[id]=-1;
            id=0;
        }
    }
    else
    {
        int d=c<jg[id]?0:1;
        del(ch[id][d],c);
    }
}
int main()
{
    int op=read();
    while(op!=-1)
    {
        if(op==1)
        {
            ll w=read(),c=read();
            insert(rt,w,c);
        }
        if(op==3)
        {
            int x=find(0);
            del(rt,jg[x]);
        }
        if(op==2)
        {
            int x=find(1);
            del(rt,jg[x]);
        }
        op=read();
    }
    printf("%lld %lld\n",ml_sum,jg_sum);
    return 0;
}
posted @ 2022-07-11 09:05  yi_fan0305  阅读(40)  评论(0)    收藏  举报