bzoj3531
不难想到树链剖分
这题的难点是记录的是路径上宗教相同的点
裸的想法是对每一种宗教都开一棵线段树,记录每个点的评级
但显然这样会爆空间,仔细分析一下,这些线段树内很多点压根就没用到
因此我们考虑对线段树动态开点,不难发现每次修改最多要开线段树上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的更多相关文章
- 【BZOJ3531】[Sdoi2014]旅行 树链剖分+动态开点线段树
[BZOJ3531][Sdoi2014]旅行 Description S国有N个城市,编号从1到N.城市间用N-1条双向道路连接,满足从一个城市出发可以到达其它所有城市.每个城市信仰不同的宗教,如飞天 ...
- 【BZOJ3531】旅行(树链剖分,线段树)
[BZOJ3531]旅行(树链剖分,线段树) 题面 Description S国有N个城市,编号从1到N.城市间用N-1条双向道路连接,满足 从一个城市出发可以到达其它所有城市.每个城市信仰不同的宗教 ...
- BZOJ3531 [Sdoi2014]旅行 树链剖分 线段树
原文链接:http://www.cnblogs.com/zhouzhendong/p/8080189.html 题目传送门 - BZOJ3531 题意概括 一棵树,n个节点,每一个节点两个值,一个颜色 ...
- 【bzoj3531】 [SDOI2014]旅行
题目描述 S国有N个城市,编号从1到N.城市间用N-1条双向道路连接,满足从一个城市出发可以到达其它所有城市.每个城市信仰不同的宗教,如飞天面条神教.隐形独角兽教.绝地教都是常见的信仰.为了方便,我们 ...
- Bzoj3531: [Sdoi2014]旅行
Time Limit: 20 Sec Memory Limit: 512 MBSubmit: 1698 Solved: 758 Description S国有N个城市,编号从1到N.城市间用N-1 ...
- bzoj3531——树链剖分+动态开点线段树
3531: [Sdoi2014]旅行 Time Limit: 20 Sec Memory Limit: 512 MB Description S国有N个城市,编号从1到N.城市间用N-1条双向道路连 ...
- 【BZOJ3531】【SDOI2014】旅行
题目传送门 题目大意:给定一棵无根树,每个节点有自己的类别和权值,现在给定两个类别相同的点,叫你求这2点路径上同类别节点的权值和/最大权值. 节点类别与权值会改变. 解题思路:考虑对每一个类别开一棵线 ...
- BZOJ3531 树剖 + 动态开点线段树
https://www.lydsy.com/JudgeOnline/problem.php?id=3531 首先这题意要求树链上的最大值以及求和,其树链剖分的做法已经昭然若揭 问题在于这次的信息有宗教 ...
- BZOJ3531[Sdoi2014]旅行——树链剖分+线段树
题目描述 S国有N个城市,编号从1到N.城市间用N-1条双向道路连接,满足从一个城市出发可以到达其它所有城市.每个城市信仰不同的宗教,如飞天面条神教.隐形独角兽教.绝地教都是常见的信仰.为了方便,我们 ...
随机推荐
- centos6.5 安装
导系统,进入rescue模式,在提示符下输入grub,进入grub提示符.(不管用什么方法,能进入grub就行)root(hd?,?) //前一个问号是你第几块硬盘,后一个是LINUX所在的第几个分区 ...
- IDL通过经纬度定位获取DN值
以前就想写,但是因为envi可以就一直没弄.今天正好有个机会,就做了这个事情.ENVI中在主窗口中pixel locator可以实现,但是当我们需要读入很多的数据的时候,也就是批量处理的时候,显然编程 ...
- 第六篇:python高级之网络编程
python高级之网络编程 python高级之网络编程 本节内容 网络通信概念 socket编程 socket模块一些方法 聊天socket实现 远程执行命令及上传文件 socketserver及 ...
- python 学习笔记(一)
在Windows上安装Python 首先,从Python的官方网站www.python.org下载最新的2.7.9版本,地址是这个: http://www.python.org/ftp/python/ ...
- WPF FindName()没找到指定名称的元素
1.FindName()说明,可以用来获取已经注册名称的元素或标签 // // 摘要: // 查找具有提供的标识符名的元素. // // 参数: // name: // 所请求元素的名称. // // ...
- CSS Clip剪切元素动画实例
1.CSS .fixed { position: fixed; width: 90px; height: 90px; background: red; border: 0px solid blue; ...
- sql -以零作除数
将表达式改为: case when b=0 then 0 else a/b end
- (转载)loadrunner简单使用——HTTP,WebService,Socket压力测试脚本编写
原文出处:http://ajita.iteye.com/blog/1728243/ 先说明一下,本人是开发,对测试不是特别熟悉,但因工作的需要,也做过一些性能测试方面的东西.比较久之前很简单的用过,最 ...
- 强制关闭myeclipse出现的问题
重启时,可能会出现打不开关闭前所在的workspace.其他workspace可以正常打开. 今天遇到这个问题,以前就遇到过,但是忘记如何解决了.今天在我等了十多分钟后,神奇的myeclipse自己起 ...
- 一个初学者对CLSA.NET框架的使用心得
什么是CSLA.NET框架? 今天在一个群里,有人问我什么是CSLA.NET,CSLA是Component-based, Scalable, Logical Architecture的简写,CSLA ...