先吐槽一句,這題分塊比lct快是什麼鬼,lct常數是有多大。lct1.8s,分塊總耗時1.6s。
主要思路:link(i,i+a[i]);彈出去的都連向節點n+1;
每次修改cut,link。查詢是 以n+1為根,access(x),splay(x),x的子樹大小,就是x點向後彈的節點數。
#include
#include
#include
#include
#define maxn 200005
using
namespace
std;
int n;
inline
void read(int &a)
}int fa[maxn],ch[maxn][2],sz[maxn];
bool rev[maxn];
inline
void up(int x)
inline
bool isroot(int x)
inline
void down(int x)
}inline
bool dir(int x)
inline
void rotate(int x)
stack
s;inline
void splay(int x)
while(!isroot(x))
else }}
}inline
void access(int x)
}inline
void make_root(int x)
inline
void link(int u,int v)
inline
void cut(int x,int y)
inline
int find(int x)
int a[maxn];
int main()
int q;read(q);
for(int i=1;i<=q;i++)
if(op==2)
}}
bzoj 2002 彈飛綿羊(LCT)
傳送門biu 最終的圖一定是一棵樹,算乙個點被彈飛需要幾次只需要計算一下這個點到根的路徑上有多少點就可以了,lct。分塊做法 點這裡 include using namespace std struct node inline void maintain null new node,tree 200...
bzoj2002 彈飛綿羊
lct裸題 給出一棵樹,有修改及詢問,修改操作為修改乙個節點的父親,詢問乙個節點到根的點數。詢問及修改前只需access一遍即可。include include include include include include define rep i,x,y for int i x i y i de...
BZOJ2002 彈飛綿羊
這題可以用分塊暴力做,這裡給出正解lct的 對於每乙個彈射器i k相當於i的父親,大於n的全部歸到n 1上。這樣對於修改操作就像於換了個父親,我們要記錄下上一次的父親因為在splay中父親可能會改變。對於查詢操作就相當於把n 1mroot到根,因為你新增時會更新,不能確保n 1的位置。而答案就是xs...