好题,先离线把连通块变成连续的区间
每次连通块合并就相当于两个区间合并
这样就轻易的用线段树解决了

 type node=record
wh:string[];
x,y:longint;
end; var lazy,tree:array[..*] of longint;
q:array[..] of node;
a,b,c,last,next,fa:array[..] of longint;
i,n,m,x,y,t:longint;
ch:char; procedure swap(var a,b:longint);
var c:longint;
begin
c:=a;
a:=b;
b:=c;
end; function max(a,b:longint):longint;
begin
if a>b then exit(a) else exit(b);
end; function getf(x:longint):longint;
begin
if fa[x]<>x then fa[x]:=getf(fa[x]);
exit(fa[x]);
end; procedure push(i:longint);
begin
inc(lazy[i*],lazy[i]);
inc(tree[i*],lazy[i]);
inc(lazy[i*+],lazy[i]);
inc(tree[i*+],lazy[i]);
lazy[i]:=;
end; function ask(i,l,r,x,y:longint):longint;
var m,s:longint;
begin
if (x<=l) and (y>=r) then exit(tree[i])
else begin
if lazy[i]<> then push(i);
m:=(l+r) shr ;
s:=-;
if x<=m then s:=ask(i*,l,m,x,y);
if y>m then s:=max(s,ask(i*+,m+,r,x,y));
exit(s);
end;
end; procedure add(i,l,r,x,y,z:longint);
var m:longint;
begin
if (x<=l) and (y>=r) then
begin
inc(tree[i],z);
inc(lazy[i],z);
end
else begin
if lazy[i]<> then push(i);
m:=(l+r) shr ;
if x<=m then add(i*,l,m,x,y,z);
if y>m then add(i*+,m+,r,x,y,z);
tree[i]:=max(tree[i*],tree[i*+]);
end;
end; procedure build(i,l,r:longint);
var m:longint;
begin
if l=r then tree[i]:=a[c[l]]
else begin
m:=(l+r) shr ;
build(i*,l,m);
build(i*+,m+,r);
tree[i]:=max(tree[i*],tree[i*+]);
end;
end; begin
readln(n);
for i:= to n do
begin
read(a[i]);
fa[i]:=i;
last[i]:=i;
end;
readln(m);
for i:= to m do
begin
read(ch);
q[i].wh:=ch;
read(ch);
q[i].wh:=q[i].wh+ch;
if q[i].wh='U ' then
begin
readln(q[i].x,q[i].y);
x:=getf(q[i].x);
y:=getf(q[i].y);
if x=y then continue;
fa[y]:=x;
next[last[x]]:=y;
last[x]:=last[y];
end
else if (q[i].wh='A1') or (q[i].wh='A2') then
readln(q[i].x,q[i].y)
else if (q[i].wh='F3') then readln
else readln(q[i].x);
end; for i:= to n do
if fa[i]=i then
begin
x:=i;
while x<> do
begin
inc(t);
b[x]:=t;
c[t]:=x;
x:=next[x];
end;
end; build(,,n);
for i:= to n do
begin
fa[i]:=i;
last[i]:=i;
end; for i:= to m do
if q[i].wh='U ' then
begin
x:=getf(q[i].x);
y:=getf(q[i].y);
if x=y then continue;
fa[y]:=x;
last[x]:=last[y];
end
else if q[i].wh='A1' then
add(,,n,b[q[i].x],b[q[i].x],q[i].y)
else if q[i].wh='A2' then
begin
x:=getf(q[i].x);
y:=last[x];
add(,,n,b[x],b[y],q[i].y);
end
else if q[i].wh='A3' then
begin
inc(tree[],q[i].x);
inc(lazy[],q[i].x);
end
else if q[i].wh='F1' then
writeln(ask(,,n,b[q[i].x],b[q[i].x]))
else if q[i].wh='F2' then
begin
x:=getf(q[i].x);
y:=last[x];
writeln(ask(,,n,b[x],b[y]));
end
else writeln(tree[]);
end.

