HNOI2010 彈飛綿羊

2022-05-26 20:36:29 字數 1036 閱讀 4253

蒟蒻看到很多大佬用分塊的方法解決了這道題,但是本蒟蒻不會分塊,但我會lct啊,所以就用lct解決了這道題。

對於每乙個節點 維護他的size,每乙個彈射器 由它即將到達的彈射器向他連邊

虛擬乙個n+1號節點 進行最後一次彈射,

每次直接查詢對應位置的size即可。

把給出的資料當做森林,即i的父親是i+k[i],詢問的是到根的路徑長度+1,可以修改父親。所以只需要link操作即可,注意把超過n的節點設為0。每次詢問先access,然後splay到根(splay中要維護size),這樣所詢問的答案就是節點在splay上的左子樹大小+1。

// luogu-judger-enable-o2

#include#include#include#includeusing namespace std;

const int maxn = 200010;

inline int read()

while(isdigit(k))

return (flag ? x : -x);

}struct nodetree[maxn];

int n,m,k[maxn];

void update(int x)

inline int getson(int x)

void rotate(int x)

update(fa);

update(x);

}void splay(int x) }}

void access(int x)

}void link(int u,int v)

int query(int x)

int main()

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

m = read();

int xx,x,y;

while(m--)

} return 0;

}

另外,lct的時間複雜度是\(o(logn^2)\),所以不開氧氣優化也能過。

蒟蒻的耗時為652ms。

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...