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