LibreOJ 6279 數列分塊入門 3

2021-09-20 07:04:16 字數 2101 閱讀 7716

題意:給你乙個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其實是為了區分暴力和一些常數較大的寫法。接著第二題的解法,其實只要把塊內查詢的二分稍作修改即可。不過這...