題目鏈結
看到題解中「維護兩個堆」,突然想到了這道題的解法
維護兩個堆:大根堆h1, 小根堆h2
大根堆裡的是最小的i個值,小根堆裡是剩下的值
每add乙個值時
插入到小根堆中,
再比較小根堆的最小值與大根堆的最大值
若h2.top()
將兩個元素取出,換一下再放進去
需要get時
將h2.top()取出,放進h1中,
再輸出h1.top()
1 #include2 #include3 #include4 #include5using
namespace
std;
6#define ll long long
7#define n 200010
8#define inf 1e18
9ll m,n;
10struct
add a[n];
14struct
cmp18
};19 priority_queueh1;
20 priority_queue< ll, vector, cmp >h2;
21inline ll read()
24while('0'
<=c&&c<='
9')
25return x*f;26}
27int
main()
2842
for(ll j=1;j<=a[i].get;j++)48}
49return0;
50 }
洛谷P1801 黑匣子
題目傳送門 分析 這題和另外乙個題目中位數非常相似,有興趣可以先看看,比這一題簡單。首先暴力模擬還是別想了,估計30 的資料都有點懸。正解應該是用二叉堆。但是如果用乙個堆當然不方便,所以建兩個堆,乙個大根堆,乙個小根堆,每次只要出現詢問操作,就把小根堆的堆頂丟進大根堆中維護,然後輸出就可以了,但是要...
洛谷P1801 黑匣子
long long就果然還是就該用cout,沒有lld的ll留下了悔恨的眼淚 鏈結一放,要看什麼對頂堆的走開走開,我只會離散化加權值樹狀陣列 首先吧,這個詢問依次遞增就友善的一批,然後詢問某刻第k位,我們用權值樹狀陣列。首先如果i有,那麼在陣列中下標為i的位置就打成1,沒有就是0,樹狀陣列裡面存的是...
洛谷 P1801 黑匣子
好像很久沒有更過部落格了,因為博主這幾周很忙。其實是在搞頹。題意很難懂,所以就不重複了。其實是懶。一眼看上去這是個 splay 裸題,直接插入乙個數,查詢區間第 k 大,但是這樣太不優美了,配不上 noi導刊 這幾個字,所以這題肯定有更優美的做法。注意到這道題有乙個很優美的性質,k 是遞增的,然後我...