1036: [ZJOI2008]树的统计Count
1036: [ZJOI2008]树的统计Count
Time Limit: 10 Sec Memory Limit: 162 MB
Submit: 7496 Solved: 3078
[Submit][Status][Discuss]
Description
一棵树上有n个节点,编号分别为1到n,每个节点都有一个权值w。我们将以下面的形式来要求你对这棵树完成一些操作: I. CHANGE u t : 把结点u的权值改为t II. QMAX u v: 询问从点u到点v的路径上的节点的最大权值 III. QSUM u v: 询问从点u到点v的路径上的节点的权值和 注意:从点u到点v的路径上的节点包括u和v本身
Input
输入的第一行为一个整数n,表示节点的个数。接下来n – 1行,每行2个整数a和b,表示节点a和节点b之间有一条边相连。接下来n行,每行一个整数,第i行的整数wi表示节点i的权值。接下来1行,为一个整数q,表示操作的总数。接下来q行,每行一个操作,以“CHANGE u t”或者“QMAX u v”或者“QSUM u v”的形式给出。 对于100%的数据,保证1<=n<=30000,0<=q<=200000;中途操作中保证每个节点的权值w在-30000到30000之间。
Output
对于每个“QMAX”或者“QSUM”的操作,每行输出一个整数表示要求输出的结果。
Sample Input
1 2
2 3
4 1
4 2 1 3
12
QMAX 3 4
QMAX 3 3
QMAX 3 2
QMAX 2 3
QSUM 3 4
QSUM 2 1
CHANGE 1 5
QMAX 3 4
CHANGE 3 6
QMAX 3 4
QMAX 2 4
QSUM 3 4
Sample Output
1
2
2
10
6
5
6
5
16
HINT
Source
题解:phile神犇推荐的链剖模板题,一直不知道为啥挂掉,急死掉= =,最后发现居然把inline去掉就A了QAQ,逗我= =
事实证明——(引用phile神犇的原话)黑科技不可滥用TT
type
point=^node;
node=record
g:longint;
next:point;
end;
var
i,j,k,l,m,n,tot,root:longint;a1:int64;
a:array[..] of point;ch:char;
d,e:array[..] of int64;
len,son,siz,top,list,f,num,anum:array[..] of longint;
c:array[..,..] of longint;
function min(x,y:longint):longint;
begin
if x<y then min:=x else min:=y;
end;
function max(x,y:longint):longint;
begin
if x>y then max:=x else max:=y;
end;
procedure swap(var x,y:longint);
var z:longint;
begin
z:=x;x:=y;y:=z;
end;
procedure add(x,y:longint);
var p:point;
begin
new(p);p^.g:=y;p^.next:=a[x];a[x]:=p;
end;
procedure dfs(y,x:longint);
var p:point;
begin
c[,x]:=y;siz[x]:=;len[x]:=len[y]+;son[x]:=;
p:=a[x];
while p<>nil do
begin
if p^.g<>y then
begin
dfs(x,p^.g);
inc(siz[x],siz[p^.g]);
if (son[x]=) or (siz[p^.g]>siz[son[x]]) then son[x]:=p^.g;
end;
p:=p^.next;
end;
end;
procedure dfs2(y,x,z:longint);
var p:point;
begin
top[x]:=z;inc(tot);num[x]:=tot;anum[tot]:=x;
if son[x]<> then dfs2(x,son[x],z);p:=a[x];
while p<>nil do
begin
if (p^.g<>y) and (p^.g<>son[x]) then dfs2(x,p^.g,p^.g);
p:=p^.next;
end;
end;
procedure built(z,x,y:longint);
begin
if x=y then
begin
list[x]:=z;
d[z]:=f[anum[x]];
e[z]:=d[z];
end
else
begin
built(z*,x ,(x+y) div );
built(z*+,(x+y) div +,y);
d[z]:=d[z*]+d[z*+];
if e[z*+]>e[z*] then e[z]:=e[z*+] else e[z]:=e[z*];
end;
end;
procedure change(x:longint;y:int64);
begin
x:=list[x];d[x]:=y;e[x]:=y;x:=x div ;
while x> do
begin
d[x]:=d[x*]+d[x*+];
if e[x*+]>e[x*] then e[x]:=e[x*+] else e[x]:=e[x*];
x:=x div ;
end;
end;
function sum(z,x,y,l,r:longint):int64;
begin
if l>r then exit();
if (x=l) and (y=r) then exit(d[z]);
exit(sum(z*,x,(x+y) div ,l,min(r,(x+y) div ))+sum(z*+,(x+y) div +,y,max((x+y) div +,l),r));
end;
function getmax(z,x,y,l,r:longint):int64;
var a1,a2:int64;
begin
if l>r then exit(-maxlongint*maxlongint);
if (x=l) and (y=r) then exit(e[z]);
a1:=getmax(z*,x,(x+y) div ,l,min(r,(x+y) div ));
a2:=getmax(z*+,(x+y) div +,y,max((x+y) div +,l),r);
if a1>a2 then exit(a1) else exit(a2);
end;
function getup(x,y:longint):longint;
var i:longint;
begin
i:=;
while y> do
begin
if odd(y) then x:=c[i,x];
inc(i);y:=y div ;
end;
exit(x);
end;
function getcom(x,y:longint):longint;
var i:longint;
begin
if len[x]<len[y] then swap(x,y);
x:=getup(x,len[x]-len[y]);
if x=y then exit(x);
for i:=trunc(round(ln(len[x])/ln())) downto do
if c[i,x]<>c[i,y] then
begin
x:=c[i,x];
y:=c[i,y];
end;
exit(c[,x]);
end;
procedure treechange(x:longint;y:int64);
begin
change(num[x],y);
end;
function treesum(x,y:longint):int64;
var i,z:longint;
begin
z:=getcom(x,y);treesum:=;
repeat
if len[top[x]]<len[z] then i:=z else i:=top[x];
inc(treesum,sum(,,n,num[i],num[x]));
if i=z then break;
x:=c[,i];
until false;
repeat
if len[top[y]]<len[z] then i:=z else i:=top[y];
inc(treesum,sum(,,n,num[i],num[y]));
if i=z then break;
y:=c[,i];
until false;
dec(treesum,sum(,,n,num[z],num[z]));
end;
function treemax(x,y:longint):int64;
var i,z:longint;a1:int64;
begin
treemax:=-maxlongint*maxlongint;
z:=getcom(x,y);
repeat
if len[top[x]]<len[z] then i:=z else i:=top[x];
a1:=getmax(,,n,num[i],num[x]);
if a1>treemax then treemax:=a1;
if i=z then break;
x:=c[,i];
until false;
repeat
if len[top[y]]<len[z] then i:=z else i:=top[y];
a1:=getmax(,,n,num[i],num[y]);
if a1>treemax then treemax:=a1;
if i=z then break;
y:=c[,i];
until false;
end;
begin
readln(n);
for i:= to n do a[i]:=nil;
for i:= to n- do
begin
readln(j,k);
add(j,k);add(k,j);
end;
for i:= to n do read(f[i]);readln;
root:=random(n)+;dfs(,root);dfs2(,root,root);
for i:= to trunc(round(ln(n)/ln()))+ do
for j:= to n do
c[i,j]:=c[i-,c[i-,j]];
built(,,n);
readln(m);
for i:= to m do
begin
read(ch,ch);
case upcase(ch) of
'M':begin
readln(ch,ch,j,k);
writeln(treemax(j,k));
end;
'S':begin
readln(ch,ch,j,k);
writeln(treesum(j,k));
end;
'H':begin
readln(ch,ch,ch,ch,j,a1);
treechange(j,a1);
end;
end;
end;
readln;
end.
1036: [ZJOI2008]树的统计Count的更多相关文章
- BZOJ 1036: [ZJOI2008]树的统计Count [树链剖分]【学习笔记】
1036: [ZJOI2008]树的统计Count Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 14302 Solved: 5779[Submit ...
- BZOJ 1036: [ZJOI2008]树的统计Count
1036: [ZJOI2008]树的统计Count Time Limit: 10 Sec Memory Limit: 162 MB Submit: 14354 Solved: 5802 [Subm ...
- bzoj 1036 [ZJOI2008]树的统计Count(树链剖分,线段树)
1036: [ZJOI2008]树的统计Count Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 10677 Solved: 4313[Submit ...
- Bzoj 1036: [ZJOI2008]树的统计Count 树链剖分,LCT
1036: [ZJOI2008]树的统计Count Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 11102 Solved: 4490[Submit ...
- 数据结构(LCT动态树):BZOJ 1036: [ZJOI2008]树的统计Count
1036: [ZJOI2008]树的统计Count Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 12266 Solved: 4945[Submit ...
- BZOJ 1036: [ZJOI2008]树的统计Count( 树链剖分 )
树链剖分... 不知道为什么跑这么慢 = = 调了一节课啊跪.. ------------------------------------------------------------------- ...
- Luogu 2590 [ZJOI2008]树的统计 / HYSBZ 1036 [ZJOI2008]树的统计Count (树链剖分,LCA,线段树)
Luogu 2590 [ZJOI2008]树的统计 / HYSBZ 1036 [ZJOI2008]树的统计Count (树链剖分,LCA,线段树) Description 一棵树上有n个节点,编号分别 ...
- bzoj 1036: [ZJOI2008]树的统计Count 树链剖分+线段树
1036: [ZJOI2008]树的统计Count Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 16294 Solved: 6645[Submit ...
- bzoj 1036: [ZJOI2008]树的统计Count (树链剖分+线段树 点权)
1036: [ZJOI2008]树的统计Count Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 21194 Solved: 8589[Submit ...
随机推荐
- HDU-2077-汉诺塔IV
题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=2077 这题就我个人认为比较难,做了很久,递推关系式一直找不出正确的来,找很多递推关系,提交了很多次,全 ...
- Failed to register Grid Infrastructure type ora.mdns.type
安装11g的集群软件的时候,在最后运行root.sh脚本时候,没有执行成功,最后提示如下错误: [root@r2 ~]# /u01/app/11.2.0/grid_1/root.sh Performi ...
- ASP.NET MVC和jQuery DataTable整合
本文包含代码示例说明如何jQuery插件开发者可以集成到ASP.NET MVC应用程序. 下载源代码- 87.4 KB Introduction The jQuery DataTables plug- ...
- css全局样式表
http://blog.csdn.net/baok1592/article/details/6448378
- Java之模板方法模式(Template Method)
Java之模板方法模式(Template Method) 1. 概念:定义一个算法的骨架,而将一些实现步骤延迟到子类中. 把不变的行为搬到超类,去除子类中重复的代码来体现他的优势. 2. UML图: ...
- easyui帮助文档地址
http://www.jeasyui.com/documentation/index.php# http://www.jeasyui.net/tutorial/22.html http://www.j ...
- Eclipse TypeScript 安装
一.设置网络代理 1)步骤--window -->>NetWork Conntions-> 2)打开QQ IP代理找一个网速快的IP设置,建议使用美国的.. 二.Install ...
- Xamarin 小试牛刀 通知栏消息通知和按钮(基于Java代码人肉转换)
本示例基于网友现有安卓项目人肉翻译,在Xamarin中替换和修改了很多方法的命名,比如某些属性需要去掉getName的get前缀, 有些方法名称需要使用Pascal命名法替换Java的Camel 命名 ...
- Unity3d获取游戏对象的几种方法
1.GameObject.Find() 通过场景里面的名子或者一个路径直接获取游戏对象. GameObject root = GameObject.Find("GameObject" ...
- 深入理解DOM事件类型系列第六篇——加载事件
前面的话 提到加载事件,可能想到了window.onload,但实际上,加载事件是一大类事件,本文将详细介绍加载事件 load load事件是最常用的一个事件,当页面完全加载后(包括所有图像.java ...