lct 模板題,分塊也很優秀。
分塊做法
維護每個點到第一次跳到下乙個塊時的跳躍次數,並記錄其跳到下乙個塊的第乙個點。
注意常見的分塊玄學操作 n = min(sqrt(n), 100) 和 n = sqrt(n)*1.23 。
1 #include 2 #include 3 #include 4view code5using
namespace
std;67
const
int _n = 220000;8
9int
n, n, m;
10int
a[_n], f[_n], des[_n];
1112 inline int dn(int v)
1314 inline int up(int v)
1516
intmain()
1739 printf("
%d\n
", cnt);
40 } else47}
4849
return0;
50 }
lct做法
1 #include 2 #include 3view code4using
namespace
std;56
const
int _n = 220000;7
8 typedef long
long
ll;9
10 stacks;
11ll sum[_n], l[_n], r[_n], dad[_n], rev[_n], j[_n], w[_n];
1213 inline void update(ll x)
1415 inline bool isroot(ll x)
1617
void
zig(ll x)
1827
28void
zag(ll x)
2938
39 inline void
pushdown(ll x)
44return;45
}4647void
splay(ll x)
48 else61}
6263
return;64
}6566void
access(ll x)
6773
return;74
}7576 ll findroot(ll x)
7778
void makeroot(ll x)
7980
void cut(ll x, ll y)
8182
void link(ll x, ll y)
8384
intmain()
85 else
if (ins == 2
) 110
}111
return0;
112 }
nkoj2381
p2381【hnoi2010】彈飛綿羊
時間限制 : 10000 ms 空間限制 : 265536 kb
問題描述
某天,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 1樣例輸出23
** hzoi
HNOI2010 彈飛綿羊 題解(分塊)
前言 其實這個題是用lct做的,但蒟蒻因為太弱了,只會分塊qaq。題目鏈結 題目大意 給定 n 個裝置,每個裝置有彈力係數 k i 即在這個位置上會被彈到 i k i 現在有兩個操作 1.修改某個彈力裝置的彈力係數。2.問從 x 開始,彈幾次後所處位置大於 n 預處理在每個點需要被彈飛的次數 sum...
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即可。其實我做這道題是為了找找寫動態樹的感覺,發現了不少要注意的細節。總結地說,越是基本的函式就越不能打錯,不然就要花好多的時間去查...