[Luogu 2073] 送花
<题目链接>
很容易想到的平衡树,加个维护区间和。
只需要插入和删除操作即可。
kth其实都不用的,最小和最大可以从根节点log n一直向左/一直向右跑到叶子节点而求得。
记得每插入完一个点一定要更新区间和!!更新区间和!!更新区间和!!
我就因为没更新,导致出来答案都是随机的,有时候对,有时候不对。
关于平衡树不多说啦,关于平衡树(Treap)的教程请看这里。
上代码。
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <ctime>
const int MAXN=100010;
int n,w,x;
class Treap
{
public:
Treap(void)
{
rt=cnt=0;
memset(a,0,sizeof a);
memset(s,0,sizeof s);
}
void Insert(int w,int x)
{
_Insert(rt,w,x);
}
void Delete(bool l)
{
int i=Find(rt,l);
_Delete(rt,s[i].w,s[i].v);
}
void Answer(void)
{
printf("%d %d",s[rt].bty,s[rt].val);
}
private:
bool a[MAXN];
int rt,cnt;
struct node
{
int l,r,w,v,p,bty,val;
}s[MAXN];
int Random(void)
{
int x;
while(a[x=rand()%MAXN]);
a[x]=1;
return x;
}
void Update(int i)
{
s[i].bty=s[s[i].l].bty+s[s[i].r].bty+s[i].w;
s[i].val=s[s[i].l].val+s[s[i].r].val+s[i].v;
}
void L_Rotate(int &i)
{
int t=s[i].r;
s[i].r=s[t].l,s[t].l=i;
Update(i),Update(t),i=t;
}
void R_Rotate(int &i)
{
int t=s[i].l;
s[i].l=s[t].r,s[t].r=i;
Update(i),Update(t),i=t;
}
void _Insert(int &i,int w,int x)
{
if(!i)
{
s[i=++cnt].bty=s[i].w=w,s[i].val=s[i].v=x;
s[i].p=Random();
return;
}
if(x==s[i].v)
return;
if(x<s[i].v)
{
_Insert(s[i].l,w,x);
if(s[s[i].l].p>s[i].p)
R_Rotate(i);
}
else
{
_Insert(s[i].r,w,x);
if(s[s[i].r].p>s[i].p)
L_Rotate(i);
}
Update(i);//一定要更新!!
}
void _Delete(int &i,int w,int x)
{
if(!i)
return;
if(x==s[i].v)
{
if(!s[i].l || !s[i].r)
i=s[i].l | s[i].r;
else if(s[s[i].l].p>s[s[i].r].p)
R_Rotate(i),_Delete(i,w,x);
else
L_Rotate(i),_Delete(i,w,x);
return;
}
s[i].bty-=w,s[i].val-=x;
if(x<s[i].v)
_Delete(s[i].l,w,x);
else
_Delete(s[i].r,w,x);
}
int Find(int i,bool l)
{
if(l)
while(s[i].l)
i=s[i].l;
else
while(s[i].r)
i=s[i].r;
return i;
}
}T;
int main(int argc,char *argv[])
{
srand((unsigned)time(NULL));
while(~scanf("%d",&n) && ~n)
switch(n)
{
case 1:
scanf("%d %d",&w,&x);
T.Insert(w,x);
break;
case 2:
T.Delete(0);
break;
case 3:
T.Delete(1);
break;
}
T.Answer();
return 0;
}
谢谢阅读
[Luogu 2073] 送花的更多相关文章
- 【题解】Luogu P2073 送花
原题传送门 这题需要用到Splay 我们用一棵splay维护金钱 考虑c<=1000000 我们珂以把每种价格现在对应的美丽值存在一个a数组中 这样讲有珂能不太清楚qaq,还是对着操作一个一个讲 ...
- luogu P2073 送花 线段树
思路&心路 一眼认定沙比提 写的比较慢,写了1小时吧 开心的交上去 卧槽,只有20? 不服不服,拿着题解的代码去对拍 Emma,<100没问题 100000数据错了,还只是错了一个数据 ...
- Luogu P2073 送花 set
这题...一眼set...但是打了一会儿.. 记录一下每个价格对应的美丽度,顺便充当vis数组,如果美丽度不为0,说明set里已经有了... 删除好说,删*s.begin()和*--s.end()就好 ...
- Luogu P2073 送花
权值线段树的模板题 然而AC后才发现,可以用\(\tt{set}\)水过-- 权值线段树类似于用线段树来实现平衡树的一些操作,代码实现还是比较方便的 #include<iostream> ...
- Splay详解
平衡树实际很简单的 以下讲解都以Luogu P3369 [模板]普通平衡树为例 我不会带指针的Splay,所以我就写非指针型的Splay Splay是基于二叉查找树(bst)实现的 什么是二叉查找树呢 ...
- [Luogu] 送花
https://www.luogu.org/problemnew/show/2073 自己yy,明显错 #include <bits/stdc++.h> using namespace s ...
- Luogu 魔法学院杯-第二弹(萌新的第一法blog)
虽然有点久远 还是放一下吧. 传送门:https://www.luogu.org/contest/show?tid=754 第一题 沉迷游戏,伤感情 #include <queue> ...
- luogu p1268 树的重量——构造,真正考验编程能力
题目链接:http://www.luogu.org/problem/show?pid=1268#sub -------- 这道题费了我不少心思= =其实思路和标称毫无差别,但是由于不习惯ACM风格的题 ...
- ural 2073. Log Files
2073. Log Files Time limit: 1.0 secondMemory limit: 64 MB Nikolay has decided to become the best pro ...
随机推荐
- “Hello World!团队”Alpha发布—视频链接+文案+美工
视频链接:http://v.youku.com/v_show/id_XMzEyNjc2MTAyOA==.html?sharefrom=iphone&sharekey=5378037f8b710 ...
- freefcw/hustoj Install Guide
First of all, this version hustoj is a skin and improved for https://code.google.com/p/hustoj/. So t ...
- 第三章——供机器读取的数据(XML)
本书使用的文件.代码:https://github.com/huangtao36/data_wrangling 机器可读(machine readable)文件格式: 1.逗号分隔值(Comma-Se ...
- 【week6】用户数
小组名称:nice! 小组成员:李权 于淼 杨柳 刘芳芳 项目内容:约跑app alpha发布48小时以后用户数如何,是否达到预期目标,为什么,是否需要改进,如何改进(或理性估算). 首先我们的app ...
- 单点登录Windows实现
Windows实现步骤: server.xml修改方式 hosts修改方式 CAS客户端配置 CAS配置filter.txt内容如下: <!-- ======================== ...
- hdu 1848(Fibonacci again and again)(SG博弈)
Fibonacci again and again Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Jav ...
- IO模式
二 IO模式 刚才说了,对于一次IO访问(以read举例),数据会先被拷贝到操作系统内核的缓冲区中,然后才会从操作系统内核的缓冲区拷贝到应用程序的地址空间.所以说,当一个read操作发生时,它会经历两 ...
- CentOS 磁盘阵列(raid10)
1.通过mdadm命令进行磁盘阵列部署 mdadm是multiple devices admin的简称,它是Linux下的一款标准的软件 RAID 管理工具 如果没有mdadm命令,通过yum安装一下 ...
- poj3207 Ikki's Story IV - Panda's Trick 2-sat问题
---题面--- 题意:给定一个圈,m条边(给定),边可以通过外面连,也可以通过里面连,问连完这m条边后,是否可以做到边两两不相交 题解: 将连里面和连外面分别当做一种决策(即每条边都是决策点), 如 ...
- [IOI2007]Miners 矿工配餐
link 其实就是一个比较简单的$IOI$题.简单$dp$就行,设$5$维$dp$即可 最后在滚动一下,判一下可行性即可. #include<iostream> #include<c ...