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. kafka0.8--0.11各个版本特性预览介绍

    kafka-0.8.2 新特性 producer不再区分同步(sync)和异步方式(async),所有的请求以异步方式发送,这样提升了客户端效率.producer请求会返回一个应答对象,包括偏移量或者 ...

  2. 软件测试_测试工具_Loadrunner_IP欺骗

    一.设置IP欺骗的原因: 1.当某个IP的访问过于频繁或者访问量过大时,服务器会拒绝访问请求: 2.某些服务器配置了负载均衡,使用同一个IP不能测出系统的实际性能.Loadrunner中的IP欺骗通过 ...

  3. Kubernetes采用CoreDNS

    参考文档: kubernetes插件:https://github.com/kubernetes/kubernetes/tree/master/cluster/addons/dns/coredns 自 ...

  4. PAT甲题题解-1012. The Best Rank (25)-排序水题

    排序,水题因为最后如果一个学生最好的排名有一样的,输出的课程有个优先级A>C>M>E那么按这个优先级顺序进行排序每次排序前先求当前课程的排名然后再与目前最好的排名比较.更新 至于查询 ...

  5. PAT甲题题解-1088. Rational Arithmetic (20)-模拟分数计算

    输入为两个分数,让你计算+,-,*,\四种结果,并且输出对应的式子,分数要按带分数的格式k a/b输出如果为负数,则带分数两边要有括号如果除数为0,则式子中的结果输出Inf模拟题最好自己动手实现,考验 ...

  6. 蓝牙BLE实用教程(转载)

    欢迎使用 小书匠(xiaoshujiang)编辑器,您可以通过 设置 里的修改模板来改变新建文章的内容. 1.蓝牙BLE常见问答 Q: Smart Ready 和 Smart 以及传统蓝牙之间是什么关 ...

  7. 数据库——SQL数据单表查询

    数据查询   语句格式 SELECT [ALL|DISTINCT] <目标列表达式> [,<目标列表达式>] … FROM <表或视图名>[,<表或视图名&g ...

  8. Linux第五周学习总结——扒开系统调用的三层皮(下

    Linux第五周学习总结--扒开系统调用的三层皮(下) 作者:刘浩晨 [原创作品转载请注明出处] <Linux内核分析>MOOC课程http://mooc.study.163.com/co ...

  9. hybrid浅记

    目前首次接触hybrid项目,故根据翻阅了解后,浅记对它的认识. hybrid是携程推出的一个项目框架,其优点是:跨平台.开发效率高.开发成本相对较低,其不足是:体验不如Native hybrid设计 ...

  10. Alpha冲刺——day5

    Alpha冲刺--day5 作业链接 Alpha冲刺随笔集 github地址 团队成员 031602636 许舒玲(队长) 031602237 吴杰婷 031602220 雷博浩 031602634 ...