不难想到树链剖分
这题的难点是记录的是路径上宗教相同的点
裸的想法是对每一种宗教都开一棵线段树,记录每个点的评级
但显然这样会爆空间,仔细分析一下,这些线段树内很多点压根就没用到
因此我们考虑对线段树动态开点,不难发现每次修改最多要开线段树上O(2*logn)个点,是可以接受的
然后就是打码的问题了

 type node=record
po,next:longint;
end;
link=record
l,r,s,m:longint;
end; var tree:array[..*] of link;
fa,size,d,top,p,c,h,b,w:array[..] of longint;
e:array[..] of node;
len,t,i,n,q,x,y:longint;
ch:char; function max(a,b:longint):longint;
begin
if a>b then exit(a) else exit(b);
end; procedure swap(var a,b:longint);
var c:longint;
begin
c:=a;
a:=b;
b:=c;
end; procedure add(x,y:longint);
begin
inc(len);
e[len].po:=y;
e[len].next:=p[x];
p[x]:=len;
end; procedure update(x:longint);
begin
tree[x].s:=tree[tree[x].l].s+tree[tree[x].r].s;
tree[x].m:=max(tree[tree[x].l].m,tree[tree[x].r].m);
end; procedure dfs1(x:longint);
var i,y:longint;
begin
size[x]:=;
i:=p[x];
while i<> do
begin
y:=e[i].po;
if fa[x]<>y then
begin
d[y]:=d[x]+;
fa[y]:=x;
dfs1(y);
size[x]:=size[x]+size[y];
end;
i:=e[i].next;
end;
end; procedure dfs2(x:longint);
var i,y,q:longint;
begin
q:=;
inc(t);
c[x]:=t;
i:=p[x];
while i<> do
begin
y:=e[i].po;
if (c[y]=) and (size[y]>size[q]) then q:=y;
i:=e[i].next;
end;
if q<> then
begin
top[q]:=top[x];
dfs2(q);
end;
i:=p[x];
while i<> do
begin
y:=e[i].po;
if c[y]= then
begin
top[y]:=y;
dfs2(y);
end;
i:=e[i].next;
end;
end; function change(last,l,r,x,y:longint):longint;
var m,q:longint;
begin
inc(t);
if l=r then
begin
tree[t].m:=y;
tree[t].s:=y;
exit(t);
end
else begin
m:=(l+r) shr ;
q:=t;
if x<=m then
begin
tree[q].r:=tree[last].r;
last:=tree[last].l;
tree[q].l:=change(last,l,m,x,y);
end
else begin
tree[q].l:=tree[last].l;
last:=tree[last].r;
tree[q].r:=change(last,m+,r,x,y);
end;
update(q);
exit(q);
end;
end; function getmax(now,l,r,x,y:longint):longint;
var m,q:longint;
begin
if (x<=l) and (y>=r) then exit(tree[now].m)
else begin
m:=(l+r) shr ;
q:=;
if (x<=m) and (tree[now].l<>) then q:=getmax(tree[now].l,l,m,x,y);
if (y>m) and (tree[now].r<>) then q:=max(q,getmax(tree[now].r,m+,r,x,y));
exit(q);
end;
end; function getsum(now,l,r,x,y:longint):longint;
var m,q:longint;
begin
if (x<=l) and (y>=r) then exit(tree[now].s)
else begin
m:=(l+r) shr ;
q:=;
if (x<=m) and (tree[now].l<>) then q:=q+getsum(tree[now].l,l,m,x,y);
if (y>m) and (tree[now].r<>) then q:=q+getsum(tree[now].r,m+,r,x,y);
exit(q);
end;
end; function maxx(x,y:longint):longint;
var f1,f2,re:longint;
begin
maxx:=;
re:=b[x];
f1:=top[x];
f2:=top[y];
while f1<>f2 do
begin
if d[f1]>=d[f2] then
begin
maxx:=max(maxx,getmax(h[re],,n,c[f1],c[x]));
x:=fa[f1];
end
else begin
maxx:=max(maxx,getmax(h[re],,n,c[f2],c[y]));
y:=fa[f2];
end;
f1:=top[x];
f2:=top[y];
end;
if c[x]>c[y] then swap(x,y);
maxx:=max(maxx,getmax(h[re],,n,c[x],c[y]));
end; function ask(x,y:longint):longint;
var f1,f2,re:longint;
begin
ask:=;
re:=b[x];
f1:=top[x];
f2:=top[y];
while f1<>f2 do
begin
if d[f1]>=d[f2] then
begin
ask:=ask+getsum(h[re],,n,c[f1],c[x]);
x:=fa[f1];
end
else begin
ask:=ask+getsum(h[re],,n,c[f2],c[y]);
y:=fa[f2];
end;
f1:=top[x];
f2:=top[y];
end;
if c[x]>c[y] then swap(x,y);
ask:=ask+getsum(h[re],,n,c[x],c[y]);
end; begin
readln(n,q);
for i:= to n do
readln(w[i],b[i]);
for i:= to n- do
begin
readln(x,y);
add(x,y);
add(y,x);
end;
d[]:=;
dfs1();
top[]:=;
dfs2();
t:=;
for i:= to n do
h[b[i]]:=change(h[b[i]],,n,c[i],w[i]);
for i:= to q do
begin
read(ch);
if ch='C' then
begin
readln(ch,x,y);
if ch='C' then
begin
h[b[x]]:=change(h[b[x]],,n,c[x],);
b[x]:=y;
h[y]:=change(h[y],,n,c[x],w[x]);
end
else begin
w[x]:=y;
h[b[x]]:=change(h[b[x]],,n,c[x],y);
end;
end
else begin
readln(ch,x,y);
if ch='M' then
writeln(maxx(x,y))
else writeln(ask(x,y));
end;
end;
end.

