HNOI2010 彈飛綿羊 LCT亂搞題

2022-09-10 00:45:34 字數 1248 閱讀 3508

最近新學了lct,又可以刷一堆水(keng)題了,真是開心啊

傳送門:

感覺還是很顯然吧,直接將這個(點)與(點+勁度係數)的點連線起來,

同時考慮建乙個空結點n+1(編號0不好處理,於是所有編號向上平移乙個單位),意為所有的綿羊到這個地方就能夠被彈飛

如果連線的時候i+k<=n就連不然就和n+1連線起來

每一次詢問操作,setroot(x) access(n+1) splay(n+1),答案就是siz[n+1]-1

而每次進行修改勁度係數的時候,不只是光要連,還要將原來的邊刪掉。 就可以了(同時記得編號連線不大於n+1規定)

就這樣搞定了,開始痛苦地除錯罷!

cheer!

#include#define zig(x) zigzag(x,1)

#define zag(x) zigzag(x,2)

using namespace std;

const int maxn=200005;

int n,m,rev[maxn],ls[maxn],rs[maxn],fa[maxn],jingdu[maxn],siz[maxn];

bool isroot(int x)

void putup(int x)

void zigzag(int x,int knd)

fa[x]=z; fa[y]=x;

if(knd==1)

else

putup(y); putup(x);

}void putdowm(int x)

int sta[maxn];

void splay(int x)

while(top) putdowm(sta[top--]);

while(!isroot(x))

else

else

}else

else

}} }

}void acc(int x)

}void setroot(int x)

void link(int a,int b)

void cut(int a,int b)

int getroot(int a)

int ans(int x)

void change(int x,int y)

int main()

scanf("%d",&m);

for(int i=1;i<=m;i++)

else

}}

hnoi2010 彈飛綿羊

題目描述很明確,現在的目標是均攤兩個操作的複雜度 現在我們已知有兩種方法 1.每次用o 1 的時間修改k值,用o n 的時間直接模擬回答詢問 2.每次修改了k值後用o n 的時間更新所有答案,o 1 時間回答 均攤這兩種操作,可以這樣做 由於只可以從前往後跳,所以可以把跳躍路徑壓縮,更新時把壓縮的部...

HNOI 2010 彈飛綿羊

要求維護乙個 n 個節點的森林,實現 m個詢問,其中包括 n 200,000m 100,000 動態樹的入門題。只需要實現ac cess 操作以及維護子樹大小si ze即可。其實我做這道題是為了找找寫動態樹的感覺,發現了不少要注意的細節。總結地說,越是基本的函式就越不能打錯,不然就要花好多的時間去查...

HNOI2010彈飛綿羊

話說我是冒著巨大的風險a這道題的 xc說不讓上其他oj 這題其實很簡單,每個點如果他能往後跳,那就只能跳到唯一的乙個,這顯然是跟森林,用lct就好,維護下size。突然變短 include include define fo i,a,b for int i a i b i define lc c x...