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条双向道路连接,满足从一个城市出发可以到达其它所有城市.每个城市信仰不同的宗教,如飞天面条神教.隐形独角兽教.绝地教都是常见的信仰.为了方便,我们 ...
随机推荐
- 聊一聊Android 6.0的运行时权限
Android 6.0,代号棉花糖,自发布伊始,其主要的特征运行时权限就很受关注.因为这一特征不仅改善了用户对于应用的使用体验,还使得应用开发者在实践开发中需要做出改变. 没有深入了解运行时权限的开发 ...
- mac 下svn降级
mac 手欠 homebrew 安装完成后 brew install svn svn版本更新至1.8.11 公司svn 不支持1.8 需要降级 搜索很多资料 写的比较麻烦 总结出来是先卸载再 ...
- 蓝牙代理报错:invalid handle error
错误症状: -(void)peripheral:(CBPeripheral *)peripheral didUpdateNotificationStateForCharacteristic:(CBCh ...
- IIS7保存配置文件及导入、导出、备份、还原
IIS6下想要保存配置,只需在图形界面下点右键保存即可,但windows 2008下的IIS7却没有这样的选项, IIS7的配置文件有好几个,在c:\windows\system32\inetsrv\ ...
- 乐视手机查看运行内存方法、EUI(Eco User Interface)乐视系统查看手机运行内存方法
点击按钮,左下角,方格, 显示如下:
- 自己动手写控件(模仿mvc htmlhelper的类)
自定义helper类,要求命名空间在 System.Web.Mvc之下,要求,静态类,静态方法,特殊生成对应html的返回字段, 传递Htmlhleper,返回特定类型 返回值是MvcHtmlStri ...
- 【转】ASP.NET MVC 入门教程列表
ASP.NET MVC小论 2008-12-04 11:11 by T2噬菌体, 8052 visits, 网摘, 收藏, 编辑 摘要:ASP.NET MVC作为微软官方的.NET平台下MVC解决方案 ...
- SGU 276 Andrew's Troubles
简单的题.直接找题意来就好了. #include <iostream> #include <cstdio> using namespace std; int s, n, ans ...
- splice 操作符
几乎所有的数组操作都可用 splice 实现. 除了第一个参数,数组,为必须,其余的参数都不是必须的. splice ARRAY, OFFSET, LENGTH, LIST OFFSET 和 LENG ...
- 【JQuery学习历程】2.JQuery选择器
基本选择器 选择器 描述 返回 示例 #id 根据给定的id匹配元素 单个元素 $("#myId") .class 根据给定的class类匹配元素 集合元素 $(".my ...