bzoj 1180 LCT
来源:互联网 发布:郫都区人民政府 知乎 编辑:程序博客网 时间:2024/05/19 01:14
给出n个结点以及每个点初始时对应的权值wi。起始时点与点之间没有连边。有3类操作: 1、bridge A B:询问结点A与结点B是否连通。如果是则输出“no”。否则输出“yes”,并且在结点A和结点B之间连一条无向边。 2、penguins A X:将结点A对应的权值wA修改为X。 3、excursion A B:如果结点A和结点B不连通,则输出“impossible”。否则输出结点A到结点B的路径上的点对应的权值的和。给出q个操作,要求在线处理所有操作。数据范围:1<=n<=30000, 1<=q<=300000, 0<=wi<=1000。
LCT模板题...
var n,m,x,y :longint; i :longint; ch :char; s :string; son :array[-1..30010,0..1] of longint; father,sum :array[-1..30010] of longint; flag :array[-1..30010] of boolean; w :array[-1..30010] of longint;procedure swap(var a,b:longint);var c:longint;begin c:=a; a:=b; b:=c;end;procedure update(x:longint);begin sum[x]:=sum[son[x,0]]+sum[son[x,1]]+w[x];end;function root(x:longint):boolean;begin if x=son[father[x],0] then exit(false); if x=son[father[x],1] then exit(false); exit(true);end;procedure renew(x:longint);begin flag[x]:=not flag[x];end;procedure push_down(x:longint);begin if flag[x] then begin swap(son[x,0],son[x,1]); if son[x,0]<>-1 then renew(son[x,0]); if son[x,1]<>-1 then renew(son[x,1]); end; flag[x]:=false;end;procedure push(x:longint);begin if not root(x) then push(father[x]); push_down(x);end;procedure ro(x,y:longint);var f:longint;begin f:=father[x]; if son[x,y xor 1]<>-1 then father[son[x,y xor 1]]:=f; son[f,y]:=son[x,y xor 1]; if f=son[father[f],0] then son[father[f],0]:=x else if f=son[father[f],1] then son[father[f],1]:=x; father[x]:=father[f]; father[f]:=x; son[x,y xor 1]:=f; update(f); update(x);end;procedure splay(x:longint);var u,v:longint;begin while not root(x) do begin if root(father[x]) then ro(x,ord(x=son[father[x],1])) else begin if x=son[father[x],0] then u:=-1 else u:=1; if father[x]=son[father[father[x]],0] then v:=-1 else v:=1; if u*v=1 then begin ro(father[x],ord(x=son[father[x],1])); ro(x,ord(x=son[father[x],1])); end else begin ro(x,ord(x=son[father[x],1])); ro(x,ord(x=son[father[x],1])); end; end; end; update(x);end;procedure access(x:longint);var y:longint;begin y:=-1; while x<>0 do begin push(x); splay(x); son[x,1]:=y; update(x); y:=x; x:=father[x]; end;end;procedure link(x,y:longint);begin access(x); splay(x); renew(x); access(y); splay(y); son[y,1]:=x; father[x]:=y; update(y);end;function find_root(x:longint):longint;begin access(x); splay(x); while son[x,0]<>-1 do x:=son[x,0]; exit(x);end;begin read(n); for i:=1 to n do read(w[i]); for i:=1 to n do sum[i]:=w[i]; fillchar(son,sizeof(son),255); readln(m); for i:=1 to m do begin read(ch); s:=''; while(ch<>' ') do begin s:=s+ch; read(ch); end; if s='bridge' then begin readln(x,y); if find_root(x)=find_root(y) then writeln('no') else begin writeln('yes'); link(x,y); end; end else if s='penguins' then begin readln(x,y); access(x); splay(x); renew(x); w[x]:=y; update(x); end else begin readln(x,y); if find_root(x)<>find_root(y) then writeln('impossible') else begin access(x); splay(x); renew(x); access(y); splay(y); writeln(sum[y]); end; end; end;end.——by Eirlys
0 0
- bzoj 1180 LCT
- bzoj 1180 [CROATIAN2009]OTOCI - LCT
- 【BZOJ 1180】[CROATIAN2009]OTOCI LCT
- bzoj 1180 OTOCI LCT 解题报告
- BZOJ 1180: [CROATIAN2009]OTOCI (LCT题解)
- BZOJ 2002 LCT
- bzoj 1036 [LCT version]
- BZOJ 2631 tree LCT
- 【LCT】BZOJ 2631:tree
- bzoj 2959: 长跑 lct
- BZOJ 2631 Tree LCT
- BZOJ 2049 LCT
- BZOJ 2631 tree LCT
- 【BZOJ 2631】tree LCT
- 【BZOJ 3282】Tree LCT
- bzoj 2843 LCT模板
- bzoj 2049 LCT模板
- bzoj 3282 LCT
- 新手开发Java web常见的一些问题
- java回文串判定
- Ubuntu的i启动器消失不见了
- Impala与Hive的比较
- 编程之美-2.14 求数组的子数组之和的最大值
- bzoj 1180 LCT
- 欢迎使用CSDN-markdown编辑器
- poj 2528 线段树 离散化()
- 【二】数据结构之List
- 时间日期格式转换
- 二叉树的镜像
- 基于QT的五子棋音乐部分功能
- sql语句
- 【Question】I/O函数