传送门

启发式合并菜题。

题意:支持与连通块有关的几种操作。

要求支持连边,单点修改,连通块修改,全局修改和单点查值,连通块查最大值和全局最大值。


我们对每个连通块和答案用可删堆维护最大值,然后用启发式合并来解决连边的问题。

关键在于连通块修改,这个可以给每个连通块维护一个标记,然后在合并的时候每个数记得修改值就行了。

代码

#include<bits/stdc++.h>
#define ri register int
using namespace std;
inline int read(){
	int ans=0,w=1;
	char ch=getchar();
	while(!isdigit(ch)){if(ch=='-')w=-1;ch=getchar();}
	while(isdigit(ch))ans=(ans<<3)+(ans<<1)+(ch^48),ch=getchar();
	return ans*w;
}
const int N=3e5+5;
struct IN_OUT_priority_queue{
	priority_queue<int>a,b;
	inline void push(const int&x){a.push(x);}
	inline void del(const int&x){b.push(x);}
	inline int top(){while(b.size()&&a.top()==b.top())a.pop(),b.pop();return a.top();}
	inline int size(){return a.size()-b.size();}
}ans,S[N];
int n,fa[N],det[N],val[N],all=0;
vector<int>id[N];
inline int find(int x){return x==fa[x]?x:fa[x]=find(fa[x]);}
inline void solve1(){
	int x=find(read()),y=find(read());
	if(x==y)return;
	if(id[x].size()<id[y].size())swap(x,y);
	fa[y]=x,ans.del(S[x].top()+det[x]),ans.del(S[y].top()+det[y]);
	for(ri i=0;i<id[y].size();++i)id[x].push_back(id[y][i]),val[id[y][i]]+=det[y]-det[x],S[x].push(val[id[y][i]]);
	ans.push(S[x].top()+det[x]);
}
inline void solve2(){
	int x=read(),fx=find(x),y=read();
	ans.del(S[fx].top()+det[fx]);
	S[fx].del(val[x]),S[fx].push(val[x]+=y);
	ans.push(S[fx].top()+det[fx]);
}
inline void solve3(){int x=find(read()),v=read();ans.del(S[x].top()+det[x]),det[x]+=v,ans.push(S[x].top()+det[x]);}
inline void solve4(){all+=read();}
inline void solve5(){int x=read();cout<<val[x]+det[find(x)]+all<<'\n';}
inline void solve6(){int x=find(read());cout<<S[x].top()+det[x]+all<<'\n';}
inline void solve7(){cout<<ans.top()+all<<'\n';}
int main(){
	n=read();
	for(ri i=1;i<=n;++i)id[i].push_back(i),fa[i]=i,S[i].push(val[i]=read()),ans.push(val[i]);
	for(ri tt=read(),a,b,op;tt;--tt){
		string s;
		cin>>s;
		if(s=="U")solve1();
		if(s=="A1")solve2();
		if(s=="A2")solve3();
		if(s=="A3")solve4();
		if(s=="F1")solve5();
		if(s=="F2")solve6();
		if(s=="F3")solve7();
	}
	return 0;
}

