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

 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. 深入理解Java的接口和抽象类 _摘抄

    http://www.cnblogs.com/dolphin0520/p/3811437.html 原文 深入理解Java的接口和抽象类 对于面向对象编程来说,抽象是它的一大特征之一.在Java中,可 ...

  2. C++学习笔记3—对话框

    1.模态对话框 CTipDlg tipDlg; INT_PTR nResponse = tipDlg.DoModal(); if(nResponse == IDCANCEL) {  return; } ...

  3. Xcode6.1模拟器ios8.1模拟器不能弹出虚拟键盘及虚拟键盘无法切换中文输入的解决办法

    1.不能弹出虚拟键盘的解决办法 模拟器菜单Hardware->Keyboard->Connect Hardware Keyboard取消选中,快捷键commad+shift+K 2.虚拟键 ...

  4. Javascript模仿C语言的链表实现(增删改查),并且使用控制台输入输出

    Js新手最近在研究Js数据结构,刚好看到链表实现这一块儿,觉得有些资料和自己理解的有冲突,于是借着自己以前一点点C语言的基础,用Javascript模仿了C的链表实现,并且用了process.stdi ...

  5. 【技术·水】浅谈Dism++清理插件开发

    前言 昨天我发布了NCleaner,一款Dism++清理插件(地址:http://bbs.pcbeta.com/viewthread-1692182-1-1.html) 有些人想要我开源NCleane ...

  6. ubuntu server修改时区

    公司用的是ubuntu server 服务器在美国亚马逊VPS 现在要修改时区 执行:tzselect 或直接修改 /etc/timezone 文件,我是改成(America/Los_Angeles) ...

  7. bootstrap Tooltip换行问题

    bootstrap自身带有tooltip,使用起来很方便,但是美中不足,它的tooltip并不支持换行. 比如我们通过<textarea>输入框传入到数据库的长文本,文本是带有换行符的,但 ...

  8. smarty

    模板引擎是用于把模板文件和数据内容合并在一起的程序,便于网站开发有利于代码分离和维护,了解一个模板最好知道其工作原理,以便于实现一通万通. 模板文件一般是HTML xml js等类型文件,如果不用模板 ...

  9. php curl模拟post请求提交数据

    最近在做校园图书馆图书信息的采集程序,既然是图书馆图书的采集,肯定有提交搜索的页面,无非是post提交,让我想到了curl模拟提交,首先通过firebug进行抓包查询下post提交后的格式如下: tx ...

  10. Omnithreadlibary学习(2)-IOmniTask异步执行

    1.使用 procedure Parallel.Async(task: TProc; taskConfig: IOmniTaskConfig); 匿名委托访问网站 program main; {$AP ...