數列分塊入門5 LibreOJ 6281

2021-10-23 16:24:17 字數 3175 閱讀 7207

題意

有 n

nn 個數, n

nn 次操作,每次操作為區間開方或者區間求和。

解法分塊。

a [i

]<232

a[i]<2^

a[i]

<23

2 ,而 232→

216→2

8→24

→22→

21→1

2^\to 2^\to 2^\to 2^\to 2^\to 2^\to 1

232→21

6→28

→24→

22→2

1→1 ,所以 a[i

]a[i]

a[i]

最多開方 6

66 次就變成 1

11 。所以可以用乙個 cnt

[id]

cnt[id]

cnt[id

] 來標記每乙個塊中有多少個 1

11 ,如果 cnt

[id]

==

bcnt[id]==b

cnt[id

]==b

,其中 b

bb 表示塊的大小,則這個塊中全是 1

11 ,那麼就不用再對這個塊進行操作了。然後用 res

[id]

res[id]

res[id

] 來維護每乙個塊的答案即可。

修改的操作複雜度為小塊 n

nn 次操作 的 o(n

n)

o(n \sqrt n)

o(nn​)

加大塊的 o(6

n⋅n)

o(6 \sqrt n \cdot \sqrt n)

o(6n​⋅

n​) 。

查詢的複雜度為 o(n

)o(\sqrt n)

o(n​

) ,n

nn 次查詢。

所以總複雜度為 o(n

n)

o(n \sqrt n)

o(nn​)

。**

#pragma region

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

using

namespace std;

typedef

long

long ll;

#define rep(i, a, n) for (int i = a; i <= n; ++i)

#define per(i, a, n) for (int i = n; i >= a; --i)

namespace fastio

inline

charnc(

)}return

*p1++;}

inline

bool

blank

(char ch)

template

<

class

t>

inline

bool

r(t &x)

inline

boolr(

double

&x)if

(sign)

x =-x;return

true;}

inline

boolr(

char

*s)inline

boolr(

char

&c)return

true;}

template

<

classt,

class..

. u>

bool

r(t &h, u &..

. t)

#undef out_size

#undef buf_size};

// namespace fastio

using

namespace fastio;

template

<

class

t>

void_w(

const t &x)

void_w(

const

int&x)

void_w(

const

int64_t

&x)void_w(

const

double

&x)void_w(

const

char

&x)void_w(

const

char

*x)template

<

classt,

class

u>

void_w(

const pair

&x)template

<

class

t>

void_w(

const vector

&x)voidw(

)template

<

classt,

class..

. u>

voidw(

const t &head,

const u &..

. tail)

#pragma endregion

const

int maxn =

1e5+5;

ll a[maxn]

, b, cnt[maxn]

;ll res[maxn]

;void

update

(int l,

int r)

}else

rep(id, idl +

1, idr -1)

}rep

(i, idr * b, r)}}

ll query

(int l,

int r)

else

return ans;

}int

main()

rep(i,

1, n)

}

LibreOJ 6279 數列分塊入門 3

題意 給你乙個n nn個整數的序列a aa,讓你進行兩種操作 分析 這裡用分塊 與第二題相似,查詢前驅我們同樣需要排序,不過這裡可能會想到這樣的情況,即對於查詢x xx前驅,如果查詢區間內有多個x,這樣顯然直接二分是不行的,即我們需要去重,或者統計區間內每個元素的個數,這裡便用到了set setse...

LibreOJ 6280 數列分塊入門 4

題意 給你乙個n個整數的序列,讓你進行兩種操作 分析 這裡用分塊 這題直接做就行了,要先預處理下各塊的元素和,對它進行維護 修改的時候,對區間的不完整塊進行暴力,若是完整塊,就加到標記上 對於查詢,不完整塊暴力求和,完整塊,拿標記乘以區間長度並加上塊的元素和 include include incl...

LibreOJ 6283 數列分塊入門 7

題意 給你乙個n nn個整數的序列a aa,讓你進行三種操作 分析 這裡顯而易見的是,如果我們分塊,那麼需要兩個標記來儲存加法標記和乘法標記,那麼這裡有個關鍵問題,就是順序,順序不同結果不同 我們修改的時候是有順序的,而我們對於標記的操作,到最後是統一修改的,並不考慮乘法和加法的順序 假設這裡有乙個...