BZOJ 2333: [SCOI2011]棘手的操作
真的是个很棘手的操作。。
注意每删除一个点,就需要clear一次。
#include<complex>
#include<cstdio>
using namespace std;
const int N=3e5+;
int n,m,rot,add;
//add记录所有节点增加的权值
int q[N<<];
inline int qread()
{
int x=,j=;
char ch=getchar();
while(ch<'' || ch>''){if(ch=='-')j=-;ch=getchar();}
while(ch>='' && ch<=''){x=x*+ch-'';ch=getchar();}
return x*j;
}
struct Leftist
{
int fat[N],son[N][],key[N],dis[N],mark[N];
void clear(int x)
{
fat[x]=son[x][]=son[x][]=;
}
void PushDown(int x)
{
if(!mark[x])return;
if(son[x][])
{
key[son[x][]]+=mark[x];
mark[son[x][]]+=mark[x];
}
if(son[x][])
{
key[son[x][]]+=mark[x];
mark[son[x][]]+=mark[x];
}
mark[x]=;
}
int Merge(int a,int b)
{
if(!a || !b)return a+b;
if(key[a]<key[b])swap(a,b);
PushDown(a);
son[a][]=Merge(son[a][],b);
fat[son[a][]]=a;
if(dis[son[a][]]>dis[son[a][]])swap(son[a][],son[a][]);
dis[a]=dis[son[a][]]+;
return a;
}
int Sum(int x)
{
int res=;
while(x=fat[x])res+=mark[x];
return res;
}
int Top(int x)
{
while(fat[x])x=fat[x];
return x;
}
int Pop(int x)
{
PushDown(x);
int q=fat[x],p=Merge(son[x][],son[x][]);
if(q)son[q][son[q][]==x]=p;
fat[p]=q;
while(q)
{
if(dis[son[q][]]>dis[son[q][]])
swap(son[q][],son[q][]);
if(dis[q]==dis[son[q][]]+)return rot;
dis[q]=dis[son[q][]]+;
p=q;q=fat[q];
}
return p;
}
int AddPoint(int x,int v)
{
int t=Top(x);
if(t==x)
if(!son[x][] && !son[x][])
{
key[x]+=v;
return x;
}
else
if(son[x][])t=son[x][];
else t=son[x][];
Pop(x);
key[x]+=v+Sum(x);
clear(x);
return Merge(Top(t),x);
}
int Build()
{
int head=,tail=;
for(int i=;i<=n;i++)
q[++tail]=i;
int x,y;
while(tail-head)
{
x=q[head++];y=q[head++];
q[++tail]=Merge(x,y);
}
return q[head];
}
}t1,t2;
//对于F3操作,需要把所有堆的根拿出来建一个新的堆
//新开一棵t2来维护这些点
int main()
{
scanf("%d",&n);
for(int i=;i<=n;i++)
t1.key[i]=t2.key[i]=qread();
rot=t2.Build();
char c[];int x,y,r1,r2;
scanf("%d",&m);
while(m--)
{
scanf("%s",c);
if(c[]=='U')
{
x=qread();y=qread();
r1=t1.Top(x);r2=t1.Top(y);
if(r1!=r2)
{
int tmp=t1.Merge(r1,r2);
if(tmp==r1)t2.Pop(r2);
else t2.Pop(r1);
/*
合并时,若树a并到了b上,则将a从第二棵树中删除,反之则删除b
被删去的点还是可能会成为最大值的,可它已经被删除了....
它再次成为最大值只有可能是在A1操作,将它再插入就好了
*/
}
}
else if(c[]=='A' && c[]=='')
{
x=qread();y=qread();
rot=t2.Pop(t1.Top(x));
int tmp=t1.AddPoint(x,y);
t2.key[tmp]=t1.key[tmp];
t2.clear(tmp);
rot=t2.Merge(rot,tmp);
}
else if(c[]=='A' && c[]=='')
{
x=qread();y=qread();
r1=t1.Top(x);
rot=t2.Pop(r1);
//整个联通块都+y,不影响堆的性质,但mark不能及时下传,所以仍要把根删去后再插入
t1.key[r1]+=y;t1.mark[r1]+=y;
t2.key[r1]=t1.key[r1];
t2.clear(r1);
rot=t2.Merge(r1,rot);
}
else if(c[]=='A' && c[]=='')add+=qread();
else if(c[]=='F' && c[]=='')
{
x=qread();
printf("%d\n",t1.key[x]+add+t1.Sum(x));
}
else if(c[]=='F' && c[]=='')
{
x=qread();
printf("%d\n",t1.key[t1.Top(x)]+add);
}
else printf("%d\n",t2.key[rot]+add);
}
return ;
}
BZOJ 2333: [SCOI2011]棘手的操作的更多相关文章
- BZOJ 2333: [SCOI2011]棘手的操作 可并堆 左偏树 set
https://www.lydsy.com/JudgeOnline/problem.php?id=2333 需要两个结构分别维护每个连通块的最大值和所有连通块最大值中的最大值,可以用两个可并堆实现,也 ...
- BZOJ 2333 SCOI2011 棘手的操作 并查集+可并堆
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=2333 ..题意概述就不写了,各位老爷如果是看着玩的可以去搜一下,如果是做题找来的也知道题干 ...
- bzoj 2333 [SCOI2011]棘手的操作 —— 可并堆
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2333 稍微复杂,参考了博客:http://hzwer.com/5780.html 用 set ...
- BZOJ 2333 [SCOI2011]棘手的操作 (可并堆)
码农题.. 很显然除了两个全局操作都能用可并堆完成 全局最大值用个multiset记录,每次合并时搞一搞就行了 注意使用multiset删除元素时 如果直接delete一个值,会把和这个值相同的所有元 ...
- 2333: [SCOI2011]棘手的操作[写不出来]
2333: [SCOI2011]棘手的操作 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 1979 Solved: 772[Submit][Stat ...
- 2333: [SCOI2011]棘手的操作[离线线段树]
2333: [SCOI2011]棘手的操作 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 2325 Solved: 909[Submit][Stat ...
- 2333: [SCOI2011]棘手的操作[我不玩了]
2333: [SCOI2011]棘手的操作 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 1979 Solved: 772[Submit][Stat ...
- 【BZOJ】2333: [SCOI2011]棘手的操作
http://www.lydsy.com/JudgeOnline/problem.php?id=2333 题意: 有N个节点,标号从1到N,这N个节点一开始相互不连通.第i个节点的初始权值为a[i], ...
- 【BZOJ 2333 】[SCOI2011]棘手的操作(离线+线段树)
2333: [SCOI2011]棘手的操作 Description 有N个节点,标号从1到N,这N个节点一开始相互不连通.第i个节点的初始权值为a[i],接下来有如下一些操作: U x y: 加一条边 ...
随机推荐
- Harbor 企业级私有仓库 Ubuntu16.04 搭建及使用
一.Harbor简介 1.1.什么是Harbor 几个VMware中国的人搞了一个容器镜像仓库.Harbor是一个用于存储和分发Docker镜像的企业级Registry服务器. 1.2.Harbor架 ...
- ③ Python3.0 数字类型
Python3 的六个标准数据类型中:不可变数据(3 个):Number(数字).String(字符串).Tuple(元组):可变数据(3 个):List(列表).Dictionary(字典).Set ...
- java后台获取微信小程序openid
一.jar包准备 1.在网盘下载 链接:https://pan.baidu.com/s/15HAAWOg_yn768g4s9IrcPg 提取码:hgj0 二.在pom文件中添加依赖 1.将外部的引入的 ...
- BUAA_OO第三单元总结性博客作业——JML
一.JML 在第三单元的面向对象课程中我们第一次接触了JML语言以及基于JML规范的规格化设计.在之前一系列关于面向对象思想的学习认识中,我们知道了Java是一种面向对象的语言,面向对象思想的一个重要 ...
- 【面试突击】- SpringMVC那些事(一)
1.什么是Spring MVC ?简单介绍下你对springMVC的理解? Spring MVC是一个基于MVC架构的用来简化web应用程序开发的应用开发框架,它是Spring的一个模块,无需中间整合 ...
- python day10: 反射补充,面向对象
目录 pythdon day 10 1. 反射补充 16. 面向对象 16.1 面向对象初步介绍 16.2 面向对象和面向过程区别 16.3 对象的进化 17. 类class 17.1 类的定义 17 ...
- self attention pytorch代码
实现细节; 1.embedding 层 2.positional encoding层:添加位置信息 3,MultiHeadAttention层:encoder的self attention 4,sub ...
- Django ORM整理
字段类型 # 自增长 Auto = models.AutoField() BigAuto = models.BigAutoField() # 二进制 Binary = models.BinaryFie ...
- ECSHOP v3.0 数据库字典
商品相关表 商品分类表 category 此表用来维护商品分类信息 字段名 字段描述 字段类型 默认值 索引 cat_id 分类编号 smallint(5) unsigned 自增 PK cat_na ...
- Winmanager,NERDTree和MiniBufExplorer
NERDTree树形浏览文件 MiniBufExplorer多文件同时编辑 Winmanager将NERDTree和MiniBufExplorer界面整合 下载 http://www.vim.org/ ...