bzoj2333
好题,先离线把连通块变成连续的区间
每次连通块合并就相当于两个区间合并
这样就轻易的用线段树解决了
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的更多相关文章
- 【bzoj2333】 SCOI2011—棘手的操作
http://www.lydsy.com/JudgeOnline/problem.php?id=2333 (题目链接) 题意 N个节点维护一些操作.. Solution 我们用可并大根堆进行维护. 对 ...
- 【BZOJ2333】棘手的操作(左偏树,STL)
[BZOJ2333]棘手的操作(左偏树,STL) 题面 BZOJ上看把... 题解 正如这题的题号 我只能\(2333\) 神TM棘手的题目... 前面的单点/联通块操作 很显然是一个左偏树+标记 ( ...
- 【BZOJ2333】【SCOI2011】棘手的操作 treap合并
题目大意 有\(n\)个节点,标号从1到\(n\),这\(n\)个节点一开始相互不连通.第\(i\)个节点的初始权值为\(a_i\),接下来有如下一些操作: \(U~x~y\):加一条边,连接第\(x ...
- BZOJ2333 [SCOI2011]棘手的操作 堆 左偏树 可并堆
欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ2333 题意概括 有N个节点,标号从1到N,这N个节点一开始相互不连通.第i个节点的初始权值为a[i ...
- 【bzoj2333 & luoguP3273】棘手的操作(线段树合并)
题目传送门:bzoj2333 luoguP3273 这操作还真“棘手”..听说这题是可并堆题?然而我不会可并堆.于是我就写了线段数合并,然后调了一晚上,数据结构毁一生!!!QAQ…… 其实这题也可以把 ...
- BZOJ2333 棘手的操作
Description 有N个节点,标号从1到N,这N个节点一开始相互不连通.第i个节点的初始权值为a[i],接下来有如下一些操作: U x y: 加一条边,连接第x个节点和第y个节点 A1 x ...
- 【bzoj2333】 [SCOI2011]棘手的操作 可并堆+lazy标记
2016-05-31 21:45:41 题目:http://www.lydsy.com/JudgeOnline/problem.php?id=2333 (学习了黄学长的代码 有如下操作: U x y ...
- bzoj2333 [SCOI2011]棘手的操作
用set维护每个联通块里的最值,multiset维护所有块里的最值,并查集维护连通性,然后随便搞搞就行了,合并时候采用启发式合并.复杂度O(nlognlogn),大概勉强过的程度,反正跑的很慢就是了. ...
- [bzoj2333] [SCOI2011]棘手的操作 (可并堆)
//以后为了凑字数还是把题面搬上来吧2333 发布时间果然各种应景... Time Limit: 10 Sec Memory Limit: 128 MB Description 有N个节点,标号从1 ...
随机推荐
- temporary
private void OnAttendeeConnected(object pObjAttendee) { IRDPSRAPIAttendee pAttendee = pObjAttendee a ...
- php注册登录时生成的验证码
http://blog.sina.com.cn/s/blog_8173443e01012l82.html 记得我学php时第一件事就是研究登陆注册.当然,登陆少不了验证码.两年过去了,昨天突然想用个验 ...
- WPF:保存窗口当前状态截图方法
在制作软件使用手册或者操作示范市,比较常用方式有截图和视频制作.如果软件内置当前状态的截图和操作视频的导出功能,则将极大简化这方面的工作.使用wpf编写的UI界面,截图的导出功能逻辑相对简单,通用的实 ...
- Oracle 11g gateways(透明网关)配置
配置要点主要有三点: 1.%GATEWAYS_HOME%(透明网关安装目录)\dg4msql\admin\initdg4msql.ora 内容: HS_FDS_CONNECT_INFO=localho ...
- Moving Tables
Moving Tables Time Limit : 2000/1000ms (Java/Other) Memory Limit : 65536/32768K (Java/Other) Total ...
- Hibernate的检索策略
hibernate 的中的session依照load()和get()按照参数的制定OID(ObjctID)去加载一个持久化对象.另外Query.list()方法则按照HQL语句去加载持久化的对象. 以 ...
- ASP.NET中的验证控件
ASP.NET提供了如下的控件: RequiredFieldValidator: 字段必填 (ControlTovalidate设定要验证的控件) RangeValidator: 值在给定的最大值,最 ...
- c#语音
1.新建WinForm程序,项目名称命名为Speech. 2.在COM组件中添加SpeechLib的引用. using SpeechLib;//添加语音引用 添加一个文本框并将其重命名为txtCont ...
- 如何判断list中是否包含某个元素
在python中可以通过in和not in关键字来判读一个list中是否包含一个元素: str = ['s','i','m','o','n'] if 'e' in str: print("e ...
- mvc中的OutputCache
mvc4中有一个标记属性OutputCache,用来对ActionResult结果进行缓存,如何理解呢?概括地说,就是当你的请求参数没有发生变化时,直接从缓存中取结果,不会再走服务端的Action代码 ...