【BZOJ2002】弹飞绵羊(LCT)
题意:给定一棵树,要求维护以下操作:
1.删除连接(x,y)的边
2.将(x,y)之间连边
3.询问某点子树大小
对于100%的数据n<=200000,m<=100000
思路:第一道有加边删边的LCT
讲一下自己对LCT各个操作的理解
Access:最基本的操作,将一个点到LCT的根的点全部修改为重(实)边
可以理解为“全选操作”,配合Splay操作可以取出某段区间的信息
Splay:将X旋转到它所在链的顶部,这样就相当于将这条链中的信息集中到了X这个点上
LCT的splay要用栈pushdown维护的原因是普通splay中splay操作前这些信息已经在Findkth的时候下传
而LCT没有,需要手动下传
Findroot:找到LCT的根,先Access+splay,因为LCT是按照深度维护的,所以一直往左走,找到深度最小的就是根
Makeroot:将X设置为LCT的根,Access+splay,因为上下翻转了所以要打翻转标记
Link:链接两个不在同一条链上的点,Makeroot(x),fa[x]=y
split:取出(x,y)这段区间的信息,Makeroot(x),Access(y),splay(y),信息在y点上
此题输出左儿子的子树大小即可
- var t:array[..,..]of longint;
- next,fa,rev,size,q:array[..]of longint;
- n,m,i,x,y,tmp,top:longint;
- function isroot(x:longint):boolean;
- begin
- if (t[fa[x],]<>x)and(t[fa[x],]<>x) then exit(true);
- exit(false);
- end;
- procedure swap(var x,y:longint);
- var t:longint;
- begin
- t:=x; x:=y; y:=t;
- end;
- procedure pushup(x:longint);
- var l,r:longint;
- begin
- l:=t[x,]; r:=t[x,];
- size[x]:=size[l]+size[r]+;
- end;
- procedure pushdown(x:longint);
- var l,r:longint;
- begin
- l:=t[x,]; r:=t[x,];
- if rev[x]> then
- begin
- rev[x]:=rev[x] xor ; rev[l]:=rev[l] xor ; rev[r]:=rev[r] xor ;
- swap(t[x,],t[x,]);
- end;
- end;
- procedure rotate(x:longint);
- var y,z,l,r:longint;
- begin
- y:=fa[x]; z:=fa[y];
- if t[y,]=x then l:=
- else l:=;
- r:=l xor ;
- while not isroot(y) do
- begin
- if t[z,]=y then t[z,]:=x
- else t[z,]:=x;
- end;
- fa[x]:=z; fa[y]:=x; fa[t[x,r]]:=y;
- t[y,l]:=t[x,r]; t[x,r]:=y;
- pushup(y);
- pushup(x);
- end;
- procedure splay(x:longint);
- var y,z,k:longint;
- begin
- inc(top); q[top]:=x;
- k:=x;
- while not isroot(k) do
- begin
- inc(top); q[top]:=fa[k];
- k:=fa[k];
- end;
- while top> do
- begin
- pushdown(q[top]);
- dec(top);
- end;
- while not isroot(x) do
- begin
- y:=fa[x]; z:=fa[y];
- if not isroot(y) then
- begin
- if (t[y,]=x)xor(t[z,]=y) then rotate(x)
- else rotate(y);
- end;
- rotate(x);
- end;
- end;
- procedure access(x:longint);
- var last:longint;
- begin
- last:=;
- while x> do
- begin
- splay(x); t[x,]:=last; //pushup(x);
- last:=x; x:=fa[x];
- end;
- end;
- procedure makeroot(x:longint);
- begin
- access(x); splay(x); rev[x]:=rev[x] xor ;
- end;
- procedure link(x,y:longint);
- begin
- makeroot(x); fa[x]:=y;
- end;
- procedure split(x,y:longint);
- begin
- makeroot(x); access(y); splay(y);
- end;
- procedure cut(x,y:longint);
- begin
- makeroot(x); access(y); splay(y); t[y,]:=; fa[x]:=;
- end;
- function min(x,y:longint):longint;
- begin
- if x<y then exit(x);
- exit(y);
- end;
- begin
- assign(input,'bzoj2002.in'); reset(input);
- assign(output,'bzoj2002.out'); rewrite(output);
- readln(n);
- for i:= to n do
- begin
- read(x);
- fa[i]:=x+i; size[i]:=;
- if fa[i]>n then fa[i]:=n+;
- next[i]:=fa[i];
- end;
- size[n+]:=;
- readln(m);
- for i:= to m do
- begin
- read(x);
- case x of
- :
- begin
- read(y); inc(y);
- split(n+,y);
- writeln(size[t[y,]]);
- end;
- :
- begin
- read(x,y);
- inc(x); tmp:=min(x+y,n+);
- cut(x,next[x]); link(x,tmp); next[x]:=tmp;
- end;
- end;
- end;
- close(input);
- close(output);
- end.
【BZOJ2002】弹飞绵羊(LCT)的更多相关文章
- bzoj2002 弹飞绵羊 lct版
这道题就是维护一个有根的lct 一开始建树全部建虚边 求多少次弹出就是求他到根的距离(根为n+1) 这里有个小技巧 将n+1作为根而没有虚根操作起来会比较方便 #include<cstdio&g ...
- BZOJ-2002 弹飞绵羊 Link-Cut-Tree (分块)
2002: [Hnoi2010]Bounce 弹飞绵羊 Time Limit: 10 Sec Memory Limit: 259 MB Submit: 6801 Solved: 3573 [Submi ...
- 洛谷P3203 [HNOI2010] 弹飞绵羊 [LCT]
题目传送门 弹飞绵羊 题目描述 某天,Lostmonkey发明了一种超级弹力装置,为了在他的绵羊朋友面前显摆,他邀请小绵羊一起玩个游戏.游戏一开始,Lostmonkey在地上沿着一条直线摆上n个装置, ...
- P3203 [HNOI2010]弹飞绵羊(LCT)
弹飞绵羊 题目传送门 解题思路 LCT. 将每个节点的权值设为\(1\),连接\(i\)和\(i+ki\),被弹飞就连上\(n\),维护权值和\(sum[]\).从\(j\)弹飞需要的次数就是\(sp ...
- [Luogu P3203] [HNOI2010]弹飞绵羊 (LCT维护链的长度)
题面 传送门:洛谷 Solution 这题其实是有类似模型的. 我们先考虑不修改怎么写.考虑这样做:每个点向它跳到的点连一条边,最后肯定会连成一颗以n+1为根的树(我们拿n+1代表被弹出去了).题目所 ...
- BZOJ 2002: [Hnoi2010]Bounce 弹飞绵羊 LCT
2002: [Hnoi2010]Bounce 弹飞绵羊 Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://www.lydsy.com/JudgeOn ...
- [BZOJ2002] [Hnoi2010] Bounce 弹飞绵羊 (LCT)
Description 某天,Lostmonkey发明了一种超级弹力装置,为了在他的绵羊朋友面前显摆,他邀请小绵羊一起玩个游戏.游戏一开始,Lostmonkey在地上沿着一条直线摆上n个装置,每个装置 ...
- BZOJ2002[Hnoi2010]弹飞绵羊——LCT
题目描述 某天,Lostmonkey发明了一种超级弹力装置,为了在他的绵羊朋友面前显摆,他邀请小绵羊一起玩个游戏.游戏一开始,Lostmonkey在地上沿着一条直线摆上n个装置,每个装置设定初始弹力系 ...
- [bzoj] 2002 弹飞绵羊 || LCT
原题 简单的LCT练习题. 我们发现对于一个位置x,他只能跳到位置x+k,也就是唯一的父亲去.加入我们将弹飞的绵羊定义为跳到了n+1,那么这就形成了一棵树.而因为要修改k,所以这颗树是动态连边的,那么 ...
- 【HNOI2010】弹飞绵羊 - LCT
题目描述 某天,Lostmonkey发明了一种超级弹力装置,为了在他的绵羊朋友面前显摆,他邀请小绵羊一起玩个游戏.游戏一开始,Lostmonkey在地上沿着一条直线摆上n个装置,每个装置设定初始弹力系 ...
随机推荐
- Java使用HtmlUnit抓取js渲染页面
需求: 需要采集js渲染的页面,有些网站的页面是js渲染的 实现: 基于HtmlUnit实现: public static void getAjaxPage() throws Exception{ W ...
- KTU Programming Camp (Winter Training Day 1)
A.B.C(By musashiheart) 0216个人赛前三道题解 E(By ggg) Gym - 100735E Restore H(by pipixia) Gym - 100735H
- 手把手教你打造一个 Mac 风格的 Windows10(手动滑稽)
Mark https://www.sqlsec.com/2018/04/winmac.html 大佬写得很好,资瓷!! MyDock可能不是最新的,给出官方维护的网盘:https://pan.bai ...
- 1658: Easier Done Than Said?
1658: Easier Done Than Said? Time Limit: 1 Sec Memory Limit: 64 MBSubmit: 15 Solved: 12[Submit][St ...
- softmax_loss的归一化问题
cnn网络中,网络更新一次参数是根据loss反向传播来,这个loss是一个batch_size的图像前向传播得到的loss和除以batch_size大小得到的平均loss. softmax_loss前 ...
- House of force
0x00 利用要点 1.申请一块非常大的块. 2.精心构造size覆盖top chunk的chunk header. 3.调用malloc()实现任意地址写 0x01 申请一块非常大的块. 申请一个负 ...
- Noip2016 提高组 蚯蚓
刚看到这道题:这题直接用堆+模拟不就可以了(并没有认真算时间复杂度) 于是用priority_queue水到了85分-- (STL大法好) 天真的我还以为是常数问题,于是疯狂卡常--(我是ZZ) 直到 ...
- Bootstrap历练实例:带有下拉菜单的标签和胶囊导航
<!DOCTYPE html><html><head><meta http-equiv="Content-Type" content=&q ...
- shell脚本,按单词出现频率降序排序。
[root@localhost oldboy]# cat file the squid project provides a number of resources toassist users de ...
- Ruby设计模式-观察者模式学习笔记
observer.rb #!/bin/env ruby # encoding: utf-8 require 'observer' class CriminalMovement include Obse ...