bzoj千题计划218:bzoj2333: [SCOI2011]棘手的操作
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]棘手的操作的更多相关文章
- bzoj千题计划177:bzoj1858: [Scoi2010]序列操作
http://www.lydsy.com/JudgeOnline/problem.php?id=1858 2018 自己写的第1题,一遍过 ^_^ 元旦快乐 #include<cstdio> ...
- bzoj千题计划242:bzoj4034: [HAOI2015]树上操作
http://www.lydsy.com/JudgeOnline/problem.php?id=4034 dfs序,树链剖分 #include<cstdio> #include<io ...
- bzoj千题计划300:bzoj4823: [Cqoi2017]老C的方块
http://www.lydsy.com/JudgeOnline/problem.php?id=4823 讨厌的形状就是四联通图 且左右各连一个方块 那么破坏所有满足条件的四联通就好了 按上图方式染色 ...
- 真--可并堆模板--BZOJ2333: [SCOI2011]棘手的操作
n<=300000个点,开始是独立的,m<=300000个操作: 方法一:单点修改.查询,区间修改.查询?等等等等这里修改是块修改不是连续的啊,那就让他连续呗!具体方法:离线后,每次连接两 ...
- bzoj千题计划217:bzoj2333: [SCOI2011]棘手的操作
http://www.lydsy.com/JudgeOnline/problem.php?id=2333 读入所有数据,先模拟一遍所有的合并操作 我们不关心联通块长什么样,只关心联通块内有谁 所以可以 ...
- bzoj千题计划196:bzoj4826: [Hnoi2017]影魔
http://www.lydsy.com/JudgeOnline/problem.php?id=4826 吐槽一下bzoj这道题的排版是真丑... 我还是粘洛谷的题面吧... 提供p1的攻击力:i,j ...
- bzoj千题计划280:bzoj4592: [Shoi2015]脑洞治疗仪
http://www.lydsy.com/JudgeOnline/problem.php?id=4592 注意操作1 先挖再补,就是补的范围可以包含挖的范围 SHOI2015 的题 略水啊(逃) #i ...
- bzoj千题计划317:bzoj4650: [Noi2016]优秀的拆分(后缀数组+差分)
https://www.lydsy.com/JudgeOnline/problem.php?id=4650 如果能够预处理出 suf[i] 以i结尾的形式为AA的子串个数 pre[i] 以i开头的形式 ...
- bzoj千题计划304:bzoj3676: [Apio2014]回文串(回文自动机)
https://www.lydsy.com/JudgeOnline/problem.php?id=3676 回文自动机模板题 4年前的APIO如今竟沦为模板,,,╮(╯▽╰)╭,唉 #include& ...
随机推荐
- 【拾遗】理解Javascript中的Arguments
前言 最近在看JavaScript相关的知识点,看到了老外的一本Javascript For Web Developers,遇到了一个知识盲点,觉得老外写的很明白很透彻,记录下来加深印象,下面是我摘出 ...
- linux重启tomcat的shell脚本
基本思路: 先检查待重启的tomcat的进程是否存在 存在则执行shutdown. 然后再次检查进程是否还存在,不存在则执行kill 然后删除工作空间及10天前的日志. 最后执行启动. #!/bin/ ...
- 《杜增强讲Unity之Tanks坦克大战》1-准备工作
0.案例介绍 0.1开始界面 点击Play Now 进入游戏界面 左边的坦克使用ws控制前后移动,ad键左右旋转,空格键开火 右边的坦克使用方向键上下控制前后移动,方向键左右键实现左右旋转 ...
- 大厂面试官:Java工程师的“十项全能”
想要成为合格的Java程序员或工程师到底需要具备哪些专业技能,在面试之前到底需要准备哪些东西呢?面试时面试官想了解你的什么专业技能,以下都是一个合格Java软件工程师所要具备的. 一.专业技能 熟练的 ...
- 20135202闫佳歆--week2 操作系统是如何工作的--学习笔记
此为个人学习笔记存档 week 2 操作系统是怎么工作的 一.计算机是如何工作的?--三个法宝 (一)三个法宝 1.存储程序计算机 所有计算机的基础性的逻辑框架. 2.函数调用堆栈 在低级语言中并不很 ...
- [软工课程博客] 求解第N个素数
任务 求解第 10,0000.100,0000.1000,0000 ... 个素数(要求精确解). 想法 Sieve of Eratosthenes 学习初等数论的时候曾经学过埃拉托斯特尼筛法(Sie ...
- deepin 下mysql编码问题utf8的解决
deepin 下mysql编码问题utf8的解决 参考链接 http://www.ha97.com/5359.html 与之不同的地方在第二歩 二.最简单的完美修改方法,修改mysql的my.cnf文 ...
- 关于Python matplotlib显示汉字乱码问题
我也是一个初学者,在今天编程时遇到的一个问题,我是基于Eclipse编写Python代码,在使用matplotlib进行数据可视化时,发现显示不了汉字并且出现乱码问题. (1)使用中文注释时报错: 解 ...
- 圆桌的项目Alpha冲刺——测试
测试工作安排 作为一个测试计划来讲,核心的三个要素是时间,资源,范围.时间就是什么时候做以及要花多久做,资源就是你要调用的人力.机器等资源,范围是你要测试的东西以及测试重点. 时间:每天完成相应的模块 ...
- this 指向问题
你不懂JS: this 与对象原型 第二章: this豁然开朗! 在第一章中,我们摒弃了种种对this的误解,并且学习了this是一个完全根据调用点(函数是如何被调用的)而为每次函数调用建立的绑定. ...