http://www.lydsy.com/JudgeOnline/problem.php?id=2333

上次那个是线段树,再发一个左偏树

维护两种左偏树

第一种是对每个联通块维护一个左偏树

第二种是对所有第一种左偏树的根节点维护一个左偏树

#include<cstdio>
#include<iostream>
#include<algorithm> using namespace std; #define N 300001 /*void read(int &x)
{
x=0; int f=1; char c=getchar();
while(!isdigit(c)) { if(c=='-') f=-1; c=getchar(); }
while(isdigit(c)) { x=x*10+c-'0'; c=getchar(); }
x*=f;
}*/ struct Leftist
{
int fa[N],lc[N],rc[N];
int dis[N];
int val[N],tag[N]; int st[N]; void addsingle(int x,int y)
{
if(!x) return;
val[x]+=y;
tag[x]+=y;
} void down(int x)
{
if(!tag[x]) return;
addsingle(lc[x],tag[x]);
addsingle(rc[x],tag[x]);
tag[x]=;
} void download(int x)
{
int top=;
for(int i=x;i;i=fa[i]) st[++top]=i;
for(;top;--top) down(top);
} int merge(int x,int y)
{
if(!x || !y) return x+y;
if(val[x]<val[y]) swap(x,y);
down(x);
rc[x]=merge(rc[x],y);
if(dis[lc[x]]<dis[rc[x]]) swap(lc[x],rc[x]);
if(!rc[x]) dis[x]=;
else dis[x]=dis[rc[x]]+;
if(lc[x]) fa[lc[x]]=x;
if(rc[x]) fa[rc[x]]=x;
return x;
} void del(int &root,int x)
{
int y=fa[x];
bool k= rc[y]==x;
x=merge(lc[x],rc[x]);
fa[x]=y;
if(!y) { root=x; return; }
if(k) rc[y]=x;
else lc[y]=x;
if(dis[lc[y]]<dis[rc[y]]) swap(lc[y],rc[y]);
x=rc[y];
while(y && dis[y]!=dis[x]+)
{
dis[y]=dis[x]+;
y=fa[y];
if(dis[lc[y]]<dis[rc[y]]) swap(lc[y],rc[y]);
x=rc[y];
}
} void push(int id,int &root,int x)
{
fa[id]=lc[id]=rc[id]=dis[id]=tag[id]=;
val[id]=x;
root=merge(root,id);
} }q,Q; int F[N]; int find(int i)
{
return F[i]==i ? i : F[i]=find(F[i]);
} int main()
{
int n,m,x,y;
char s[];
scanf("%d",&n);
for(int i=;i<=n;++i)
{
scanf("%d",&x);
q.push(i,F[i],x);
Q.push(i,F[],x);
}
scanf("%d",&m);
int add=;
while(m--)
{
scanf("%s",s);
if(s[]=='U')
{
scanf("%d",&x);
scanf("%d",&y);
x=find(x); y=find(y);
if(x==y) continue;
Q.del(F[],x);
Q.del(F[],y);
F[x]=F[y]=q.merge(x,y);
x=F[x];
Q.push(x,F[],q.val[x]);
}
else if(s[]=='A')
{
if(s[]=='')
{
scanf("%d",&x);
scanf("%d",&y);
find(x);
Q.del(F[],F[x]);
q.download(x);
int tmp=q.val[x];
q.del(F[x],x);
int z=F[x];
if(z)
{
F[z]=z;
q.push(x,F[z],tmp+y);
F[x]=F[z];
}
else q.push(x,F[x],tmp+y);
Q.push(F[x],F[],q.val[F[x]]);
}
else if(s[]=='')
{
scanf("%d",&x);
scanf("%d",&y);
x=find(x);
Q.del(F[],x);
q.addsingle(x,y);
Q.push(x,F[],q.val[x]);
}
else
{
scanf("%d",&x);
add+=x;
}
}
else
{
if(s[]=='')
{
scanf("%d",&x);
q.download(x);
printf("%d\n",q.val[x]+add);
}
else if(s[]=='')
{
scanf("%d",&x);
x=find(x);
printf("%d\n",q.val[x]+add);
}
else printf("%d\n",Q.val[F[]]+add);
}
}
}

