[BZOJ1036] [ZJOI2008]树的统计Count
来源:互联网 发布:数据采集器怎么用 编辑:程序博客网 时间:2024/04/30 00:37
传送门
http://www.lydsy.com/JudgeOnline/problem.php?id=1036
题目大意
支持
1.单点修改
2.查询路径点权最大值
3.查询点权路径和
题解
树链剖分模板入门题
const maxn=30010;type data=record sum,max:longint; end;var w:array[0..3*maxn,1..2]of longint; seg:array[0..8*maxn,1..4]of longint; {seg[i,3]:sum; seg[i,4]:max} pos,val,size,top,son,fa,dep:array[0..maxn]of longint; i,j,k:longint; n,m,len,a,b:longint; cha,ch:char;function mmax(a,b:longint):longint;begin if a>b then exit(a) else exit(b); end;procedure init(a,b:longint);begin w[len,1]:=b; if w[a,2]=0 then w[a,2]:=len else w[w[a,1],2]:=len; w[a,1]:=len; inc(len);end;procedure build(a,l,r:longint);var mid:longint;begin seg[a,1]:=l; seg[a,2]:=r; seg[a,3]:=0; seg[a,4]:=0; if l=r then exit; mid:=(l+r)>>1; build(a<<1,l,mid); build(a<<1+1,mid+1,r);end;procedure update(a,b,c:longint);var mid:longint;begin if seg[a,1]=seg[a,2] then begin seg[a,3]:=c; seg[a,4]:=c; exit; end; mid:=(seg[a,1]+seg[a,2])>>1; if b<=mid then update(a<<1,b,c) else update(a<<1+1,b,c); seg[a,3]:=seg[a<<1,3]+seg[a<<1+1,3]; seg[a,4]:=mmax(seg[a<<1,4],seg[a<<1+1,4]);end;function query(a,l,r:longint):data;var mid:longint; ans,t1,t2:data;begin if (seg[a,1]=l)and(seg[a,2]=r) then begin ans.sum:=seg[a,3]; ans.max:=seg[a,4]; exit(ans); end; mid:=(seg[a,1]+seg[a,2])>>1; if r<=mid then exit(query(a<<1,l,r)) else if l>mid then exit(query(a<<1+1,l,r)) else begin t1:=query(a<<1,l,mid); t2:=query(a<<1+1,mid+1,r); ans.sum:=t1.sum+t2.sum; ans.max:=mmax(t1.max,t2.max); exit(ans); end;end;procedure dfs1(a:longint); {size[],son[],fa[],dep[]}var tt,v:longint;begin tt:=w[a,2]; size[a]:=1; v:=0; while tt<>0 do begin if w[tt,1]<>fa[a] then begin fa[w[tt,1]]:=a; dep[w[tt,1]]:=dep[a]+1; dfs1(w[tt,1]); inc(size[a],size[w[tt,1]]); if size[w[tt,1]]>size[v] then v:=w[tt,1]; end; tt:=w[tt,2]; end; son[a]:=v;end;procedure dfs2(a,pre:longint); {top[],pos[]}var tt:longint;begin tt:=w[a,2]; top[a]:=pre; inc(len); pos[a]:=len; update(1,len,val[a]); if son[a]<>0 then dfs2(son[a],pre); while tt<>0 do begin if (w[tt,1]<>fa[a])and(w[tt,1]<>son[a]) then dfs2(w[tt,1],w[tt,1]); tt:=w[tt,2]; end;end;function queryans(a,b:longint):data;var tt:longint; t1,ans:data;begin ans.sum:=0; ans.max:=-maxlongint; while top[a]<>top[b] do begin if dep[top[a]]<dep[top[b]] then begin tt:=a; a:=b; b:=tt; end; t1:=query(1,pos[top[a]],pos[a]); inc(ans.sum,t1.sum); ans.max:=mmax(ans.max,t1.max); a:=fa[top[a]]; end; if dep[a]>dep[b] then begin tt:=a; a:=b; b:=tt; end; t1:=query(1,pos[a],pos[b]); inc(ans.sum,t1.sum); ans.max:=mmax(ans.max,t1.max); exit(ans);end;begin readln(n); len:=n+1; for i:=1 to n-1 do begin readln(a,b); init(a,b); init(b,a); end; for i:=1 to n do read(val[i]); dep[1]:=1; fa[1]:=0; size[0]:=0; dfs1(1); build(1,1,n); len:=0; dfs2(1,1); readln(m); for i:=1 to m do begin read(cha,ch); case ch of 'H':begin readln(cha,cha,cha,cha,a,b); val[a]:=b; update(1,pos[a],b); end; 'S':begin readln(cha,cha,a,b); writeln(queryans(a,b).sum); end; 'M':begin readln(cha,cha,a,b); writeln(queryans(a,b).max); end; end; end;end.
0 0
- [Bzoj1036][ZJOI2008]树的统计Count
- BZOJ1036 [ZJOI2008]树的统计Count 树链剖分
- 【BZOJ1036】[ZJOI2008]树的统计Count 树链剖分
- 【BZOJ1036】【ZJOI2008】树的统计Count 树链剖分裸题
- 【ZJOI2008】【BZOJ1036】树的统计Count
- [BZOJ1036][ZJOI2008]树的统计Count && LCT
- bzoj1036: [ZJOI2008]树的统计Count
- [BZOJ1036][ZJOI2008]树的统计Count
- 【bzoj1036】【树链剖分】【ZJOI2008】树的统计Count
- 【BZOJ1036】【ZJOI2008】【树的统计count】【树链剖分】
- bzoj1036: [ZJOI2008]树的统计Count
- BZOJ1036: [ZJOI2008]树的统计Count (树链剖分)
- bzoj1036: [ZJOI2008]树的统计Count - 树链剖分
- BZOJ1036: [ZJOI2008]树的统计Count
- bzoj1036【ZJOI2008】树的统计Count
- 【树链剖分】[BZOJ1036][ZJOI2008]树的统计Count
- [BZOJ1036] [ZJOI2008]树的统计Count
- [ZJOI2008] [BZOJ1036] 树的统计Count
- openvpn在linux下的配置 AS5.3 数据库验证
- VMware12安装Centos7 64位 解决无可用网络问题
- 树链剖分
- UIImagePickerController页中,按钮显示中文问题
- 《Linux系统磁盘分区》
- [BZOJ1036] [ZJOI2008]树的统计Count
- 在Mac上安装win10双系统
- 2016/2/13 Head First Java 第7节第一部分小结 继承
- 某主席树的的问题
- Windows编程之线程同步
- Android动态注册广播
- [POJ3237]树的维护
- How to install and setup Tor on Kali Linux 2.0(如何在Kali Linux 2.0 下安装 Tor)
- Building Maintainable Software-java篇之Write Code Once