莫隊分塊的幾道題目

2022-05-01 01:06:14 字數 2590 閱讀 6172

1. 

bzoj彈飛綿羊 跟這道題目一模一樣。hihocode的題目資料比較水,暴力也可以過。

分塊,塊內修改+查詢。

學習的別人的**。

1 #include2

#define pb push_back

3 typedef long

long

ll;4

using

namespace

std;

5 typedef pairpii;

6const

int maxn = 1e5 + 10;7

8int

n, m, k;

9int

a[maxn];

10int

be[maxn], b[maxn], c[maxn];

11void up(int

i) else19}

20int ask(int

i) 26

return

r;27}28

29void

solve()

34 k = sqrt(n + 0.5

);35

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

38 scanf("

%d", &m);

39int

x, y, v;

40while(m--) else51}

52}53}

5455

intmain()

view code

2. 區間統計,區間計數,主要是沒有線段樹區間加和的性質,無法維護,利用分塊計算計數,然後用計數分布稀疏的特徵進行k次冪的計算,比較難。

1 #include2

#define pb push_back

3 typedef long

long

ll;4

using

namespace

std;

5 typedef pairpii;

6const

int maxn = 1e5 + 10;7

const

int mod = 1e9 + 7;8

ll ppow(ll x, ll y)

18return

r;19

}20 ll tk[maxn][105

];21

intn, m, s;

22int

a[maxn];

23int

be[maxn];

24ll res[maxn];

25//

mapma;

26//

mapmc;

27int

ma[maxn], mc[maxn];

28struct

node

34return x

36};

37node q[maxn];

38ll cur;

39set

se;40void add(int

x) 47}48

void del(int

x) 53 --ma[x];

54 mc[ma[x] ]++;55}

56 ll f(int

k) 61

for (int

x : se)

64/*

65for (int i = 1; i <= s; i++)

68for (auto i = ma.upper_bound(s); i != ma.end(); i++)

*/71

return

r;72}73

void

init() 79}

80}81void

solve()

94int

x, y, v;

95for (int i = 1; i <= m; i++) ;98}

99 sort(q + 1, q + m + 1

);100

for (int i = 1, l = 1, r = 0; i <= m; i++)

106while(l >q[i].x)

110while(r >q[i].y)

114while(l

118//

cout << i << endl;

119 res[q[i].id ] =f(q[i].k);

120//

cout << res[q[i].id ] << endl;

121}

122for (int i = 1; i <= m; i++)

123 printf("

%lld\n

", res[i]);

124}

125126

intmain()

view code

上面的2題算是對分塊思想的介紹,主要是知道(l,r),可以很快的計算(l,r+1),(l,r-1),(l+1,r),(l-1,r),然後就可以利用分塊的性質。

暫時就這麼多吧,有時間做這類題目訓練一下。

bzoj3585 莫隊 分塊

description 有乙個長度為n的陣列。m次詢問,每次詢問乙個區間內最小沒有出現過的自然數。input 第一行n,m。第二行為n個數。從第三行開始,每行乙個詢問l,r。output 一行乙個數,表示每個詢問的答案。sample input 5 52 1 0 2 1 3 32 3 2 41 2 ...

分塊 莫隊學習粗略預習

分塊 莫隊學習總結 2020 08 12 16 55 32 thumb up 0 大概就是暴力的進化版,採用 大段維護,小段樸素 的思想 拿個板子說事 已知乙個數列,你需要進行下面兩種操作 將某區間每乙個數加上 k。求出某區間每乙個數的和。序列長度為1e5,運算元為1e5,裸的線段樹板子 分塊的思路...

莫隊與分塊精簡小結

我覺得我還要補上帶修莫隊,樹上莫隊等等 先咕著 分塊 引用範圍廣,實現簡潔 注意塊的邊界 一般為 sqrt 分塊。塊中可維護很多東西,維護資訊時從後往前處理。例題 hnoi2010 彈飛綿羊 includeusing namespace std define s x x x inline int r...