bzoj千题计划218:bzoj2333: [SCOI2011]棘手的操作的更多相关文章

  1. bzoj千题计划177:bzoj1858: [Scoi2010]序列操作

    http://www.lydsy.com/JudgeOnline/problem.php?id=1858 2018 自己写的第1题,一遍过 ^_^ 元旦快乐 #include<cstdio> ...

  2. bzoj千题计划242:bzoj4034: [HAOI2015]树上操作

    http://www.lydsy.com/JudgeOnline/problem.php?id=4034 dfs序,树链剖分 #include<cstdio> #include<io ...

  3. bzoj千题计划300:bzoj4823: [Cqoi2017]老C的方块

    http://www.lydsy.com/JudgeOnline/problem.php?id=4823 讨厌的形状就是四联通图 且左右各连一个方块 那么破坏所有满足条件的四联通就好了 按上图方式染色 ...

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

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

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

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

  6. bzoj千题计划196:bzoj4826: [Hnoi2017]影魔

    http://www.lydsy.com/JudgeOnline/problem.php?id=4826 吐槽一下bzoj这道题的排版是真丑... 我还是粘洛谷的题面吧... 提供p1的攻击力:i,j ...

  7. bzoj千题计划280:bzoj4592: [Shoi2015]脑洞治疗仪

    http://www.lydsy.com/JudgeOnline/problem.php?id=4592 注意操作1 先挖再补,就是补的范围可以包含挖的范围 SHOI2015 的题 略水啊(逃) #i ...

  8. bzoj千题计划317:bzoj4650: [Noi2016]优秀的拆分(后缀数组+差分)

    https://www.lydsy.com/JudgeOnline/problem.php?id=4650 如果能够预处理出 suf[i] 以i结尾的形式为AA的子串个数 pre[i] 以i开头的形式 ...

  9. bzoj千题计划304:bzoj3676: [Apio2014]回文串(回文自动机)

    https://www.lydsy.com/JudgeOnline/problem.php?id=3676 回文自动机模板题 4年前的APIO如今竟沦为模板,,,╮(╯▽╰)╭,唉 #include& ...

随机推荐

  1. Jq_浏览器兼容性及其浏览器版本

    JQuery 中用 方法 jQuery.browser 来判断浏览器,返回值可以为: safari opera msie mozilla. 当然有时候我们还需要区分版本 这就要用到 jQuery.br ...

  2. Salesforce Apex学习 : 利用Schema命名空间中的DescribeSObjectResult类型来获取sObject对象的基本信息

    DescribeSObjectResult 对象的取得: //使用getDescribe方法和sObject token Schema.DescribeSObjectResult mySObjDesc ...

  3. 关于ueditor一些使用记录

    1.使用的引用配置顺序 <script src="utf8-net/ueditor.config.js"></script> <script src= ...

  4. Airmon-ng抓包&破解wifi

    安装  aircrack获取(aircrack源) sudo apt-get install aircrack-ng 配置 安装组件 sudo apt-get install build-essent ...

  5. Unity程序协同问题,传送时屏幕变黑变亮的解决,常规操作的行为集合

    在unity中运行某段程序时往往需要运行另外一段不相干但是却对功能上有需求的程序,比如进行场景传送,在传送点处,点击I键,屏幕慢慢变黑,场景传送到另外一个场景,场景又慢慢变亮.这里首先涉及两个物体,一 ...

  6. PAT甲题题解-1127. ZigZagging on a Tree (30)-中序、后序建树

    根据中序遍历和前序遍历确定一棵二叉树,然后按“层次遍历”序列输出.输出规则:除根节点外,接下来每层的节点输出顺序是:先从左到右,再从右到左,交替输出 #include <iostream> ...

  7. Linux内核分析——第二周学习笔记

    20135313吴子怡.北京电子科技学院 chapter 1 知识点梳理 (一)计算机是如何工作的?(总结)——三个法宝 ①存储程序计算机工作模型,计算机系统最最基础性的逻辑结构: ②函数调用堆栈,高 ...

  8. Linux内核设计(第一周)——从汇编语言出发理解计算机工作原理

    Linux内核设计(第一周)——从汇编语言出发理解计算机工作原理 计算机工作原理 汇编指令 C语言代码汇编分析 by苏正生 原创作品转载请注明出处 <Linux内核分析>MOOC课程htt ...

  9. C与C++的编程风格区别

    c和c++都是在实践中发展起来的语言.实用性极强.c是与UNIX/Linux的发展相辅相成的.而C++是B.S为了摆脱c与硬件以及底层过于紧密的苦恼,而开发的语言.C++可以说就是c语言的超集.任何c ...

  10. VS2013简单的单元测试

    安装过程本人在此就不做多余的说明,如果一个程序员连一个软件都无法安装那我也醉了,其次就是希望我们不要为了完成作业而去用VS,下面我具体说一下单元测试. 第一步,文件→新建一个项目,具体操作如下图 打开 ...