树链剖分在边上的应用
比维护点稍微麻烦一点,是对每条边标号,并且要记录每个点父亲边的编号和重儿子
然后注意各种细节
线段树上和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. TS格式解析

    1.TS格式介绍 TS:全称为MPEG2-TS.TS即"Transport Stream"的缩写.它是分包发送的,每一个包长为188字节(还有192和204个字节的包).包的结构为 ...

  2. oracle11g不能导出空表

    Oracle11g的数据库迁移,习惯性的用了exp/imp,然后在新的数据库发现,空表根本没有exp出来,然后查资料,发现了如下信息: ORACLE 11G在用EXPORT导出时,空表不能导出. 11 ...

  3. swing容器继承重绘问题解决

    swing容器继承重绘问题解决   以JPanel为例,继承JPanel,想动态为器更换背景,这就涉及到重绘问题.一下是本人重写代码: package ui; import java.awt.Grap ...

  4. javascript Object的长度

    1.示例 var obj = { a:"hello", b:"world", c:"hehe" } var key = 0; for(var ...

  5. IDC机房动力环境设备维护

    高低压配电                                              空调                                               ...

  6. 修复Windows7的便签问题

    工作的时候,喜欢利用Windows的附件“便签”,将自己要做的事情一一列在上面,显示在桌面上, 今天突然发现便签损坏,系统是元数据损坏,后来在网上查到解决方法,特此记录: 1. 以管理员身份运行 cm ...

  7. Unix环境高级编程学习笔记——dup

    dup 和 dup2   dup和dup2,都是用来将一个文件描述符复制给另一个文件描述符上,这两个文件描述符都指向同一个文件状态标志上. 只是文件描述符的大小不一样,dup所执行下的复制,肯定是返回 ...

  8. jQuery学习 day01

    最近受某大牛指点(我不会说他姓范),了解了一下jQuery,据说很牛X,就了解了一下,第一天,分享给大家一些心得吧. 1.首先就是导入jQuery文件了,这里我是去jQuery官网下载的.(大家可以去 ...

  9. WORDPRESS开发(一)自定义页面显示分类目录

    第一步:自定义一个页面,如index.php 第二步:打开index.php文件,引用wp-blog-header.php文件 require('wp-blog-header.php'); 第三步使用 ...

  10. Cassandra1.2文档学习(1)——Cassandra基本说明

    参考文档:http://www.datastax.com/documentation/cassandra/1.2/webhelp/index.html#cassandra/architecture/a ...