國家集訓隊 middle

2022-05-06 23:27:08 字數 1406 閱讀 2934

考慮二分答案,把問題轉化成可行性問題,然後發現b+1 - c-1 是一定必選的,另外兩邊要想最大就是維護乙個連續最大子段和

然後每次二分值改變,只會影響線段樹上log個位置,於是考慮主席樹

#includeusing

namespace

std;

inline

intread()

while(ch<'

0'||ch>'9'

);

dowhile(ch>='

0'&&ch<='9'

);

return f*x;

}const

int maxn = 20000 + 5

;int

n;struct

num}a[maxn];

struct

p_tree

tree[maxn * 18

];int

cnt,root[maxn];

int q[4

];inline

void pushup(int

rt)inline

void build(int &rt,int l,int

r)

int mid = (l + r) >> 1

; build(tree[rt].lc,l,mid);

build(tree[rt].rc,mid+1

,r);

pushup(rt);

}inline

void insert(int &rt,int rt1,int l,int r,int

k)

int mid = (l + r) >> 1

;

if(mid >= k) tree[rt].lc = 0

,insert(tree[rt].lc,tree[rt1].lc,l,mid,k);

else tree[rt].rc = 0,insert(tree[rt].rc,tree[rt1].rc,mid+1

,r,k);

pushup(rt);

}inline

int query3(int rt,int l,int r,int l,int

r)inline

int query1(int rt,int l,int r,int l,int

r)inline

int query2(int rt,int l,int r,int l,int

r)inline

bool check(int

mid)

intmain()

lastans =a[ans].val;

printf(

"%d\n

",lastans);

}}

國家集訓隊 middle

傳送門 按照中位數題的套路,二分答案 mid 序列中 ge mid 記為 1 mid 的記為 1 然後只要存在乙個區間 l,r l in a,b r in c,d 的和 ge 0 則答案可以更大,否則就更小。所以說我們就要算出區間 b 1,c 1 的和,加上 a,b 的最大字尾,還有 c,d 最大字...

國家集訓隊 middle

首先,看到中位數就應該會想到乙個經典做法,二分乙個 mid 把小於 mid 的數值為 1 大於 mid 的數值為 1 如果這個區間的和 0 的話中位數可以更大,否則要更小 而題目中要求中位數最大,所以自然這個區間的和要越大越好,自然要多取 1 我們知道 b,c 這個區間是肯定會取到的,所以只要求和,...

國家集訓隊 middle

乙個長度為n的序列a,設其排過序之後為b,其中位數定義為b n 2 其中a,b從0開始標號,除法取下整。給你乙個長度為n的序列s。回答q個這樣的詢問 s的左端點在 a,b 之間,右端點在 c,d 之間的子串行中,最大的中位數。其中a位置也從0開始標號。第一行序列長度n。接下來n行按順序給出a中的數。...