2019.01.17 bzoj2333: [SCOI2011]棘手的操作(启发式合并)的更多相关文章

  1. 真--可并堆模板--BZOJ2333: [SCOI2011]棘手的操作

    n<=300000个点,开始是独立的,m<=300000个操作: 方法一:单点修改.查询,区间修改.查询?等等等等这里修改是块修改不是连续的啊,那就让他连续呗!具体方法:离线后,每次连接两 ...

  2. BZOJ2333:[SCOI2011]棘手的操作(Splay)

    Description 有N个节点,标号从1到N,这N个节点一开始相互不连通.第i个节点的初始权值为a[i],接下来有如下一些操作: U x y: 加一条边,连接第x个节点和第y个节点 A1 x v: ...

  3. BZOJ2333 [SCOI2011]棘手的操作 堆 左偏树 可并堆

    欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ2333 题意概括 有N个节点,标号从1到N,这N个节点一开始相互不连通.第i个节点的初始权值为a[i ...

  4. [bzoj2333] [SCOI2011]棘手的操作 (可并堆)

    //以后为了凑字数还是把题面搬上来吧2333 发布时间果然各种应景... Time Limit: 10 Sec  Memory Limit: 128 MB Description 有N个节点,标号从1 ...

  5. bzoj千题计划217:bzoj2333: [SCOI2011]棘手的操作

    http://www.lydsy.com/JudgeOnline/problem.php?id=2333 读入所有数据,先模拟一遍所有的合并操作 我们不关心联通块长什么样,只关心联通块内有谁 所以可以 ...

  6. BZOJ2333 [SCOI2011]棘手的操作 【离线 + 线段树】

    题目 有N个节点,标号从1到N,这N个节点一开始相互不连通.第i个节点的初始权值为a[i],接下来有如下一些操作: U x y: 加一条边,连接第x个节点和第y个节点 A1 x v: 将第x个节点的权 ...

  7. bzoj2333 [SCOI2011]棘手的操作(洛谷3273)

    题目描述 有N个节点,标号从1到N,这N个节点一开始相互不连通.第i个节点的初始权值为a[i],接下来有如下一些操作:U x y: 加一条边,连接第x个节点和第y个节点A1 x v: 将第x个节点的权 ...

  8. bzoj2333 [SCOI2011]棘手的操作

    用set维护每个联通块里的最值,multiset维护所有块里的最值,并查集维护连通性,然后随便搞搞就行了,合并时候采用启发式合并.复杂度O(nlognlogn),大概勉强过的程度,反正跑的很慢就是了. ...

  9. (右偏树)Bzoj2333: [SCOI2011]棘手的操作

    题面 戳我 Sol 右偏树滑稽+并查集 再在全局开一个可删除的堆(priority_queue) 注意细节 # include <bits/stdc++.h> # define RG re ...

随机推荐

  1. LeetCode第20题

    LeetCode20题不多说上代码 public boolean isValid(String s){ Stack<Character> stack = new Stack<Char ...

  2. Python: PySide(PyQt)QMessageBox按钮显示中文

    习惯了Delphi.c#调用系统MessageBox本地化显示,待用PySide调用时,Qt原生提示对话框,默认以英文显示. 如何本地化呢? 参考些资料,加以摸索,实现所需效果.并可根据此思路,设计自 ...

  3. java正则表达式(regular)

    哎呀妈呀,脑瓜疼----正则表达式 正则是用来处理复杂文本类型的 标准字符集合: \d --->代表0-9任意一个数字 \D ---->除了数字之外的任意字符 \w ----->字母 ...

  4. Linux下more命令C语言实现实践 (Unix-Linux编程实践教程)

    1. more第一版 实现基础功能,显示每一页固定24行文本,“q Enter”退出, “Enter” 下一行, “space Enter”下一页. #include<stdio.h> # ...

  5. centos7下haproxy1.7的使用与配置

    centos7下haproxy1.7的使用与配置 haproxy是一个使用C语言编写的自由及开放源代码软件,其提供高可用性.负载均衡,以及基于TCP和HTTP的应用程序代理. 一.haproxy下载 ...

  6. 组委会正在为美团点评CodeM大赛的决赛设计新赛制

    比赛有 n 个人参加(其中 n 为2的幂),每个参赛者根据资格赛和预赛.复赛的成绩,会有不同的积分.比赛采取锦标赛赛制,分轮次进行,设某一轮有 m 个人参加,那么参赛者会被分为 m/2 组,每组恰好 ...

  7. EntityFramework的linq扩展where

    代码 using System; using System.Collections.Generic; using System.Linq; using System.Linq.Expressions; ...

  8. ContenteProvider

    以前只写过程序中添加背景音乐,在程序一开始就运行音乐,当程序结束后音乐也随即停止.遇到这样的功能,我们一般是通过系统提供的ContentProvider来实现的,系统对于常用的数据也给开发者提供了方便 ...

  9. Web API、WCF和Web Service的区别

    [转载] Web Service 1.它是基于SOAP协议的,数据格式是XML 2.只支持HTTP协议 3.它不是开源的,但可以被任意一个了解XML的人使用 4.它只能部署在IIS上 WCF 1.这个 ...

  10. IDEA使用过程中常见小问题

    在磁盘随便一个位置,创建一个文件夹,可以通过IDEA open 打开它 然后在将一些代码模块,放入这个文件夹,IDEA刷新,能够自动显示出来   然后执行下面的文档操作 1.IDEA通过一个项目文件导 ...