bzoj3531的更多相关文章

  1. 【BZOJ3531】[Sdoi2014]旅行 树链剖分+动态开点线段树

    [BZOJ3531][Sdoi2014]旅行 Description S国有N个城市,编号从1到N.城市间用N-1条双向道路连接,满足从一个城市出发可以到达其它所有城市.每个城市信仰不同的宗教,如飞天 ...

  2. 【BZOJ3531】旅行(树链剖分,线段树)

    [BZOJ3531]旅行(树链剖分,线段树) 题面 Description S国有N个城市,编号从1到N.城市间用N-1条双向道路连接,满足 从一个城市出发可以到达其它所有城市.每个城市信仰不同的宗教 ...

  3. BZOJ3531 [Sdoi2014]旅行 树链剖分 线段树

    原文链接:http://www.cnblogs.com/zhouzhendong/p/8080189.html 题目传送门 - BZOJ3531 题意概括 一棵树,n个节点,每一个节点两个值,一个颜色 ...

  4. 【bzoj3531】 [SDOI2014]旅行

    题目描述 S国有N个城市,编号从1到N.城市间用N-1条双向道路连接,满足从一个城市出发可以到达其它所有城市.每个城市信仰不同的宗教,如飞天面条神教.隐形独角兽教.绝地教都是常见的信仰.为了方便,我们 ...

  5. Bzoj3531: [Sdoi2014]旅行

    Time Limit: 20 Sec  Memory Limit: 512 MBSubmit: 1698  Solved: 758 Description S国有N个城市,编号从1到N.城市间用N-1 ...

  6. bzoj3531——树链剖分+动态开点线段树

    3531: [Sdoi2014]旅行 Time Limit: 20 Sec  Memory Limit: 512 MB Description S国有N个城市,编号从1到N.城市间用N-1条双向道路连 ...

  7. 【BZOJ3531】【SDOI2014】旅行

    题目传送门 题目大意:给定一棵无根树,每个节点有自己的类别和权值,现在给定两个类别相同的点,叫你求这2点路径上同类别节点的权值和/最大权值. 节点类别与权值会改变. 解题思路:考虑对每一个类别开一棵线 ...

  8. BZOJ3531 树剖 + 动态开点线段树

    https://www.lydsy.com/JudgeOnline/problem.php?id=3531 首先这题意要求树链上的最大值以及求和,其树链剖分的做法已经昭然若揭 问题在于这次的信息有宗教 ...

  9. BZOJ3531[Sdoi2014]旅行——树链剖分+线段树

    题目描述 S国有N个城市,编号从1到N.城市间用N-1条双向道路连接,满足从一个城市出发可以到达其它所有城市.每个城市信仰不同的宗教,如飞天面条神教.隐形独角兽教.绝地教都是常见的信仰.为了方便,我们 ...

随机推荐

  1. iOS--为视图添加阴影

    iOS–为视图添加阴影 情况一:视图添加圆角,在添加阴影 //阴影视图 self.viewShadow = [[UIView alloc]initWithFrame:CGRectMake(0, 0, ...

  2. Android(java)学习笔记212:中文乱码的问题处理(qq登录案例)

    1.我们在之前的笔记中LoginServlet.java中,我们Tomcat服务器回复给客户端的数据是英文的"Login Success","Login Failed&q ...

  3. Mac OS命令行运行Sublime Text

    Opening Sublime Text on command line as subl on Mac OS? Mac OS subl http://www.phodal.com/blog/mac-o ...

  4. DataTable用法

    在项目中经常用到DataTable,如果DataTable使用得当,不仅能使程序简洁实用,而且能够提高性能,达到事半功倍的效果,现对DataTable的使用技巧进行一下总结. 一.DataTable简 ...

  5. 用户输出表单处理php

    php中的表单输入处理,我用两个文件,在linux输出: touch php_post1.html php_post1.php php_post1.html代码如下: <!doctype htm ...

  6. Python开发【第十三篇】:jQuery(二)

    http://www.bubuko.com/infodetail-1438296.html 处理完毕需要整理贴进来 Python之路[第十三篇]jQuery案例-Form表单&插件及扩展   ...

  7. 10.25 noip模拟试题

    今天题目略水2333 依旧不粘题目了23333 T1 /*数学题 给定n个斜率 求有多少个三元组 保证两两斜率不同 ans=C(n,3)-ΣC(len[i],2)*(n-len[i])-ΣC(len[ ...

  8. poj 3463 Sightseeing(次短路+条数统计)

    /* 对dij的再一次理解 每个点依旧永久标记 只不过这里多搞一维 0 1 表示最短路还是次短路 然后更新次数相当于原来的两倍 更新的时候搞一下就好了 */ #include<iostream& ...

  9. WPF TextElement内容模型简介(转)

    本内容模型概述描述了 TextElement 支持的内容. Paragraph 类是 TextElement 的类型. 内容模型描述哪些对象/元素可以包含在其他对象/元素中. 本概述汇总了派生自 Te ...

  10. Android开发 --微信支付开发(转载!)(开发工具:Eclipse)

    Android_APP 微信支付接口开发 日期:2015-10-06 12:47:33 作者: 来源: 人气:3549 1.首先说一下我们在开发微信支付接口的时候遇到最多和最疑惑的问题,那就是明明 a ...