bzoj千题计划217:bzoj2333: [SCOI2011]棘手的操作
http://www.lydsy.com/JudgeOnline/problem.php?id=2333
读入所有数据,先模拟一遍所有的合并操作
我们不关心联通块长什么样,只关心联通块内有谁
所以可以把一个联通块用一个链表存储
合并x和y时,y的链表整体接到x的链表后面
这样就成了线性结构
按照链表顺序重新给序列标号即可用线段树维护
一遍过,^_^

#include<cstdio>
#include<iostream>
#include<algorithm> using namespace std; #define N 300001 int a[N]; struct Data
{
char s[];
int x,y;
}data[N]; int fa[N],nxt[N],ed[N]; int id[N],dy[N]; int mx[N<<],f[N<<]; int ans; void read(int &x)
{
x=; int f=; char c=getchar();
while(!isdigit(c)) { if(c=='-') f=-; c=getchar(); }
while(isdigit(c)) { x=x*+c-''; c=getchar(); }
x*=f;
} void build(int k,int l,int r)
{
if(l==r)
{
mx[k]=a[id[l]];
return;
}
int mid=l+r>>;
build(k<<,l,mid);
build(k<<|,mid+,r);
mx[k]=max(mx[k<<],mx[k<<|]);
} void down(int k)
{
mx[k<<]+=f[k];
mx[k<<|]+=f[k];
f[k<<]+=f[k];
f[k<<|]+=f[k];
f[k]=;
} void add(int k,int l,int r,int opl,int opr,int w)
{
if(l>=opl && r<=opr)
{
f[k]+=w;
mx[k]+=w;
return;
}
if(f[k]) down(k);
int mid=l+r>>;
if(opl<=mid) add(k<<,l,mid,opl,opr,w);
if(opr>mid) add(k<<|,mid+,r,opl,opr,w);
mx[k]=max(mx[k<<],mx[k<<|]);
} void query(int k,int l,int r,int opl,int opr)
{
if(l>=opl && r<=opr)
{
ans=max(ans,mx[k]);
return;
}
if(f[k]) down(k);
int mid=l+r>>;
if(opl<=mid) query(k<<,l,mid,opl,opr);
if(opr>mid) query(k<<|,mid+,r,opl,opr);
} int find(int i)
{
return fa[i]==i ? i : fa[i]=find(fa[i]);
} int main()
{
int n,m;
read(n);
for(int i=;i<=n;++i) read(a[i]);
for(int i=;i<=n;++i) fa[i]=i,ed[i]=i;
char s[]; int x,y;
int fx,fy;
read(m);
for(int i=;i<=m;++i)
{
scanf("%s",data[i].s);
if(!(data[i].s[]=='F' && data[i].s[]=='')) read(data[i].x);
if(data[i].s[]=='U' || data[i].s[]=='A' && data[i].s[]!='') read(data[i].y);
if(data[i].s[]=='U')
{
fx=find(data[i].x);
fy=find(data[i].y);
nxt[ed[fx]]=fy;
ed[fx]=ed[fy];
fa[fy]=fx;
}
}
int tot=;
for(int i=;i<=n;++i)
if(find(i)==i)
{
int j=i;
while(j!=ed[i])
{
id[++tot]=j;
dy[j]=tot;
j=nxt[j];
}
id[++tot]=j;
dy[j]=tot;
}
build(,,n);
for(int i=;i<=n;++i) fa[i]=i,ed[i]=i;
int all=;
for(int i=;i<=m;++i)
{
if(data[i].s[]=='U')
{
fx=find(data[i].x);
fy=find(data[i].y);
nxt[ed[fx]]=fy;
ed[fx]=ed[fy];
fa[fy]=fx;
}
else if(data[i].s[]=='A')
{
if(data[i].s[]=='') add(,,n,dy[data[i].x],dy[data[i].x],data[i].y);
else if(data[i].s[]=='') add(,,n,dy[find(data[i].x)],dy[ed[find(data[i].x)]],data[i].y);
else all+=data[i].x;
}
else
{
if(data[i].s[]=='')
{
ans=-1e9;
query(,,n,dy[data[i].x],dy[data[i].x]);
printf("%d\n",ans+all);
}
else if(data[i].s[]=='')
{
ans=-1e9;
query(,,n,dy[find(data[i].x)],dy[ed[find(data[i].x)]]);
printf("%d\n",ans+all);
}
else printf("%d\n",mx[]+all);
}
}
}
bzoj千题计划217: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千题计划218: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& ...
随机推荐
- POJ3261:Milk Patterns
题面 vjudge Sol 二分答案+分组,判断有没有一个组的后缀个数不小于 k 做法 # include <bits/stdc++.h> # define IL inline # def ...
- iOS开发--XMPPFramework--用户登录(三)
创了一个XMPP即时通讯交流群140147825,欢迎大家来交流~我们是一起写代码的弟兄~ 我们在第一篇文章中,已经介绍了Openfire服务器的搭建等环境的配置, 第二篇文章中,导入了XMPPFra ...
- linux系统文件扩展名介绍
1.源码tar.tar.gz .tgz.zip.tar.bz 表示压缩文件,创建命令等 2.sh表示shell脚本文件,通过shell语言开发的程序. 3.pl 表示perl语言文件,通过perl语言 ...
- Flex 关于 keyDown事件的添加和移除(另附添加事件的执行带参数的函数)
今天遇到一个棘手的问题,原本的textInput控件有一个keyDown事件,但是不是所有的用户都需要,麻烦了首先先删除控件里面的keyDown,这个事件放在这谁都得用,我就是不想用这就实现不了,怎么 ...
- ASP.NET Core Web API下事件驱动型架构的实现(四):CQRS架构中聚合与聚合根的实现
在前面两篇文章中,我详细介绍了基本事件系统的实现,包括事件派发和订阅.通过事件处理器执行上下文来解决对象生命周期问题,以及一个基于RabbitMQ的事件总线的实现.接下来对于事件驱动型架构的讨论,就需 ...
- libpqxx接口的在linux下的使用,解决psql:connections on Unix domain socket "/tmp/.s.PGSQL.5432"错误
在项目中使用postgresql数据库时要求在windows和linux双平台兼容.于是在windows下使用的接口在linux下爆出异常: psql:connections on Unix doma ...
- 制作windows系统合盘:把win7和win8/8.1打包在一起
平时装系统的时候我比较喜欢win8.1,但是经常给别人装系统的时候别人很多都喜欢win7,但是我觉得这样很麻烦,于是就想做一个合盘,这样就很方便了,win7旗舰版里面其实封装了四个系统,或者说一个系统 ...
- python 对象和json互相转换
一.python对json的支持 从python2.6开始,python标准库中添加了对json的支持,操作json时,只需要import json即可. 二.python对象转换成json字符串 在 ...
- 解决Centos7本机时间与实际时间相差8小时
# timedatectl Local -- :: CST Universal -- :: UTC #相差8小时 RTC -- :: Time zone: Asia/Shanghai (CST, +) ...
- 8.String StringBuffer StringBuilder
http://www.cnblogs.com/xiohao/p/4271140.html