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. stl源码剖析 详细学习笔记 RB_tree (1)

    // //  RB_tree_STL.cpp //  笔记 // //  Created by fam on 15/3/21. // // #include "RB_tree_STL.h&q ...

  2. JavaScript 为什么不要使用 eval

    本文内容 eval 隐藏的 eval 安全问题 结论 参考资料   eval eval 函数是一个高等级的函数,它与任何对象都无关.其参数,如果是一个字符串表达式,那么该函数计算表达式的值:如果是一个 ...

  3. [转载]windows下PHP + Nginx curl访问本地地址超时卡死问题的解决方案

    原因: windows 下 nginx+php环境,不支持并发. 解决方案: 1.在配置nginx vhost时,需要同时运行的网站设置不同的fastcgi_pass的端口号 server { ser ...

  4. 自动化部署-Jenkins+SVN+MSBuild 一些补充

    1.ftp的使用 系统管理->插件管理 安装插件Publish Over FTP 系统管理->系统设置 配置ftp参数 如下图 进入任务配置,添加构建后操作 在使用过程中还遇到一个本地防火 ...

  5. 3Sum(or k_Sum)

    Given an array nums of n integers, are there elements a, b, c in nums such that a + b + c = 0? Find ...

  6. PAT甲题题解-1028. List Sorting (25)-水排序

    #include <iostream> #include <cstdio> #include <algorithm> #include <string.h&g ...

  7. PAT甲题题解-1054. The Dominant Color (20)-排序/map

    原本用map,发现超时了,后来便先用数组存储排个序,最后for一遍统计每种颜色出现的次数(每种颜色的首位索引相减+1),找出最多的即可. #include <iostream> #incl ...

  8. 重温httpsession①

    Session—HTTPSession 服务器创建的,Javaweb提供的 与HTTP协议无关是服务器端对象,保存在服务器端.用来会话跟踪. Cookie与服务器创建,与HTTP协议相关,保存在客户端 ...

  9. 计算机启动出现 Invalid Partition Table

    计算机启动出现 Invalid Partition Table 解决办法 使用大白菜启动盘进入临时系统,打开程序DiskGenius 如果系统盘(一般为 C 盘)非活动状态,先激活 如果装系统的硬盘不 ...

  10. UIO,大页内存,CPU亲和性,NUMA机制等

    Linux环境下的UIO(Userspace I/O) UIO 用户空间下驱动程序的支持机制.DPDK使用UIO机制使网卡驱动程序运行在用户态,并采用轮询和零拷贝方式从网卡收取报文,提高收发报文的性能 ...