<题目链接>

很容易想到的平衡树,加个维护区间和。

只需要插入和删除操作即可。

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] 送花的更多相关文章

  1. 【题解】Luogu P2073 送花

    原题传送门 这题需要用到Splay 我们用一棵splay维护金钱 考虑c<=1000000 我们珂以把每种价格现在对应的美丽值存在一个a数组中 这样讲有珂能不太清楚qaq,还是对着操作一个一个讲 ...

  2. luogu P2073 送花 线段树

    思路&心路 一眼认定沙比提 写的比较慢,写了1小时吧 开心的交上去 卧槽,只有20? 不服不服,拿着题解的代码去对拍 Emma,<100没问题 100000数据错了,还只是错了一个数据 ...

  3. Luogu P2073 送花 set

    这题...一眼set...但是打了一会儿.. 记录一下每个价格对应的美丽度,顺便充当vis数组,如果美丽度不为0,说明set里已经有了... 删除好说,删*s.begin()和*--s.end()就好 ...

  4. Luogu P2073 送花

    权值线段树的模板题 然而AC后才发现,可以用\(\tt{set}\)水过-- 权值线段树类似于用线段树来实现平衡树的一些操作,代码实现还是比较方便的 #include<iostream> ...

  5. Splay详解

    平衡树实际很简单的 以下讲解都以Luogu P3369 [模板]普通平衡树为例 我不会带指针的Splay,所以我就写非指针型的Splay Splay是基于二叉查找树(bst)实现的 什么是二叉查找树呢 ...

  6. [Luogu] 送花

    https://www.luogu.org/problemnew/show/2073 自己yy,明显错 #include <bits/stdc++.h> using namespace s ...

  7. Luogu 魔法学院杯-第二弹(萌新的第一法blog)

    虽然有点久远  还是放一下吧. 传送门:https://www.luogu.org/contest/show?tid=754 第一题  沉迷游戏,伤感情 #include <queue> ...

  8. luogu p1268 树的重量——构造,真正考验编程能力

    题目链接:http://www.luogu.org/problem/show?pid=1268#sub -------- 这道题费了我不少心思= =其实思路和标称毫无差别,但是由于不习惯ACM风格的题 ...

  9. ural 2073. Log Files

    2073. Log Files Time limit: 1.0 secondMemory limit: 64 MB Nikolay has decided to become the best pro ...

随机推荐

  1. c++设计模式----装饰模式

    前言 在实际开发时,你有没有碰到过这种问题:开发一个类,封装了一个对象的核心操作,而这些操作就是客户使用该类时都会去调用的操作:而有一些非核心的操作,可能会使用,也可能不会使用:现在该怎么办呢? 将这 ...

  2. headers的描述

    Cache-Control 作用: 这个是非常重要的规则. 这个用来指定Response-Request遵循的缓存机制.各个指令含义如下 Cache-Control:Public   可以被任何缓存所 ...

  3. node中的path.resolve

    path.resolve([arg1,arg2,...])根据参数的不同,返回值存在两种情况. 以下为参数的两种情况: 1.每个参数都不带'/',比如path.resolve(),或者path.res ...

  4. VS升级后的配置问题

    当vs升级到更新的版本后,运行原来无误的程序会出现一系列问题. 例如:打不开iostream文件,lib文件,系统找不到文件等等 出现这类问题的原因是,编译环境的include path和librar ...

  5. chrome extensions & debug

    chrome extensions & debug debug background.js debug popup.js debug content_script.js chrome.stor ...

  6. delphi 更改DBGrid 颜色技巧

    1.根据条件更改某一单元格的颜色 procedure TMainFrm.First_DGDrawColumnCell(Sender: TObject; const Rect: TRect; DataC ...

  7. [洛谷P5068][Ynoi2015]我回来了

    题目大意:给你一张$n(n\leqslant10^3)$个点$m(m\leqslant10^5)$个点的无向无权图,多组询问,每次询问给你一些二元组$(x_i,y_i)$,求有多少个$u$于至少一个二 ...

  8. 如何提升集群资源利用率? 阿里容器调度系统Sigma 深入解析

    阿里妹导读:为了保证系统的在线交易服务顺利运转,最初几年,阿里都是在双11大促来临之前大量采购机器储备计算资源,导致了双11之后资源大量闲置点现象.是否能把计算任务与在线服务进行混合部署,在现有弹性资 ...

  9. POJ3057:Evacuation——题解

    http://poj.org/problem?id=3057 题目大意: .为人,D为门,X为障碍,门每秒只能出去一个人,问多少秒出光. 如果无法出光输出impossible. ——————————— ...

  10. BZOJ3864 & HDU4899:Hero meet devil——题解

    https://www.lydsy.com/JudgeOnline/problem.php?id=3864 http://acm.hdu.edu.cn/showproblem.php?pid=4899 ...