树链剖分在边上的应用
比维护点稍微麻烦一点,是对每条边标号,并且要记录每个点父亲边的编号和重儿子
然后注意各种细节
线段树上和bzoj1858的维护方法类似,覆盖的优先级高于加
具体见程序,完全是为了提升状态的练习

 type node=record
po,next,num:longint;
end; var son,a,d,fa,fp,f2,b,c,p,size,top:array[..] of longint;
w:array[..] of node;
tree,laz1,laz2:array[..*] of longint;
x,y,z,i,n,t:longint;
ch:char;
s:string; function max(a,b:longint):longint;
begin
if a>b then exit(a) else exit(b);
end; procedure add(x,y,c:longint);
begin
inc(t);
w[t].po:=y;
w[t].num:=c;
w[t].next:=p[x];
p[x]:=t;
end; procedure swap(var a,b:longint);
var c:longint;
begin
c:=a;
a:=b;
b:=c;
end; procedure push(i:longint);
begin
if laz1[i]<>- then
begin
tree[i*]:=laz1[i];
tree[i*+]:=laz1[i];
laz1[i*]:=laz1[i];
laz1[i*+]:=laz1[i];
laz1[i]:=-;
laz2[i]:=;
end;
if laz2[i]<> then
begin
inc(tree[i*],laz2[i]);
inc(tree[i*+],laz2[i]);
if laz1[i*]<>- then inc(laz1[i*],laz2[i])
else inc(laz2[i*],laz2[i]);
if laz1[i*+]<>- then inc(laz1[i*+],laz2[i])
else inc(laz2[i*+],laz2[i]);
laz2[i]:=;
end;
end; procedure dfs1(x:longint);
var i,y:longint;
begin
i:=p[x];
size[x]:=;
while i<> do
begin
y:=w[i].po;
if fa[x]<>y then
begin
fp[y]:=w[i].num;
fa[y]:=x;
d[y]:=d[x]+;
dfs1(y);
size[x]:=size[x]+size[y];
end;
i:=w[i].next;
end;
end; procedure dfs2(x:longint);
var i,y,q:longint;
begin
i:=p[x];
q:=;
while i<> do
begin
if fa[w[i].po]=x then
if size[w[q].po]<size[w[i].po] then q:=i;
i:=w[i].next;
end;
if q= then exit;
top[w[q].po]:=top[x];
son[x]:=w[q].num;
inc(t);
c[t]:=w[q].num;
b[w[q].num]:=t;
dfs2(w[q].po);
i:=p[x];
while i<> do
begin
y:=w[i].po;
if (i<>q) and (fa[y]=x) then
begin
inc(t);
c[t]:=w[i].num;
b[w[i].num]:=t;
top[y]:=y;
dfs2(y);
end;
i:=w[i].next;
end;
end; procedure build(i,l,r:longint);
var m:longint;
begin
laz1[i]:=-;
laz2[i]:=;
if l=r then tree[i]:=a[c[l]]
else begin
m:=(l+r) shr ;
build(i*,l,m);
build(i*+,m+,r);
tree[i]:=max(tree[i*],tree[i*+]);
end;
end; procedure change(i,l,r,x,y,z:longint);
var m:longint;
begin
if x>y then exit;
if (x<=l) and (y>=r) then
begin
laz1[i]:=z;
tree[i]:=z;
laz2[i]:=;
end
else begin
push(i);
m:=(l+r) shr ;
if x<=m then change(i*,l,m,x,y,z);
if y>m then change(i*+,m+,r,x,y,z);
tree[i]:=max(tree[i*],tree[i*+]);
end;
end; procedure fadd(i,l,r,x,y:longint);
var m:longint;
begin
if x>y then exit;
if (x<=l) and (y>=r) then
begin
if laz1[i]<>- then inc(laz1[i],z)
else inc(laz2[i],z);
inc(tree[i],z);
end
else begin
push(i);
m:=(l+r) shr ;
if x<=m then fadd(i*,l,m,x,y);
if y>m then fadd(i*+,m+,r,x,y);
tree[i]:=max(tree[i*],tree[i*+]);
end;
end; function getans(i,l,r,x,y:longint):longint;
var m,s:longint;
begin
if x>y then exit();
if (x<=l) and (y>=r) then exit(tree[i])
else begin
push(i);
m:=(l+r) shr ;
s:=;
if x<=m then s:=getans(i*,l,m,x,y);
if y>m then s:=max(s,getans(i*+,m+,r,x,y));
exit(s);
end;
end; procedure cover(x,y:longint);
var f1,f2:longint;
begin
f1:=top[x];
f2:=top[y];
while f1<>f2 do
begin
if d[f1]>=d[f2] then
begin
change(,,n-,b[fp[f1]],b[fp[x]],z);
x:=fa[f1];
end
else begin
change(,,n-,b[fp[f2]],b[fp[y]],z);
y:=fa[f2];
end;
f1:=top[x];
f2:=top[y];
end;
if x=y then exit
else if b[fp[x]]>b[fp[y]] then swap(x,y);
change(,,n-,b[son[x]],b[fp[y]],z);
end; procedure add(x,y:longint);
var f1,f2:longint;
begin
f1:=top[x];
f2:=top[y];
while f1<>f2 do
begin
if d[f1]>=d[f2] then
begin
fadd(,,n-,b[fp[f1]],b[fp[x]]);
x:=fa[f1];
end
else begin
fadd(,,n-,b[fp[f2]],b[fp[y]]);
y:=fa[f2];
end;
f1:=top[x];
f2:=top[y];
end;
if x=y then exit
else if b[fp[x]]>b[fp[y]] then swap(x,y);
fadd(,,n-,b[son[x]],b[fp[y]]);
end; function ask(x,y:longint):longint;
var s,f1,f2:longint;
begin
s:=;
f1:=top[x];
f2:=top[y];
while f1<>f2 do
begin
if d[f1]>=d[f2] then
begin
s:=max(s,getans(,,n-,b[fp[f1]],b[fp[x]]));
x:=fa[f1];
end
else begin
s:=max(s,getans(,,n-,b[fp[f2]],b[fp[y]]));
y:=fa[f2];
end;
f1:=top[x];
f2:=top[y];
end;
if x=y then exit(s)
else if b[fp[x]]>b[fp[y]] then swap(x,y);
s:=max(s,getans(,,n-,b[son[x]],b[fp[y]]));
exit(s);
end; begin
readln(n);
for i:= to n- do
begin
readln(x,y,a[i]);
add(x,y,i);
add(y,x,i);
end;
t:=;
dfs1();
top[]:=;
dfs2();
while true do
begin
read(ch);
s:='';
while ch<>' ' do
begin
s:=s+ch;
if s='Stop' then halt;
read(ch);
end;
read(x,y);
if s='Max' then
writeln(ask(x,y))
else if s='Change' then
change(,,n-,b[x],b[x],y)
else if s='Cover' then
begin
read(z);
cover(x,y);
end
else if s='Add' then
begin
read(z);
add(x,y);
end;
readln;
end;
end.

