題意:給你乙個n
nn個整數的序列a
aa,讓你進行兩種操作:
分析:這裡用分塊;
與第二題相似,查詢前驅我們同樣需要排序,不過這裡可能會想到這樣的情況,即對於查詢x
xx前驅,如果查詢區間內有多個x,這樣顯然直接二分是不行的,即我們需要去重,或者統計區間內每個元素的個數,這裡便用到了set
setse
t,我覺得這個set
setse
t用得很妙,想出這個ide
aidea
idea
的人很厲害;
從v ec
to
rvector
vector
的使用換為set
setse
t,那麼其他的操作都很類似於第2
22題;
注意資料範圍;
**:
我們堅持一件事情,並不是因為這樣做了會有效果,而是堅信,這樣做是對的。#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
using
namespace std;
#define inf 0x7f7f7f7f
#define maxn 100050
#define n 100100
#define p 2
typedef
long
long ll;
typedef
struct
edge;
edge e[2]
;int cnt, head[1]
;inline
void
add(
int u,
int v,
int w)
inline
void
write
(int x)
inline
intread()
while
(c >=
'0'&& c <=
'9')
return x * f;
}int sz, n, m, opt, l, r, c, a[maxn]
, pos[maxn]
, mark[maxn]
;set<
int> s[
500]
;int
query
(int l,
int r,
int val)
if(pl != pr)
} set<
int>
::iterator it;
for(
int i = pl +
1; i < pr; i++
)return res;
}void
update
(int l,
int r,
int val)
s[pl]
.clear()
;for
(int i = pl * sz +
1; i <=
min(n,
(pl +1)
* sz)
; i++)if
(pl != pr)
s[pr]
.clear()
;for
(int i = pr * sz +
1; i <=
min(
(pr +1)
* sz, n)
; i++)}
for(
int i = pl +
1; i < pr; i++
) mark[i]
+= val;
}int
main()
for(
int i =
1; i <= n; i++
)else
}return0;
}
——哈維爾
LibreOJ6279 數列分塊入門 3 題解
題目描述 給出乙個長為 n 的數列,以及 n 個操作,操作涉及區間加法,詢問區間內小於某個值 x 的前驅 比其小的最大元素 輸入格式 第一行輸入乙個數字 n 第二行輸入 n 個數字,第 i 個數字為 a i 以空格隔開。接下來輸入 n 行詢問,每行輸入四個數字 opt l r c 以空格隔開。若 o...
LOJ 6279 數列分塊3
題目大意 維護 n 個數組成的序列,支援兩種操作 區間加 區間查詢某個值的前驅 小於該值的最大值,若無前驅,輸出 1 題解1 可以像分塊2一樣,維護每個塊內元素的乙個有序序列,每次查詢時二分查詢即可。如下 include define pb push back define all x x.begi...
(分塊)LOJ 6279 數列分塊入門 3
傳送門 loj 6279.數列分塊入門 3 題意 給出乙個長為n的數列,以及n個操作,操作涉及區間加法,詢問區間內小於某個值x的前驅 比其小的最大元素 以下引用hzwer大佬的解答 n 100000其實是為了區分暴力和一些常數較大的寫法。接著第二題的解法,其實只要把塊內查詢的二分稍作修改即可。不過這...