HNOI2010 彈飛綿羊

2022-05-10 23:17:25 字數 2283 閱讀 1905

某天,lostmonkey發明了一種超級彈力裝置,為了在他的綿羊朋友面前顯擺,他邀請小綿羊一起玩個遊戲。遊戲一開始,lostmonkey在地上沿著一條直線擺上n個裝置,每個裝置設定初始彈力係數ki,當綿羊達到第i個裝置時,它會往後彈ki步,達到第i+ki個裝置,若不存在第i+ki個裝置,則綿羊被彈飛。綿羊想知道當它從第i個裝置起步時,被彈幾次後會被彈飛。為了使得遊戲更有趣,lostmonkey可以修改某個彈力裝置的彈力係數,任何時候彈力係數均為正整數。

第一行包含乙個整數n,表示地上有n個裝置,裝置的編號從0到n-1,接下來一行有n個正整數,依次為那n個裝置的初始彈力係數。第三行有乙個正整數m,接下來m行每行至少有兩個數i、j,若i=1,你要輸出從j出發被彈幾次後被彈飛,若i=2則還會再輸入乙個正整數k,表示第j個彈力裝置的係數被修改成k。對於20%的資料n,m<=10000,對於100%的資料n<=200000,m<=100000

對於每個i=1的情況,你都要輸出乙個需要的步數,佔一行。

4 1 2 1 1

31 1

2 1 1

1 12

3先建樹,如果i+k大於n,就和n+1,建邊表示彈出,否則和i+k建邊

建樹用lct的link操作

修改就cut操作刪掉舊邊,加上新邊

查詢時,把n+1變為樹根,把x到n+1都變為實根

查詢路徑上節點數-1輸出

splay維護size,因為總是只有一顆完整的樹,所以不需要判斷cut和link操作的可行性

1 #include2 #include3 #include4 #include5 #include6

using

namespace

std;

7int size[200005],ch[200005][2],rev[200005],pre[200005],isrt[200005],n,m,k[200005];8

void pushup(into)9

13void pushdown(int

o)1425}

26void push(int

o)27

31void rotate(int o,bool

kind)

3241

void splay(int

o)4255}

56}57void access(int

o)5868}

69void makeroot(int

o)70

76void link(int x,int

y)77

81void cut(int x,int

y)82

89int

main()

90 100 cin>>m;

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

102112

else

113125

}126

}127 }

view code lct

還有分塊的做法

把n個點分成$sqrt n$塊

預處理出f[i],s[i]

f[i]表示i會跳到下一塊的地方

s[i]表示i跳到f[i]所需要的步數

查詢時直接往後跳,最多跳$sqrt n$塊

修改時只修改那一塊$sqrt n$個元素

1 #include2 #include3 #include4 #include5 #include6

using

namespace

std;

7int n,k[300001],lim,s[300001],f[300001

],m;

8int

main()

9 15 lim=sqrt(n);

16for (i=1;i<=n;i+=lim)

1723

}24 cin>>m;

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

2636 printf("

%d\n

",cnt);37}

38else

3949}50

}51 }

view code分塊

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