P2839 國家集訓隊 middle 解題報告

2021-10-17 03:12:01 字數 2913 閱讀 3085

給乙個長度為 n

nn 的序列。多次詢問,每次給出四個引數 a,b

,c,d

a,b,c,d

a,b,c,

d ,要求找乙個子區間 [l,

r]

[l,r]

[l,r

],滿足 a≤l

≤b,c

≤r≤d

a\le l\le b,c\le r\le d

a≤l≤b,

c≤r≤

d,使得子區間的中位數最大。輸出中位數的最大值。

首先,關於中位數的乙個套路性做法:二分中位數為 x

xx,再將序列中 <

x<

x 的數設為 -1,≥

x\ge x

≥x的數設為1,求區間和。若區間和 ≥

0\ge 0

≥0,則中位數 ≥

x\ge x

≥x。考慮這種思路,我們來做這題。對於乙個 x

xx,我們怎麼判斷?我們先按上面的思路,把序列改為 1/-1,接下來只要求最大的∑l∈

[a,b

]r∈[

c,d]

bi,b

i∈

\sum\limits_^b_i,b_i\in\

l∈[a,b

]∑r∈

[c,d

]​bi

​,bi

​∈。只要用線段樹維護最大前驅和,最大字尾和,區間和。那麼最後的答案就是 ([b+

1,c−

1]

[b+1,c-1]

[b+1,c

−1] 的區間和)+([a,

b]

[a,b]

[a,b

] 的最大字尾和)+([c,

d]

[c,d]

[c,d

]的最大字首和)。

可持久化線段樹即可。總複雜度 o(n

log⁡n+

qlog⁡2

n)

\mathcal o(n\log n+q\log^2 n)

o(nlogn+

qlog2n

)。

#include

#include

#include

#include

using

namespace std;

typedef

long

long ll;

char in[

1<<20]

,*ss = in,

*tt = in;

#define getchar() (ss == tt && (tt = (ss = in) + fread(in, 1, 1 << 20, stdin), ss == tt) ? eof : *ss++)

ll read()

const

int maxn =

20005

;int n, q, a[maxn]

, lsh[maxn]

, tot, rt[maxn]

, lans, dat[4]

;vector<

int> rg[maxn]

;void

lsh(

)int

lsh(

int x)

namespace sgt e[maxn <<5]

;int tot, limtot;

void

upd(sgtnode& p, sgtnode a, sgtnode b)

void

(sgtnode& p,

int k)

void

build

(int

& o,

int l,

int r)

int m =

(l + r)

>>1;

build

(e[o]

.ls, l, m)

;build

(e[o]

.rs, m+

1, r)

;upd

(e[o]

, e[e[o]

.ls]

, e[e[o]

.rs]);

}void

mdypos

(int

& o,

int pre,

int l,

int r,

int x,

int k)

else o = pre;

if(l == r)

int m =

(l + r)

>>1;

if(x <= m)

mdypos

(e[o]

.ls, e[pre]

.ls, l, m, x, k)

;else

mdypos

(e[o]

.rs, e[pre]

.rs, m+

1, r, x, k)

;upd

(e[o]

, e[e[o]

.ls]

, e[e[o]

.rs]);

} sgtnode qryrange

(int o,

int l,

int r,

int x,

int y)}}

void

sol(

int a,

int b,

int c,

int d)

else r = x -1;

} lans = lsh[lans];}

intmain()

} q =

read()

;for

(int i =

1; i <= q; i++

)return0;

}

P2839 國家集訓隊 middle

提一下靜態區間第k小的nlog2n的做法 1.建關於排名的主席樹 按排名順序建樹 2.二分答案。這樣做靜態區間第k小的雖然有些zz,但它的意義在於將線段樹 維護的物件改變了。1 include2 using namespace std 3int n,m,cnt 4int a 5 midd 5int ...

Luogu P2839 國家集訓隊 middle

首先 b,c 是必選的,然後選一段 a,b 的字尾和一段 c,d 的字首 都可空 對於中位數 這裡中位數採用這道題的定義 有個常見的處理方式 二分 mid,將 0,則說明 mid 的佔到了一半以上,即中位數 mid。採用這種處理方式,二分中位數,由於要中位數盡量大,所以要貪心,選字尾和字首使得大於等...

解題報告 P2839 國家集訓隊 middle

絕世好題 首先對於求區間 l,r 的中位數,有乙個套路可以套 二分乙個值 d 每次將區間內 的點設為 1 將 ge d 的點設為 1 當區間和 ge 0 時 d 值過大或剛好,若 0 則 d 值過小。我們繼續觀察題目。我們發現,每次詢問的區間不固定,但是 b 1,c 1 這個區間是必須選擇的,所以我...