題目鏈結
據說這道題要用一道叫做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。
這樣的話,詢問的時候我們只需要下面一段**就可以了。
預處理的話,我們要倒著往前計算,因為前面的sum用到了後面的sum。int
now = x;
while(x != -1)
預處理和修改的話詳情請見**。
#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...