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

看了那么多题解都没做对,结果今早上按自己的思路和模板做了做,然后过了。
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;
}

作者:yifan0305

出处:https://www.cnblogs.com/yifan0305/p/16465302.html

版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。

转载时还请标明出处哟!

posted @   yi_fan0305  阅读(34)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
more_horiz
keyboard_arrow_up light_mode palette
选择主题
点击右上角即可分享
微信分享提示