牛客網提高組round 1

2022-06-17 04:18:11 字數 1059 閱讀 6547

1.

60pts

用堆來實現維護中位數。

用大跟堆維護小於中位數的數,用小跟堆維護比中位數大的數。

若兩堆元素之差大於一,把中位數push進較少元素的堆,把較多元素堆的堆頂作為中位數,pop。

o(n^2log n)

#includeusing

namespace

std;

struct

cmp1

};struct

cmp2

};#define ll long longpriority_queue

long,vector

long>,cmp2>a;

priority_queue

long,vector

long>,cmp1>b;

ll x,az,n,len,aa[

200300],maxer=0

;int

main()

else

if((j-i+1)>=len)maxer=max(maxer,x);

}while(!a.empty())a.pop();

while(!b.empty())b.pop();

} cout

<

return0;

}

view code

滿分做法

假設mid為中位數,我們如何驗證mid為中位數是否可行呢?

即小於mid的數等於大於mid的數。

如何操作?

b[i]=

if(a[i]1

;if(a[i]>mid)b[i]=1;

如果sum(i,j)=0那麼這段數的中位數為mid

我們自然的想到sum()>0即是大於mid的數可能是中位數。

我們可以二分答案來查詢最大滿足條件的數。

用字首和來判斷mid是否可行。

複雜度o(n*logmax(a[i]))

牛客網提高五練習

吉老師的題,出的很有水平 應該是t1,t2難度 給出 l1,l2,r1,r2,m 詢問 displaystyle sum sum m i oplus j 對於前 30 分,我們可以簡單列舉 對於第二個點,我們已知乙個數 顯然對於 10 的資料範圍,我們只能考慮 o 1 或者 o logn 的演算法 ...

牛客CSP S提高組賽前集訓營1

比賽鏈結 官方題解 before t1觀察 結論題,t2樹形dp,可以換根或up down,t3正解妙,轉化為圖上問題。題目質量不錯,但資料太水了 一共n個石子堆,每個石子堆有ai個石子,兩人輪流對石子塗色 先手塗紅,後手塗藍 且需要保證當前回合塗的石子顏色不能和它相鄰的兩個同色,誰塗不下去誰輸。一...

牛客提高組模擬賽4

這題應該做法有很多吧,我提供一種奇怪的做法 將每一行連續的1提出來,形成乙個個區間 l,r 實際是求對於每一 1 leq l leq r leq m 能覆蓋它的 l,r 有多少個 怎麼求呢?首先我們將這些區間儲存在每個左端點上 迴圈列舉左端點,每次將右端點的sum 維護乙個字尾即可,累加得到每個右端...