AcWing 106 動態中位數(對頂堆)
阿新 • • 發佈:2020-07-16
解題思路
對頂堆模板題,一個堆對應一半。
程式碼
priority_queue<int, vector<int>, less<int> > l, clears1; priority_queue<int, vector<int>, greater<int> > r, clears2; vector<int> ans; int main(){ int t; scanf("%d", &t); while(t--) { int num, m; scanf("%d%d",&num,&m); for (int i = 1; i<=m; ++i) { int tmp; scanf("%d",&tmp); //大根堆存[l,mid] 小根堆存[mid+1,r] if(r.empty()||tmp>r.top()) r.push(tmp); else l.push(tmp); //維護兩個堆的大小 while (l.size()>i/2) { r.push(l.top()); l.pop(); } while(l.size()<i/2) { l.push(r.top()); r.pop(); } if (i&1) ans.push_back(r.top()); } printf("%d %d\n", num, (m+1)/2); int sz = ans.size(); for (int i = 0; i<sz; ++i) printf("%d%c", ans[i], (i+1)%10==0?'\n':' '); if (sz%10) putchar(endl); ans.clear(); l = clears1; r = clears2; } return 0; }