國家集訓隊 middle

2022-08-13 15:30:16 字數 2280 閱讀 9065

乙個長度為n的序列a,設其排過序之後為b,其中位數定義為b[n/2],其中a,b從0開始標號,除法取下整。

給你乙個長度為n的序列s。

回答q個這樣的詢問:s的左端點在[a,b]之間,右端點在[c,d]之間的子串行中,最大的中位數。

其中a位置也從0開始標號。

第一行序列長度n。

接下來n行按順序給出a中的數。

接下來一行q。

然後q行每行a,b,c,d,我們令上個詢問的答案是x(如果這是第乙個詢問則x=0)。

令陣列q=。

將q從小到大排序之後,令真正的要詢問的a=q[0],b=q[1],c=q[2],d=q[3]。

輸入保證滿足條件。

q行依次給出詢問的答案。

5

170337785

271451044

22430280

969056313

206452321

33 1 0 2

2 3 1 4

3 1 4 0

271451044

271451044

969056313

0:n,q<=100

1,...,5:n<=2000

0,...,19:n<=20000,q<=25000

可以將中位數問題轉化成類似於01序列排序的問題

每次二分乙個中位數

然後原序列大於等於這個數的設為1

其餘的設為-1

然後就要找一段區間,使區間左端點在[a,b],右端點在[c,d]

如果有這樣一段區間的值》=0,那麼二分的這個數就是合法的

然後考慮優化這個過程

顯然答案可以分成三部分

一部分是[b+1,c-1]的必須選擇的部分

然後再維護乙個[a,b]的最大字尾和和乙個[c,d]的最大字首和

這個操作我們可以用主席樹來實現

對於每乙個權值建一棵主席樹

維護區間和,最大字尾和和最大字首和

#include#include#include#include#include#include# define ls t[now].l

# define rs t[now].r

const int m = 25005 ;

using namespace std ;

inline int read()

while(c>='0'&&c<='9')

return x*w ;

}int n , v[m] , s[m] , rt[m];

int tot , cnt , val[m] , q[8] ;

map < int , int > p ;

vector < int > vec[m] ;

struct node

} t[m << 5] ;

inline void merge(node &temp , node tl , node tr)

void insert(int x , int v , int l , int r , int &now)

int mid = (l + r) >> 1 ;

if(mid >= x) insert(x , v , l , mid , ls) ;

else insert(x , v , mid + 1 , r , rs) ;

merge(t[now] , t[ls] , t[rs]) ;

}node query(int l , int r , int l , int r , int now)

}inline bool chk(int mid)

return (ans >= 0) ;

}inline int solve()

return val[ret] ;

}int main()

sort(s + 1 , s + n + 1) ;

for(int i = 1 ; i <= n ; i ++)

for(int i = 1 ; i <= n ; i ++)

for(int i = 1 ; i <= n ; i ++) insert(i , 1 , 1 , n , rt[0]) ;

for(int i = 1 ; i <= cnt ; i ++)

} int t = read() , lastans = 0 ;

while(t --)

return 0 ;

}

國家集訓隊 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

考慮二分答案,把問題轉化成可行性問題,然後發現b 1 c 1 是一定必選的,另外兩邊要想最大就是維護乙個連續最大子段和 然後每次二分值改變,只會影響線段樹上log個位置,於是考慮主席樹 includeusing namespace std inline intread while ch 0 ch 9...

國家集訓隊 middle

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