[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 ...
随机推荐
- LintCode-212.空格替换
空格替换 设计一种方法,将一个字符串中的所有空格替换成 %20 .你可以假设该字符串有足够的空间来加入新的字符,且你得到的是"真实的"字符长度. 你的程序还需要返回被替换后的字符串 ...
- Oracle AWR日志使用
SQL>@?/rdbms/admin/awrrpt.sql Specify the Report Type ~~~~~~~~~~~~~~~~~~~~~~~ Would you like an H ...
- C# lamda表达式
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...
- UML图之协作图
创建方法: 1,new----collaboration diagram 2,根据序列图按F5转换 增加对象链接(图2-4-4) (1) 选择Object Link 工具栏按钮. (2) 单击要 ...
- Tomcat 设计模式分析
门面设计模式 门面设计模式在 Tomcat 中有多处使用,在 Request 和 Response 对象封装中.Standard Wrapper 到 ServletConfig 封装中.Applica ...
- set(gcf,'DoubleBuffer','on')
设置的目的是为了防止在不断循环画动画的时候会产生闪烁的现象,而这样便不会了.在动画的制作比较常用.
- 只要访问的地址匹配cookie的地址时候 发送request请求时候 会携带上该cookie
只要访问的地址匹配cookie的地址时候 发送request请求时候 会携带上该cookie
- Python 日志输出中添加上下文信息
Python日志输出中添加上下文信息 除了传递给日志记录函数的参数(如msg)外,有时候我们还想在日志输出中包含一些额外的上下文信息.比如,在一个网络应用中,可能希望在日志中记录客户端的特定信息,如: ...
- Java的第一个程序-Hello, World !
学了一个月的Java,现在总结一下,就算复习了. 一.安装Java环境 这个没啥好说的. 1. 官网下载JDK安装 2. 配置环境变量.注意的是:环境变量配置好以后,如果cmd中运行 java 命令没 ...
- CentOS httpd服务(Apache)
1.从ISO镜像安装,Apache 服务的软件包名称为 httpd #检查源配置[root@localhost media]# cat /etc/yum.repos.d/CentOS-Media.re ...