(右偏树)Bzoj2333: [SCOI2011]棘手的操作
题面
Sol
右偏树滑稽+并查集
再在全局开一个可删除的堆(priority_queue)
注意细节
# include <bits/stdc++.h>
# define RG register
# define IL inline
# define Fill(a, b) memset(a, b, sizeof(a))
using namespace std;
typedef long long ll;
const int _(3e5 + 10);
IL ll Read(){
	RG ll x = 0, z = 1; RG char c = getchar();
	for(; c < '0' || c > '9'; c = getchar()) z = c == '-' ? -1 : 1;
	for(; c >= '0' && c <= '9'; c = getchar()) x = (x << 1) + (x << 3) + (c ^ 48);
	return x * z;
}
int n, a[_], fa[_], add, S[_], top, rt[_];
struct Right_Heap{	int fa, ls, rs, dis, val, tag;  } t[_];
struct Heap{
	priority_queue <int> A, B;
	IL void Push(RG int x){  A.push(x);  }
	IL void Del(RG int x){  B.push(x);  }
	IL int Top(){  while(!B.empty() && A.top() == B.top()) A.pop(), B.pop(); return A.top();  }
} Q;
IL void Update(RG int x){  t[x].dis = t[t[x].ls].dis + 1;  }
IL void Adjust(RG int x){  if(t[t[x].ls].dis > t[t[x].rs].dis) swap(t[x].ls, t[x].rs);  }
IL void Add(RG int x, RG int d){  if(!x) return; t[x].tag += d; t[x].val += d;   }
IL void Pushdown(RG int x){  if(!t[x].tag) return; Add(t[x].ls, t[x].tag); Add(t[x].rs, t[x].tag); t[x].tag = 0;  }
IL int Find(RG int x){  return fa[x] == x ? x : fa[x] = Find(fa[x]);  }
IL int Merge(RG int x, RG int y){
	if(!x || !y) return x + y;
	Pushdown(x); Pushdown(y);
	if(t[x].val < t[y].val) swap(x, y);
	RG int tmp = Merge(t[x].ls, y);
	t[tmp].fa = x; t[x].ls = tmp;
	Adjust(x); Update(x);
	return x;
}
IL void Pushall(RG int x){	for(RG int y = x; y; y = t[y].fa) S[++top] = y;	while(top) Pushdown(S[top--]);  }
IL void Modify(RG int x, RG int d){
	Pushall(x);
	RG int tmp = Merge(t[x].ls, t[x].rs);
	if(t[x].fa){
		if(t[t[x].fa].ls == x) t[t[x].fa].ls = tmp;
		else t[t[x].fa].rs = tmp;
		for(RG int y = t[x].fa; y; y = t[y].fa)	Adjust(y), Update(y);
	}
	t[tmp].fa = t[x].fa; t[x].fa = t[x].ls = t[x].rs = 0;
	RG int fx = Find(x);
	Q.Del(t[rt[fx]].val);
	if(x == rt[fx]) rt[fx] = tmp; t[x].val += d;
	rt[fx] = Merge(rt[fx], x); t[rt[fx]].fa = 0;
	Q.Push(t[rt[fx]].val);
}
IL void Query(RG int x){  Pushall(x); printf("%d\n", t[x].val + add);  }
int main(RG int argc, RG char* argv[]){
	n = Read();
	for(RG int i = 1; i <= n; ++i) t[i].val = Read(), Q.Push(t[i].val), fa[i] = rt[i] = i;
	for(RG int m = Read(); m; --m){
		RG char op[5]; RG int x, y, fx, fy;
		scanf(" %s", op);
		if(op[0] == 'U'){
			x = Read(); y = Read(); fx = Find(x); fy = Find(y);
			if(fx == fy) continue;
			Q.Del(t[rt[fx]].val); Q.Del(t[rt[fy]].val);
			fa[fx] = fy; rt[fy] = Merge(rt[fx], rt[fy]); t[rt[fy]].fa = 0;
			Q.Push(t[rt[fy]].val);
		}
		else if(op[0] == 'A'){
			if(op[1] == '1') x = Read(), y = Read(), Modify(x, y);
			else if(op[1] == '2'){
				x = Read(); y = Read(); fx = Find(x);
				Q.Del(t[rt[fx]].val); Add(rt[fx], y); Q.Push(t[rt[fx]].val);
			}
			else x = Read(), add += x;
		}
		else{
			if(op[1] == '1') x = Read(), Query(x);
			else if(op[1] == '2') x = Read(), fx = Find(x), printf("%d\n", t[rt[fx]].val + add);
			else printf("%d\n", Q.Top() + add);
		}
	}
    return 0;
}
												
											(右偏树)Bzoj2333: [SCOI2011]棘手的操作的更多相关文章
- BZOJ2333 [SCOI2011]棘手的操作 堆 左偏树 可并堆
		
欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ2333 题意概括 有N个节点,标号从1到N,这N个节点一开始相互不连通.第i个节点的初始权值为a[i ...
 - [bzoj2333] [SCOI2011]棘手的操作 (可并堆)
		
//以后为了凑字数还是把题面搬上来吧2333 发布时间果然各种应景... Time Limit: 10 Sec Memory Limit: 128 MB Description 有N个节点,标号从1 ...
 - 真--可并堆模板--BZOJ2333: [SCOI2011]棘手的操作
		
n<=300000个点,开始是独立的,m<=300000个操作: 方法一:单点修改.查询,区间修改.查询?等等等等这里修改是块修改不是连续的啊,那就让他连续呗!具体方法:离线后,每次连接两 ...
 - bzoj千题计划218:bzoj2333: [SCOI2011]棘手的操作
		
http://www.lydsy.com/JudgeOnline/problem.php?id=2333 上次那个是线段树,再发一个左偏树 维护两种左偏树 第一种是对每个联通块维护一个左偏树 第二种是 ...
 - BZOJ2333  [SCOI2011]棘手的操作  【离线 + 线段树】
		
题目 有N个节点,标号从1到N,这N个节点一开始相互不连通.第i个节点的初始权值为a[i],接下来有如下一些操作: U x y: 加一条边,连接第x个节点和第y个节点 A1 x v: 将第x个节点的权 ...
 - bzoj千题计划217:bzoj2333: [SCOI2011]棘手的操作
		
http://www.lydsy.com/JudgeOnline/problem.php?id=2333 读入所有数据,先模拟一遍所有的合并操作 我们不关心联通块长什么样,只关心联通块内有谁 所以可以 ...
 - bzoj2333 [SCOI2011]棘手的操作(洛谷3273)
		
题目描述 有N个节点,标号从1到N,这N个节点一开始相互不连通.第i个节点的初始权值为a[i],接下来有如下一些操作:U x y: 加一条边,连接第x个节点和第y个节点A1 x v: 将第x个节点的权 ...
 - 2019.01.17 bzoj2333: [SCOI2011]棘手的操作(启发式合并)
		
传送门 启发式合并菜题. 题意:支持与连通块有关的几种操作. 要求支持连边,单点修改,连通块修改,全局修改和单点查值,连通块查最大值和全局最大值. 我们对每个连通块和答案用可删堆维护最大值,然后用启发 ...
 - BZOJ2333:[SCOI2011]棘手的操作(Splay)
		
Description 有N个节点,标号从1到N,这N个节点一开始相互不连通.第i个节点的初始权值为a[i],接下来有如下一些操作: U x y: 加一条边,连接第x个节点和第y个节点 A1 x v: ...
 
随机推荐
- 发送POST测试请求的若干方法
			
最近在工作中需要测试发送带Json格式body值的HTTP POST请求.起初,我在Linux环境下使用curl命令去发送请求,但是,在发送的过程中却遇到了一些问题,经过一段时间的摸索,发现了以下几种 ...
 - [翻译] 编写高性能 .NET 代码--第二章 GC -- 避免使用终结器,避免大对象,避免复制缓冲区
			
避免使用终结器 如果没有必要,是不需要实现一个终结器(Finalizer).终结器的代码主要是让GC回收非托管资源用.它会在GC完成标记对象为可回收后,放入一个终结器队列里,在由另外一个线程执行队列里 ...
 - bzoj 1171 大sz的游戏& 2892 强袭作战 (线段树+单调队列+永久性flag)
			
大sz的游戏 Time Limit: 50 Sec Memory Limit: 357 MBSubmit: 536 Solved: 143[Submit][Status][Discuss] Des ...
 - MysqL碎片整理优化
			
先来说一下什么是碎片,怎么知道碎片有多大! 简单的说,删除数据必然会在数据文件中造成不连续的空白空间,而当插入数据时,这些空白空间则会被利用起来.于是造成了数据的存储位置不连续,以及物理存储顺序与理论 ...
 - HDU - 3085 双向BFS + 技巧处理 [kuangbin带你飞]专题二
			
题意:有两只鬼,一个男孩女孩被困在迷宫中,男孩每秒可以走三步,女孩只能1步,鬼可以两步且可以通过墙.问男孩女孩是否可以在鬼抓住他们之前会合? 注意:每秒开始鬼先移动,然后两人开始移动. 思路:以男孩和 ...
 - mybatis与spring的整合(使用sqlSession进行crud)
			
上次介绍了用接口的方法极大的节省了dao层,只需通过 配置文件和接口就可以实现,这次介绍的是通过splsession来实现dao,这种方法比较灵活: 先不说,上配置文件: 1.web.xml < ...
 - 网络基础tcp/ip协议三
			
数据链路层:(位于网络层与物理层之间) 数据链路层的功能: 数据链路的建立,维护. 帧包装,帧传输,帧同步. 帧的差错恢复. 流量的控制. 以太网:(工作在数据链路层) CSMA/CD(带冲突检测的载 ...
 - ffmpeg结构体以及函数介绍(一)
			
本文对在使用ffmpeg进行音视频编解码时使用到的一些函数做一个简单介绍,我当前使用的ffmpeg版本为:0.8.5,因为本人发现在不同的版本中,有些函数名称会有点小改动,所以在此有必要说明下ffmp ...
 - mongodb: Remote server has closed the connection
			
<?php function getMongoClient($seeds = "", $options = array(), $retry = 3) { try { retu ...
 - spring schedule定时任务(一):注解的方式
			
我所知道的java定时任务的几种常用方式: 1.spring schedule注解的方式: 2.spring schedule配置文件的方式: 3.java类继承TimerTask: 第一种方式的实现 ...