【BZOJ2333】棘手的操作(左偏树,STL)
【BZOJ2333】棘手的操作(左偏树,STL)
题面
题解
正如这题的题号
我只能\(2333\)
神TM棘手的题目。。。
前面的单点/联通块操作
很显然是一个左偏树+标记
(确实很显然,只是写死人。。。)
然后对于全局的最大值而言
搞一个\(multi\)来水
看起来真的简单。。
写起来真的想死。。。
记住:要特判一下已经联通的块就不要再去\(Merge\)了
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<set>
#include<map>
#include<vector>
#include<queue>
using namespace std;
#define MAX 300010
inline int read()
{
int x=0,t=1;char ch=getchar();
while((ch<'0'||ch>'9')&&ch!='-')ch=getchar();
if(ch=='-')t=-1,ch=getchar();
while(ch<='9'&&ch>='0')x=x*10+ch-48,ch=getchar();
return x*t;
}
int n;
multiset<int> S;
struct Node
{
int ls,rs,ff;
int v,dis;
int lz;
}t[MAX];
int Lazy,root;
int getf(int x){while(t[x].ff)x=t[x].ff;return x;}
void putlazy(int x,int w)
{
t[x].v+=w;
t[x].lz+=w;
}
void pushdown(int x)
{
if(!t[x].lz)return;
if(t[x].ls)putlazy(t[x].ls,t[x].lz);
if(t[x].rs)putlazy(t[x].rs,t[x].lz);
t[x].lz=0;
}
int Merge(int r1,int r2)
{
if(!r1||!r2)return r1+r2;
pushdown(r1);pushdown(r2);
if(t[r1].v<t[r2].v)swap(r1,r2);
t[r1].rs=Merge(t[r1].rs,r2);
t[t[r1].rs].ff=r1;
if(t[t[r1].ls].dis<t[t[r1].rs].dis)swap(t[r1].ls,t[r1].rs);
t[r1].dis=t[t[r1].rs].dis+1;
return r1;
}
void Update(int x)
{
if(!x)return;
if(t[t[x].ls].dis<t[t[x].rs].dis)swap(t[x].ls,t[x].rs);
t[x].dis=t[t[x].rs].dis+1;
Update(t[x].ff);
}
void Alldown(int x)
{
if(t[x].ff)Alldown(t[x].ff);
pushdown(x);
}
void Del(int x)
{
Alldown(x);
t[t[x].ls].ff=t[t[x].rs].ff=0;
if(t[t[x].ff].rs==x)t[t[x].ff].rs=0;
else t[t[x].ff].ls=0;
int rtt=getf(t[x].ff);
Merge(rtt,Merge(t[x].ls,t[x].rs));
Update(t[x].ff);
t[x].ff=t[x].ls=t[x].rs=0;
}
void Plus(int x,int w)//单点修改
{
int rtt=getf(x);
if(!t[x].ff)
{
S.erase(S.find(t[x].v));
t[t[x].ls].ff=t[t[x].rs].ff=0;
pushdown(x),rtt=Merge(t[x].ls,t[x].rs);
t[x].ff=t[x].ls=t[x].rs=0;
}
else Del(x),S.erase(S.find(t[rtt].v));
t[x].v+=w;
int gg=Merge(x,rtt);
S.insert(t[gg].v);
}
void AllPlus(int x,int w)
{
x=getf(x);
S.erase(S.find(t[x].v));
putlazy(x,w);
S.insert(t[x].v);
}
int main()
{
n=read();
for(int i=1;i<=n;++i)t[i].v=read(),S.insert(t[i].v);
int Q=read();
char ch[5];
while(Q--)
{
scanf("%s",ch);
if(ch[0]=='A')
{
if(ch[1]=='1')
{
int x=read(),v=read();
Plus(x,v);
}
else if(ch[1]=='2')
{
int x=read(),v=read();
AllPlus(x,v);
}
else Lazy+=read();
}
else if(ch[0]=='F')
{
if(ch[1]=='1')
{
int x=read();
Alldown(x);
printf("%d\n",t[x].v+Lazy);
}
else if(ch[1]=='2')
{
int x=read();
x=getf(x);
printf("%d\n",t[x].v+Lazy);
}
else printf("%d\n",*--S.end()+Lazy);
}
else
{
int x=read(),y=read();
x=getf(x),y=getf(y);
if(x==y)continue;
int kk=Merge(x,y);
S.erase(S.find(kk==x?t[y].v:t[x].v));
}
}
return 0;
}
【BZOJ2333】棘手的操作(左偏树,STL)的更多相关文章
- 洛谷P3273 [SCOI2011] 棘手的操作 [左偏树]
题目传送门 棘手的操作 题目描述 有N个节点,标号从1到N,这N个节点一开始相互不连通.第i个节点的初始权值为a[i],接下来有如下一些操作: U x y: 加一条边,连接第x个节点和第y个节点 A1 ...
- 洛谷.3273.[SCOI2011]棘手的操作(左偏树)
题目链接 还是80分,不是很懂. /* 七个操作(用左偏树)(t2表示第二棵子树): 1.合并:直接合并(需要将一个t2中原有的根节点删掉) 2.单点加:把这个点从它的堆里删了,加了再插入回去(有负数 ...
- 左偏树 / 非旋转treap学习笔记
背景 非旋转treap真的好久没有用过了... 左偏树由于之前学的时候没有写学习笔记, 学得也并不牢固. 所以打算写这么一篇学习笔记, 讲讲左偏树和非旋转treap. 左偏树 定义 左偏树(Lefti ...
- BZOJ2333 [SCOI2011]棘手的操作 堆 左偏树 可并堆
欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ2333 题意概括 有N个节点,标号从1到N,这N个节点一开始相互不连通.第i个节点的初始权值为a[i ...
- 【BZOJ 2333 】[SCOI2011]棘手的操作(离线+线段树|可并堆-左偏树)
2333: [SCOI2011]棘手的操作 Description 有N个节点,标号从1到N,这N个节点一开始相互不连通.第i个节点的初始权值为a[i],接下来有如下一些操作: U x y: 加一条边 ...
- P3378 【模板】堆 (内含左偏树实现)
P3378 [模板]堆 题解 其实就是一个小根堆啦,STL就可以解决,但是拥有闲情雅致的我学习了Jelly_Goat的左偏树,增加了代码长度,妙啊 Solution 1 STL STL 里面prior ...
- 洛谷P3377 【模板】左偏树(可并堆) 题解
作者:zifeiy 标签:左偏树 这篇随笔需要你在之前掌握 堆 和 二叉树 的相关知识点. 堆支持在 \(O(\log n)\) 的时间内进行插入元素.查询最值和删除最值的操作.在这里,如果最值是最小 ...
- 【bzoj2809】[Apio2012]dispatching 左偏树
2016-05-31 15:56:57 题目:http://www.lydsy.com/JudgeOnline/problem.php?id=2809 直观的思想是当领导力确定时,尽量选择薪水少的- ...
- 左偏树(Leftist Heap/Tree)简介及代码
左偏树是一种常用的优先队列(堆)结构.与二叉堆相比,左偏树可以高效的实现两个堆的合并操作. 左偏树实现方便,编程复杂度低,而且有着不俗的效率表现. 它的一个常见应用就是与并查集结合使用.利用并查集确定 ...
随机推荐
- mysql 5.7 支持json格式
1.JSON格式的支持:mysql> create table user ( uid int auto_increment, -> data json,primary key(u ...
- wampserve部署
全名 WampServer 来自法国的软件 http://www.wampserver.com/en/ 一.下载方法: 1.一级导航点击download(发现只不过是本页的跳转,硕大的 wampser ...
- tpframe框架之slide模块的使用
最新版git:https://gitee.com/37duman/tpframe 下载插件 点击下载slide插件 安装插件 把下载下来的插件解压后放置在addon文件夹 登录后台,点击插件管理 点击 ...
- yii2高级模板使用一个域名管理前后台
yii2的高级模板分为backend和frontend,最开始用yii的时候并没怎么在意,就使用了两个域名分别解析前后台.今天无意间看见 可以使用一个域名指向前后台. 1.修改 advanced/ba ...
- Python 上下文管理器和else块
最终,上下文管理器可能几乎与子程序(subroutine)本身一样重要.目前,我们只了解了上下文管理器的皮毛--Basic 语言有with 语句,而且很多语言都有.但是,在各种语言中 with 语句的 ...
- CodeForces-748B
关键在于判断是否能够得到解决办法,我的思路就是用一个数组来记录每个小写字母对应的按键,如果它出现对应两个级以上不同的按键那么就说明不能得出解决办法,直接打印'-1'.如果能够得出解决办法,就扫描一下数 ...
- HDU - 1495 bfs [kuangbin带你飞]专题一
模拟倒水的过程,每次可以把第i个杯子的水向第j个杯子里面倒,这可能出现新的状态,不停的更新状态,指导某两个杯子的水等于S/2说明找到答案,如果所有状态搜索完毕仍然不能均分,则退出. 注意:如果S是奇数 ...
- Java NIO之缓冲区
1.简介 Java NIO 相关类在 JDK 1.4 中被引入,用于提高 I/O 的效率.Java NIO 包含了很多东西,但核心的东西不外乎 Buffer.Channel 和 Selector.这其 ...
- Hadoop分布式集群配置
硬件环境: 安装一个Hadoop集群时,需要专门指定一个服务器作为主节点. 三台虚拟机搭建的集群:(搭建集群时主机名不能一样,主机名在/etc/hostname修改) master机器:集群的主节点, ...
- 笔记︱基于网络节点的node2vec、论文、算法python实现
看到一个很有意思的算法,而且腾讯朋友圈lookalike一文中也有提及到,于是蹭一波热点,学习一下.论文是也发KDD2016 . . 一.主要论文:node2vec: Scalable Feature ...