bzoj2333的更多相关文章

  1. 【bzoj2333】 SCOI2011—棘手的操作

    http://www.lydsy.com/JudgeOnline/problem.php?id=2333 (题目链接) 题意 N个节点维护一些操作.. Solution 我们用可并大根堆进行维护. 对 ...

  2. 【BZOJ2333】棘手的操作(左偏树,STL)

    [BZOJ2333]棘手的操作(左偏树,STL) 题面 BZOJ上看把... 题解 正如这题的题号 我只能\(2333\) 神TM棘手的题目... 前面的单点/联通块操作 很显然是一个左偏树+标记 ( ...

  3. 【BZOJ2333】【SCOI2011】棘手的操作 treap合并

    题目大意 有\(n\)个节点,标号从1到\(n\),这\(n\)个节点一开始相互不连通.第\(i\)个节点的初始权值为\(a_i\),接下来有如下一些操作: \(U~x~y\):加一条边,连接第\(x ...

  4. BZOJ2333 [SCOI2011]棘手的操作 堆 左偏树 可并堆

    欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ2333 题意概括 有N个节点,标号从1到N,这N个节点一开始相互不连通.第i个节点的初始权值为a[i ...

  5. 【bzoj2333 & luoguP3273】棘手的操作(线段树合并)

    题目传送门:bzoj2333 luoguP3273 这操作还真“棘手”..听说这题是可并堆题?然而我不会可并堆.于是我就写了线段数合并,然后调了一晚上,数据结构毁一生!!!QAQ…… 其实这题也可以把 ...

  6. BZOJ2333 棘手的操作

    Description ​ 有N个节点,标号从1到N,这N个节点一开始相互不连通.第i个节点的初始权值为a[i],接下来有如下一些操作: U x y: 加一条边,连接第x个节点和第y个节点 A1 x ...

  7. 【bzoj2333】 [SCOI2011]棘手的操作 可并堆+lazy标记

    2016-05-31  21:45:41 题目:http://www.lydsy.com/JudgeOnline/problem.php?id=2333 (学习了黄学长的代码 有如下操作: U x y ...

  8. bzoj2333 [SCOI2011]棘手的操作

    用set维护每个联通块里的最值,multiset维护所有块里的最值,并查集维护连通性,然后随便搞搞就行了,合并时候采用启发式合并.复杂度O(nlognlogn),大概勉强过的程度,反正跑的很慢就是了. ...

  9. [bzoj2333] [SCOI2011]棘手的操作 (可并堆)

    //以后为了凑字数还是把题面搬上来吧2333 发布时间果然各种应景... Time Limit: 10 Sec  Memory Limit: 128 MB Description 有N个节点,标号从1 ...

随机推荐

  1. Asp.Net alert弹出提示信息的5种方法

    1.ClientScript.RegisterStartupScript(GetType(),"message","<script>alert('第一种方式, ...

  2. php注册登录时生成的验证码

    http://blog.sina.com.cn/s/blog_8173443e01012l82.html 记得我学php时第一件事就是研究登陆注册.当然,登陆少不了验证码.两年过去了,昨天突然想用个验 ...

  3. 免费vpn

    http://www.freevpnmac.com/macvpn/ 下边有个滑动解锁,拖动鼠标至右边解锁,点击Get vpn info,得到vpn地址ip和用户密码. 我用安卓手机测试了下完全可以,但 ...

  4. 周末充电之WPF(四).多窗口之间操作

    多窗口实例: 1.在多个窗口的情况下如何自定义指定要启动的窗口程序 <Application x:Class="toolbar.App" xmlns="http:/ ...

  5. Solr 1.3 安装步骤

    可以通过以下三种方式之一设置   Solr   的主位置: 1.设置   java   系统属性   solr.solr.home   (没错,就是  solr.solr.home).    2.配置 ...

  6. SDL实现按钮

    是的,按钮控件很常见,几乎在每一个Windows窗体内都能找到它的身影.SDL作为一套“一套开放源代码的跨平台多媒体开发库”,自然可以实现按钮.而按钮实现的重点,就是SDL的鼠标响应事件. SDL的鼠 ...

  7. mongodb下载及安装配置教程【仅供参考】

    1 下载 下载页面地址:https://www.mongodb.org/downloads 版本选择:电脑系统是64位的,所以我选择了 Windows 64-bit 2008 R2+ ,msi包 2 ...

  8. javaScript笔记1

    一.通过 id 访问HTML元素,可以使用 document.getElementById(id) 方法. 例子: <body> <button id="mybtn&quo ...

  9. OpenCV(4)-图像掩码操作(卷积)--平滑处理

    卷积定义 矩阵的掩码操作即对图像进行卷积.对图像卷积操作的意义为:邻近像素对(包括该像素自身)对新像素的影响:影响大小取决于卷积核对应位置值得大小. 例如:图像增强可以使用 \[ I(i,j)=5*I ...

  10. 【搭建开发环境】在 Windows XP 中参与开源项目,搭建 git 和 cygwin 开发环境

    引言 只有一台 Windows XP 家用机,却想在诸如 Git@OSC 之类的开源社区参与开发,本文提供一个入门级的开发环境搭建指引. 涉及工具:Eclipse,EGit,Cygwin. 欢迎来到 ...