这两题都是link cut tree的裸题
之前看Qtree的论文,只会在确定父子关系的情况下连边和删边
如果在任意两个点连边删边怎么做呢?
这时候我们不能随意的将一个点的父节点设为另一个点,因为其中某个点的父节点可能已经被设为另外某点了
其实很简单,连边的时候,我们只要把x变成其所在原树的根,这样x是没有父节点了
然后把x的父节点设为y即可,删边、询问路径的道理类似,具体见程序
给出的是bzoj2631的程序

 const mo=;

 var fa,q,a,mul,add,size,sum:array[..] of longint;
rev:array[..] of boolean;
son:array[..,..] of longint;
i,x0,y0,x,y,z,n,m,t:longint;
ch:char; function root(x:longint):boolean; //判断是Auxiliary tree(splay)上的父节点还是path parent
begin
exit((son[fa[x],]<>x) and (son[fa[x],]<>x));
end; procedure swap(var a,b:longint);
var c:longint;
begin
c:=a;
a:=b;
b:=c;
end; procedure update(x:longint);
var l,r:longint;
begin
l:=son[x,];
r:=son[x,];
size[x]:=(size[l]+size[r]+) mod mo;
sum[x]:=(a[x]+sum[l]+sum[r]) mod mo;
end; procedure calc(x,c,j:longint);
begin
if (c<=) then //常数优化,少用int64
begin
mul[x]:=mul[x]*c mod mo;
add[x]:=(add[x]*c+j) mod mo;
sum[x]:=(sum[x]*c+int64(j)*int64(size[x])) mod mo;
a[x]:=(a[x]*c+j) mod mo;
end
else begin
mul[x]:=int64(mul[x])*int64(c) mod mo;
add[x]:=(int64(add[x])*int64(c)+j) mod mo;
sum[x]:=(int64(sum[x])*int64(c)+int64(j)*int64(size[x])) mod mo;
a[x]:=(int64(a[x])*int64(c)+j) mod mo;
end;
end; procedure push(x:longint);
begin
if rev[x] then
begin
rev[son[x,]]:=not rev[son[x,]];
rev[son[x,]]:=not rev[son[x,]];
swap(son[x,],son[x,]);
rev[x]:=false;
end;
if (mul[x]<>) or (add[x]<>) then
begin
if son[x,]<> then calc(son[x,],mul[x],add[x]);
if son[x,]<> then calc(son[x,],mul[x],add[x]);
mul[x]:=;
add[x]:=;
end;
end; procedure rotate(x,w:longint);
var y:longint;
begin
y:=fa[x];
if not root(y) then
begin
if son[fa[y],]=y then son[fa[y],]:=x
else son[fa[y],]:=x;
end;
fa[x]:=fa[y];
son[y,-w]:=son[x,w];
if son[x,w]<> then fa[son[x,w]]:=y;
son[x,w]:=y;
fa[y]:=x;
update(y);
end; procedure splay(x:longint);
var y,t,i:longint;
ff:boolean;
begin
t:=;
i:=x;
while not root(i) do
begin
inc(t);
q[t]:=i;
i:=fa[i];
end;
inc(t);
q[t]:=i;
for i:=t downto do
push(q[i]);
ff:=true;
if t= then exit;
while ff do
begin
y:=fa[x];
if y=q[t] then
begin
if son[y,]=x then rotate(x,)
else rotate(x,);
ff:=false;
end
else begin
if fa[y]=q[t] then ff:=false;
if son[fa[y],]=y then
begin
if son[y,]=x then rotate(y,)
else rotate(x,);
rotate(x,);
end
else begin
if son[y,]=x then rotate(x,)
else rotate(y,);
rotate(x,);
end;
end;
end;
update(x);
end; procedure access(x:longint);
var y:longint;
begin
y:=;
repeat
splay(x);
son[x,]:=y;
update(x); //这里要记得维护
y:=x;
x:=fa[x];
until x=;
end; procedure makeroot(x:longint);
begin
access(x); //执行access之后,x和当前树的根之间的路径构成Auxiliary tree
splay(x); //将x旋到Auxiliary tree的根,这时候x没有右孩子,左子树的点都是x的祖辈
rev[x]:=not rev[x]; //执行翻转操作,这时候x是Auxiliary tree上最小的点,也就变成了原树的根
end; procedure link(x,y:longint);
begin
makeroot(x);
fa[x]:=y;
end; procedure cut(x,y:longint);
begin
makeroot(x);
access(y);
splay(y);
son[y,]:=;
fa[x]:=;
end; procedure path(x,y:longint); //构成x到y的路径
begin
makeroot(x);
access(y); //x到y路径上的点就在一棵Auxiliary tree中
splay(y);
end; begin
readln(n,m);
for i:= to n do
begin
a[i]:=;
size[i]:=;
sum[i]:=;
mul[i]:=;
end;
for i:= to n- do
begin
readln(x,y);
link(x,y);
end;
for i:= to m do
begin
read(ch);
if ch='+' then
begin
readln(x,y,z);
z:=z mod mo;
path(x,y);
calc(y,,z);
end
else if ch='-' then
begin
readln(x0,y0,x,y);
cut(x0,y0);
link(x,y);
end
else if ch='*' then
begin
readln(x,y,z);
z:=z mod mo;
path(x,y);
calc(y,z,);
end
else begin
readln(x,y);
path(x,y);
writeln(sum[y]);
end;
end;
end.

