乙個長度為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行依次給出詢問的答案。
5170337785
271451044
22430280
969056313
206452321
33 1 0 2
2 3 1 4
3 1 4 0
2714510440:n,q<=100271451044
969056313
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 這個區間是肯定會取到的,所以只要求和,...