「刷题记录」洛谷 P2073 送花 treap 无指针
看了那么多题解都没做对,结果今早上按自己的思路和模板做了做,然后过了。
:......
平衡树裸题
直接上代码:
#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 国际」许可协议进行许可。
转载时还请标明出处哟!
朝气蓬勃 后生可畏
分类:
刷题记录
Buy me a cup of coffee ☕.
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】