bzoj2631 3282的更多相关文章

  1. BZOJ 2002 && BZOJ 2409 LCT && BZOJ 3282 初步练习

    #include <cstdio> ; inline void Get_Int(int & x) { ; ') ch=getchar(); +ch-'; ch=getchar(); ...

  2. hdu 3282 Running Median

    题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=3282 Running Median Description For this problem, you ...

  3. 【BZOJ】【3282】Tree

    LCT 喜闻乐见的Link-Cut-Tree…… srO zyf http://www.cnblogs.com/zyfzyf/p/4149109.html 目测我是第222个?………………不要在意这些 ...

  4. [BZOJ 3282] Tree 【LCT】

    题目链接:BZOJ - 3282 题目分析 这道题是裸的LCT,包含 Link , Cut 和询问两点之间的路径信息. 写代码时出现的错误:Access(x) 的循环中应该切断的是原来的 Son[x] ...

  5. BZOJ 3282: Tree( LCT )

    LCT.. -------------------------------------------------------------------------------- #include<c ...

  6. bzoj 3282: Tree (Link Cut Tree)

    链接:https://www.lydsy.com/JudgeOnline/problem.php?id=3282 题面: 3282: Tree Time Limit: 30 Sec  Memory L ...

  7. 【BZOJ】3282: Tree(lct)

    http://www.lydsy.com/JudgeOnline/problem.php?id=3282 复习了下lct,发现两个问题.. 1:一开始我以为splay那里直接全部rot(x)就好了,然 ...

  8. BZOJ 3282: Tree

    3282: Tree Time Limit: 30 Sec  Memory Limit: 512 MBSubmit: 1714  Solved: 765[Submit][Status][Discuss ...

  9. bzoj 3282

    回顾一下LCT,容易写错的地方: 1.每次断掉Splay中的边,必须update一下父亲节点,再根据具体情况是否splay父亲节点. 2.养成没有用的值(比如当pre[u]不为0时的pnt[u])不去 ...

随机推荐

  1. Android Toast 设置到屏幕中间,自定义Toast的实现方法,及其说明

    http://blog.csdn.net/wangfayinn/article/details/8065763 Android Toast用于在手机屏幕上向用户显示一条信息,一段时间后信息会自动消失. ...

  2. sublimeText3中 less2css error: `lessc` is not available的解决办法

    昨天在sublimeText3中安装了less 以及 less2css插件,但是在编译保存的时候总是出现错误: less2css error: `lessc` is not available 就go ...

  3. Malformed network data

    Malformed network data

  4. LA 3708 Graveyard(推理 参考系 中位数)

    Graveyard Programming contests became so popular in the year 2397 that the governor of New Earck -- ...

  5. 动态规划&矩阵连乘

    动态规划&矩阵连乘 动态规划的概念 •     与分治方法类似       分-治-合 • 与分治方法不同       子问题之间并非相互独立 •     基本思想        用一个表记录 ...

  6. (hdu)5652 India and China Origins 二分+dfs

    题目链接:http://acm.split.hdu.edu.cn/showproblem.php?pid=5652 Problem Description A long time ago there ...

  7. Android版多线程下载器核心代码分享

    首先给大家分享多线程下载核心类: package com.example.urltest; import java.io.IOException; import java.io.InputStream ...

  8. 小笔记(三):PHP使用thinkphp3.2.3对数组进行分页

    之前写过thinkphp3.2.3直接在查询数据的时候进行分页,前段时间用到了将查询之后的数组进行整理后进行分页,用到的一个函数array_slice($arr, $start, $length,tr ...

  9. 表格table样式布局设置

    <style> table{ border-collapse:collapse; margin:0 auto;} table tr td{ border:1px solid #000; l ...

  10. 【python之旅】python的基础三

    目录: 1.装饰器 2.迭代器&生成器 3.Json & pickle 数据序列化 4.软件目录结构规范  一.装饰器 定义:本质是函数,(装饰其他函数)就是为其他函数添加附加功能 原 ...