題意:每次在乙個空區間內加入[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是相等的,所以可以直接整除分塊...