<题目链接>

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

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

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. POJ 2187 Beauty Contest(凸包+旋转卡壳)

    Description Bessie, Farmer John's prize cow, has just won first place in a bovine beauty contest, ea ...

  2. 在Excel里面,单元格里输入公式后只显示公式本身,不显示结果,怎么办

    这种情况是对Excel进行了设置,设置的就是在单元格中只显示公式,不显示结果,解决的办法有两个: 1 用快捷键CTR+~ 2 点击"公式"选项卡,然后反选里面的"显示公式 ...

  3. 20145214《Java程序设计》课程总结

    20145214<Java程序设计>课程总结 每周读书笔记链接汇总 第一周读书笔记 第二周读书笔记 第三周读书笔记 第四周读书笔记 第五周读书笔记 第六周读书笔记 第七周读书笔记 第八周读 ...

  4. OpenGL ES 2.0 -- 制作 3D 彩色旋转三角形 - 顶点着色器 片元着色器 使用详解

    最近开始关注OpenGL ES 2.0 这是真正意义上的理解的第一个3D程序 , 从零开始学习 . 案例下载地址 : http://download.csdn.net/detail/han120201 ...

  5. SOA架构的理解

    实践论认为:从实践提升到理论,再由理论指导实践,由此向前发展.目前SOA的发展的情况………… 通过不少实践,SOA的模型己经被公认为标准规范,目前是正需要进一步总结上升到理论的时候了. SOA架构的演 ...

  6. IT启示录

    引用电影<夏洛特烦恼>中夏洛的一句话:"一直以来,我根本就不知道自己想要什么".可以说在写这篇博客之前我仍然没有考虑清楚之后的道路,即使早已明确了走游戏开发的道理,却不 ...

  7. 【Linux】- CentOS安装Mysql 5.7

    CentOS7默认数据库是mariadb,而不是mysql.CentOS7的yum源中默认是没有mysql的.所以不能使用yum install直接安装. 下载mysql的repo源 cd /usr/ ...

  8. mstsc远程登录终端超出最大连接数的解决办法

    1,.远程服务器有两个用户登录 2.第三个登录时提示:终端服务器超出了最大允许连接,这种情况怎么解决 A.通过运行命令来解决:运行输入mstsc /admin /v:IP:端口  敲回车来解决,这里的 ...

  9. zk分布锁的java实现

    只做记录,直接上代码 父类: package com.ylcloud.common.lock; import com.alibaba.fastjson.JSON; import org.I0Itec. ...

  10. Kubernetes初探 :总体概述及使用示例

    Kubernetes是Google开源的容器集群管理系统.它构建于docker技术之上,为容器化的应用提供资源调度.部署运行.服务发现.扩容缩容等整一套功能,本质上可看作是基于容器技术的mini-Pa ...