彈飛綿羊 bzoj 2002 分塊

2021-08-13 15:25:56 字數 1211 閱讀 3244

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

表示不會動態樹,於是用了個分塊。。。

這題的分塊思想很巧妙。。。

將原序列分成n−√塊,ei表示當前i跳出i所在的那一塊需要的步數,eni表示跳出塊後的位置。

執行詢問操作時,只需要不斷地跳出下乙個塊,跳到不能再跳為止,最多跳n−√次。

執行修改操作時,只需修改本塊中在該數之前的ei和eni,從前往後修改,最多修改n−√次。

初始化的方法跟在執行修改操作時的更新方法差不多,

分塊演算法,奧妙重重!

#include

#include

#include

#include

#include

#include

#include

#include

#include

using

namespace

std;

const

int maxn=200000+100;

int e[maxn];

int en[maxn];

int belong[maxn];

int jump[maxn];

int block,cnt;

int l[maxn],r[maxn];

int n,m;

int main()

block=sqrt(n);

cnt=n/block;

if (n%block) cnt++;

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

r[cnt]=n;

int j=cnt;

for (int i=n;i>0;i--)

else

}scanf("%d",&m);

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

printf("%d\n",ans);

}else

else}}

}}

BZOJ 2002 彈飛綿羊 分塊

傳送門ber 不會寫lct 分塊水過 記錄多少次能跳出自己的塊,和跳到的點是哪個 修改時更改本塊x之前的部分 統計時模擬一遍就可以了 lct題解可以看這個人 如下 include include include define n 200050 using namespace std inline i...

bzoj 2002 彈飛綿羊 分塊

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

bzoj2002 彈飛綿羊 分塊orLCT

先簡單講一下lct做法,每個點以它的到達點為父節點 沒有到達點就連向根 結果就是深度。然後修改就是改變父親,乙個cut再乙個link就好了。然後是分塊。每個點維護它到達它所在塊外面的點,及步數,預處理o n 查詢時o n m 修改時只需要修改x所在塊在x前面的那些點即可,時間o m 因此總時間複雜度...