某天,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 因此總時間複雜度...