洛谷 P3203 彈飛綿羊 分塊

2021-08-18 02:38:58 字數 1516 閱讀 3979

題目鏈結

據說這道題要用一道叫做lct的資料結構,然而我不會。。。

一排有n個彈簧裝置,從第

i i

個可一往後跳k[

i]' role="presentation" style="position: relative;">k[i

]k[i

]步。分塊首先都要先從暴力開始想起:

我們記錄從任意乙個點出發,下一次能跳到**,這樣的話我們每次詢問,只需要乙隻沿著這條鏈往下走即可,顯然最壞的時間複雜度是o(

n2) o(n

2)

,修改的時間複雜度為o(

1)o (1

)。

優化:

讓我們使用分塊來進行優化,我們把一條直線上的n個彈簧進行分塊,並對於每個彈簧記錄兩個屬性:su

m[i]

s um

[i

]和nx

tb[i

] nxt

b[i]

。其中s

um[i

] sum

[i

]表示的含義是從

i i

彈簧出發在本塊內的經過的節點的個數,nx

tb[i

]' role="presentation" style="position: relative;">nxt

b[i]

nxtb

[i]表示的是從

i i

彈簧出發,彈到下一塊中的第乙個彈簧的編號,彈飛設定為-1。

這樣的話,詢問的時候我們只需要下面一段**就可以了。

int

now = x;

while(x != -1)

預處理的話,我們要倒著往前計算,因為前面的sum用到了後面的sum。

預處理和修改的話詳情請見**。

#include 

#include

#include

#include

using namespace std;

const int maxn = 200007;

#define pr(x) cout<<#x<<":"int nxtb[maxn];

int val[maxn];

intsum[maxn];

int n,m,op,x,y;

inline void read(int &x)

int main()

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

else

if(br == bl)

else

}read(m);

while(m--)

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

}else

else

if(bl == br)

else

for(int i = x-1;i >= max(1,bl*base);--i)}}

}return

0;}

洛谷P3203 彈飛綿羊 分塊

有n nn個裝置,每個裝置會把羊往後彈a i a i a i 要求支援一下操作 這道題不說是分塊基本就沒思路了。但是一知道是分塊就很好解了。我們分成n sqrt n n 個塊,每乙個彈射裝置維護兩個值 w i w i w i 彈出這個塊之後回到哪乙個彈射裝置。s i s i s i 要多少次才能彈出...

洛谷P3203 彈飛綿羊 分塊

有nn 個裝置,每個裝置會把羊往後彈a i a i 要求支援一下操作 這道題不說是分塊基本就沒思路了。但是一知道是分塊就很好解了。我們分成nn 個塊,每乙個彈射裝置維護兩個值 w i w i 彈出這個塊之後回到哪乙個彈射裝置。s i s i 要多少次才能彈出這個塊。那麼對於每乙個操作 如果是1 1操...

P3203 彈飛綿羊 分塊

觀察資料範圍,發現可以分塊。只需要處理每個點跳出所在塊後的位置和次數即可。目的是為了加速查詢並降低修改複雜度。對於修改,重構整個塊內資訊即可。時間複雜度正確的一批 具體實現也挺簡單。注意重構時從後往前貢獻即可。include include include include include inclu...