bzoj1984的更多相关文章

  1. 【BZOJ1984】月下“毛景树” 树链剖分+线段树

    [BZOJ1984]月下"毛景树" Description 毛毛虫经过及时的变形,最终逃过的一劫,离开了菜妈的菜园. 毛毛虫经过千山万水,历尽千辛万苦,最后来到了小小的绍兴一中的校 ...

  2. [BZOJ1984]月下“毛景树”解题报告|树链剖分

    Description 毛毛虫经过及时的变形,最终逃过的一劫,离开了菜妈的菜园. 毛毛虫经过千山万水,历尽千辛万苦,最后来到了小小的绍兴一中的校园里.爬啊爬~爬啊爬~~毛毛虫爬到了一颗小小的“毛景树” ...

  3. 【树链剖分】【分块】【最近公共祖先】【块状树】bzoj1984 月下“毛景树”

    裸题,但是因为权在边上,所以要先把边权放到这条边的子节点上,然后进行链更新/查询的时候不能更新/查询其lca. #include<cstdio> #include<cmath> ...

  4. [bzoj1984]月下“毛景树”

    Description 毛毛虫经过及时的变形,最终逃过的一劫,离开了菜妈的菜园.毛毛虫经过千山万水,历尽千辛万苦,最后来到了小小的绍兴一中的校园里.爬啊爬~爬啊爬~~毛毛虫爬到了一颗小小的" ...

  5. 【BZOJ-1984】月下“毛景树” 树链剖分

    1984: 月下“毛景树” Time Limit: 20 Sec  Memory Limit: 64 MBSubmit: 1314  Solved: 416[Submit][Status][Discu ...

  6. BZOJ1984: 月下“毛景树”

    1984: 月下“毛景树” Time Limit: 20 Sec  Memory Limit: 64 MBSubmit: 713  Solved: 245[Submit][Status] Descri ...

  7. [BZOJ1984][Luogu4315]月下“毛景树”

    题目大意 给出一棵 n 个点的无根树,待边权,要求维护一下操作: 修改某条边的边权 修改点 u 到点 v 路径上所有边的边权 点 u 到点 v 路径上所有边的边权加上某个值 查询点 u 到点 v 路径 ...

  8. 树剖+线段树||树链剖分||BZOJ1984||Luogu4315||月下“毛景树”

    题面:月下“毛景树” 题解:是道很裸的树剖,但处理的细节有点多(其实是自己线段树没学好).用一个Dfs把边权下移到点权,用E数组记录哪些边被用到了:前三个更新的操作都可以合并起来,可以发现a到b节点间 ...

  9. 2018.10.27 bzoj1984: 月下“毛景树”(树链剖分)

    传送门 唉蒟蒻又退化了,这道sb题居然做了20min,最后发现是updcovupdcovupdcov写成了updaddupdaddupdadd我还能说什么233233233 就是让你转边权为点权之后, ...

随机推荐

  1. iOS 计算两个日期之间的天数问题

    //获取当前时间若干年.月.日之后的时间 + (NSDate *)dateWithFromDate:(NSDate *)date years:(NSInteger)years months:(NSIn ...

  2. 第3章 Struts2框架--1、Struts2环境搭建

    第3章 Struts2框架--1.Struts2环境搭建 搭建步骤: 1.从下载http://struts.apache.org 没找到Struts2.3.16版,就下载了2.3.29 2.拷贝后解压 ...

  3. 在终端里使用 Solarized 配色方案

    在终端里使用 Solarized 配色方案 参考: 1.在 Mac OS X 终端里使用 Solarized 配色方案 2.solarized

  4. bzoj1697:[Usaco2007 Feb]Cow Sorting牛排序 & bzoj1119:[POI2009]SLO

    思路:以bzoj1119为例,题目已经给出了置换,而每一次交换的代价是交换二者的权值之和,而置换一定是会产生一些环的,这样就可以只用环内某一个元素去置换而使得其余所有元素均在正确的位置上,显然要选择环 ...

  5. ZeroMemory和memset的区别

    摘自百度百科,保存为学习使用 ZeroMemory,是美国微软公司的软件开发包SDK中的一个宏. 其作用是用0来填充一块内存区域. 声明 void ZeroMemory( PVOID Destinat ...

  6. MySQL常见错误类型

    MySQL常见错误类型:1005:创建表失败1006:创建数据库失败1007:数据库已存在,创建数据库失败1008:数据库不存在,删除数据库失败1009:不能删除数据库文件导致删除数据库失败1010: ...

  7. Thrift 应用场景(收集版)

    官网: http://thrift.apache.org/ 一些介绍使用的文章: http://www.ibm.com/developerworks/cn/java/j-lo-apachethrift ...

  8. IBUS-WARNING **: Process Key Event failed: Timeout was reached

    在gvim中ibus敲字时,偶尔会在n秒之后才显示到屏幕,反应死慢.控制台会看到下面的错误信息. (gvim:): IBUS-WARNING **: Process Key Event failed: ...

  9. linux磁盘以及文件系统

    df 查看磁盘总容量 -i 显示inodes号 -h 使用合适的单位显示磁盘大小 -m 以M为单位显示 -k 以K为单位显示 默认K显示 du 用来查看某个目录或者文件所占空间大小 参数:-abckm ...

  10. 【转】Oracle job procedure 存储过程定时任务

    原文:Oracle job procedure 存储过程定时任务 oracle job有定时执行的功能,可以在指定的时间点或每天的某个时间点自行执行任务. 一.查询系统中的job,可以查询视图 --相 ...