BJOI2019 刪數 線段樹

2022-05-03 18:54:14 字數 1177 閱讀 3456

題目大意:乙個數列若能在有限次數內刪空,則稱這個數列可以刪空,一次刪除操作定義如下:

記當前數列長度為$k$,則刪掉數列中所有等於$k$的數。

現在有乙個長度為$n$的數列$a$,有$m$次修改操作,為單點變值/整體增加或者減少$1$,問每次修改後,最少需要修改序列中多少個數,使得序列可以被刪除。

資料範圍:$n≤150000$。

我們首先考慮下最少需要修改的次數,我們設$b[i]$為數列$a$中填寫了i的值得數量。

對於每乙個$i$,我們可以用$b[i]$這麼多數,覆蓋區間$[i-b[i]+1,i]$。最終的答案就是未被覆蓋的格仔數量。

證明顯然。

基於這個結論,我們就可以在$o(n)$的複雜度內求出乙個序列$a$對應的答案,可以獲得47分的好成績。

在只有單點修改的情況下,我們發現我們可以用線段樹做一下維護,就可以獲得60分的好成績。

我們發現,整體的$+1$或者$-1$,可以轉化為查詢的區間出現了移動,移動完查詢區間後,我們更新一下兩端的值即可。

這麼搞就可以過掉這一題了。

時間複雜度:$o(n\log\ n)$。

1 #include2

#define m (1<<19)

3using

namespace

std;45

struct sega[m<<1];6

void pushup(int

x)10

void upd(int x,int k)

11void pushdown(int x)

1213

void build(int x,int l,int

r)19

void updata(int x,int l,int r,int

k)26

void updata(int x,int id,int k)

27int query(int x,int l,int

r)35

36int num[m],n,q,m,orzorz[m*2]=;

37int *cnt=orzorz+m;

38int

main()else

58 printf("

%d\n

",query(1,t-move+1,t-move+n));59}

60 }

BJOI2019 刪數 線段樹

題目大意 乙個數列若能在有限次數內刪空,則稱這個數列可以刪空,一次刪除操作定義如下 記當前數列長度為 k 則刪掉數列中所有等於 k 的數。現在有乙個長度為 n 的數列 a 有 m 次修改操作,為單點變值 整體增加或者減少 1 問每次修改後,最少需要修改序列中多少個數,使得序列可以被刪除。資料範圍 n...

BJOI2019 光線 遞推

題目鏈結 令 f i 表示光線第一次從第一塊玻璃射出第 i 塊玻璃的比率。令 g i 表示光線射回第 i 塊玻璃,再射出第 i 塊玻璃的比率。容易得到 beginf i f a i f b ig i g i b a i b b ig i a g a i a g b ig i end 對於 2 式,移...

BJOI2019 排兵布陣

今天比賽上這道題好像是人均題呀。好吧,就乙個簡單的,連優化都不需要的揹包dp。我們每次只需要處理在比第i個城堡的第j大的玩家大的情況,不必把所有的兵的情況都處理完。然後就可以 include include include include include include include includ...