這題以前是用lct寫的,然後某考試中發現分塊**妙,要去學習,
首先來水一水題
我以前的lct
思路:
把彈簧分塊,然後維護兩個資訊:
1.走出當前分塊需要幾步;
2.走出當前分塊後到了哪個點。
於是修改彈簧x的時候就把本塊中的起始位置到x重算一遍,
查詢彈簧x的時候就按第二個資訊一直跳,一次跳出乙個分塊,每次加上第乙個資訊即可 效率o
((n+
m)n‾
√2)
感想:
分塊**好,分塊**短,分快**妙
**:
#include
#include
#include
#include
#include
#include
#define for(i, a, b) for(int i = (a); i <= (int)(b); ++i)
#define forr(i, a, b) for(int i = (a); i >= (int)(b); --i)
#define n (200000+5)
#define sn (500+5)
using
namespace
std;
int n, siz, jump[n], bnum[n], blo[sn][sn];
int tot[n], pos[n];
void insert(int nc, int now)
++tot[id]; pos[id] = now+jump[now];
}void modify(int nc, int now)
int query(int now)
return ans;
}int main()
forr(i, n, 1) insert(bnum[i], i);
scanf("%d", &m);
int op, x, y;
while(m--)
}return
0;}
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即可。其實我做這道題是為了找找寫動態樹的感覺,發現了不少要注意的細節。總結地說,越是基本的函式就越不能打錯,不然就要花好多的時間去查...