牛客多校第七場E Find the median

2021-09-26 05:45:21 字數 1928 閱讀 4299

題意:每次在乙個空區間內加入[l,r]區間內所有的數,然後問每次加入後的中位數是什麼。

題解:一道線段樹的題目。

a:線段樹的葉子節點維護了乙個區間,這個區間是[l,r+1),為什麼是這區間?(因為這樣能不重不漏的包含所有的區間,每次查詢的時候也不會漏掉,自己畫一顆線段樹基本能明白了)。

b:然後查詢的時候,記錄一下這個區間的個數,然後減去這個區間內有能最大的容納的不同的個數,最後相減得到答案。

閒話:太久沒寫線段樹,導致這題a得太慢了。以後上來就找線段樹的題目吧。

**:

#include

#include

#include

#include

using namespace std;

const int mx =

5e5+7;

typedef long long ll;

struct node tree[mx<<3]

;int n;

ll x[mx]

, y[mx]

, l[mx]

, r[mx]

;ll qc[mx <<3]

;ll a, b, c, mo;

void

pushup

(int id)

void

pushdown

(int id)

}void

build

(int id, int l, int r)

int mid =

(l + r)

>>1;

build

(id<<

1, l, mid)

;build

(id<<1|

1, mid +

1, r)

; tree[id]

.v = tree[id <<1]

.v + tree[id <<1|

1].v;}

void

update

(int id, int l, int r,int rl,int rr,int lz)

if(rl >= r || rr < l)

return

;pushdown

(id)

; int mid =

(l + r)

>>1;

update

(id <<

1, l, mid, rl, rr, lz)

;update

(id <<1|

1, mid +

1, r, rl, rr, lz)

;pushup

(id);}

ll query

(int id, int l, int r,int rl,int rr)

int main()

sort(1

+ qc,

1+ qc +cnt)

; cnt =

unique

(qc +

1, qc +

1+cnt)

- qc -1;

ll num =0;

build(1

,1, cnt)

;for

(int i =

1; i <= n; i++

) ans =

query(1

,1, cnt,1,

l); ll trans = ans - m;

ll re = tree[tree[l]

.index]

.c / tree[tree[l]

.index]

.v; ll ret = qc[l]

- trans / re -1;

printf

("%lld\n"

, ret);}

return0;

}

2019牛客多校第七場

給定乙個01串,求最少的劃分次數,使得每部分的01串都是迴圈字典序最小。從最長的整個串貪心,暴力判斷是否是迴圈字典序最小,若是,直接輸出前面的串,然後後面的串再進行新一輪判斷。include using namespace std const int n 205 int t string s vec...

2020牛客多校第七場H

題目鏈結 任何 1,k 是有效答案。如果 n,k 是有效答案,那麼 n k,k 和 n k,k 都是有效答案。給出t組,n和k 範圍1 1e12 求出 n,k 在n n,k k範圍內的有效個數。在k不變的情況下,n的取值範圍只可能是k的倍數,或者k的倍數 1,可以o 1 算出當前k對應的答案個數。即...

2020牛客多校第七場H Dividing

正整數二元組 legend tuple n,k 是這樣定義的 統計有多少個 legend tuple n,k 滿足 1 n n,1 k k,其中 n 和 k 是不超過 10 12 的整數 可以很容易發現答案即為n k 0,或者 n 1 k 0的對數 對於一部分k,n k是相等的,所以可以直接整除分塊...