P3203 HNOI2010 彈飛綿羊

2022-05-20 20:13:10 字數 1166 閱讀 6749

p3203 [hnoi2010]彈飛綿羊

本來以為是個水題,其實還是有思維性的

\(lct\)上操作和模板一樣,顯然我們維護子樹大小

開始是想\(link(x,x+val[x])\)當\(x+val[x]>n\)時就不連,然後查詢\(x\)時就查詢右子樹大小

反例就不舉了隨手就是個反例吧反正這種辦法是錯的

正解:\(link(x,x+val[x])\)當\(x+val[x]>n\)時\(link(x,n+1)\)

查詢\(x\)時其實就是查詢\(x\)~\(n+1\)這條鏈:\(makeroot(x); access(n+1); splay(n+1);\),輸出\(size[n+1]-1\)

#include#include#include#include#include#include#includeusing namespace std;

typedef int ll;

const ll maxn=1e6;

inline ll read()

while(c>='0'&&c<='9')x=(x<<3)+(x<<1)+c-'0',c=getchar();

return x*f;

}ll n,m;

ll size[maxn],fa[maxn],son[maxn][2],r[maxn],val[maxn];

inline bool notroot(ll x)

inline void pushr(ll x)

inline void pushdown(ll x)

}inline void update(ll x)

inline void rotate(ll x)

ll sta[maxn];

inline void splay(ll x)

rotate(x); }}

inline void access(ll x)

}inline void makeroot(ll x)

inline void split(ll x,ll y)

inline void link(ll x,ll y)

inline void delet(ll x,ll y)

int main()

m=read();

while(m--)else

}}

P3203 HNOI2010 彈飛綿羊

題目大意 有n個裝置,每個裝置設定初始彈力係數ki,當達到第i個裝置時,會往後彈ki步,達到第i ki個裝置,若不存在第i ki個裝置,則被彈飛。求從第i個裝置起步時,被彈幾次後會被彈飛。帶修改操作,下標0開始 分析 開始打算倒著跑一遍記錄每個位置彈飛要多少次,但是發現這樣做修改操作複雜度 為了減少...

P3203 HNOI2010 彈飛綿羊

某天,lostmonkey發明了一種超級彈力裝置,為了在他的綿羊朋友面前顯擺,他邀請小綿羊一起玩個遊戲。遊戲一開始,lostmonkey在地上沿著一條直線擺上n個裝置,每個裝置設定初始彈力係數ki,當綿羊達到第i個裝置時,它會往後彈ki步,達到第i ki個裝置,若不存在第i ki個裝置,則綿羊被彈飛...

P3203 HNOI2010 彈飛綿羊(LCT)

p3203 hnoi2010 彈飛綿羊 lct板子 用乙個 p i 陣列維護每個點指向的下個點。每次修改時cut 1 link 1就解決了 被彈出界時新設乙個點,權為0,作為終點表示出界點。其他點點權為1。然後統計一下路徑就好辣 注意點的編號從0開始 includeinline void swap ...