1. 程式人生 > 其它 >動態中位數

動態中位數

code

#include<iostream>
#include<algorithm>
#include<queue>
#include<vector>
#define fir(i,a,b) for(int i=a;i<=b;++i)
using namespace std;
priority_queue<int, vector<int>, greater<int> > q1, kong1;
priority_queue<int> q2, kong2;
void init() {
	int t, x, n, now;
	cin >> t;
	while (t--) {
		cin >> x >> n; //index of date set,number of date
		cout << x << ' ' << (n + 1) / 2 << '\n';
		q1 = kong1, q2 = kong2;
		int cnt = 0;
		fir(i, 1, n) {
			cin >> now;
			if (q1.empty()) {
				q1.push(now);
			} else {
				if (now > q1.top()) {
					q1.push(now);
				} else {
					q2.push(now);
				}
				while (q1.size() < q2.size()) {
					q1.push(q2.top());
					q2.pop();
				}
				while (q1.size() > q2.size() + 1) {
					q2.push(q1.top());
					q1.pop();
				}
			}
			if (1 & i) {//output when odd index
				++cnt;
				cout << q1.top() << ' ';
				if (!(cnt % 10)) {
					cout << '\n';
				}
			}
		}
		if(cnt%10){
			cout<<'\n';
		}
		
	}
}
int main() {
	ios::sync_with_stdio(false);
	cin.tie(0);
	init();
	return 0;
}

quetion

動態中位數
   題目
   提交記錄
   討論
   題解
   視訊講解

依次讀入一個整數序列,每當已經讀入的整數個數為奇數時,輸出已讀入的整數構成的序列的中位數。

輸入格式
第一行輸入一個整數 P,代表後面資料集的個數,接下來若干行輸入各個資料集。

每個資料集的第一行首先輸入一個代表資料集的編號的整數。

然後輸入一個整數 M,代表資料集中包含資料的個數,M 一定為奇數,資料之間用空格隔開。

資料集的剩餘行由資料集的資料構成,每行包含 10 個數據,最後一行資料量可能少於 10 個,資料之間用空格隔開。

輸出格式
對於每個資料集,第一行輸出兩個整數,分別代表資料集的編號以及輸出中位數的個數(應為資料個數加一的二分之一),資料之間用空格隔開。

資料集的剩餘行由輸出的中位數構成,每行包含 10 個數據,最後一行資料量可能少於 10 個,資料之間用空格隔開。

輸出中不應該存在空行。

資料範圍
1≤P≤1000,
1≤M≤99999,
所有 M 相加之和不超過 5×105。

輸入樣例:
3 
1 9 
1 2 3 4 5 6 7 8 9 
2 9 
9 8 7 6 5 4 3 2 1 
3 23 
23 41 13 22 -3 24 -31 -11 -8 -7 
3 5 103 211 -311 -45 -67 -73 -81 -99 
-33 24 56
輸出樣例:
1 5
1 2 3 4 5
2 5
9 8 7 6 5
3 12
23 23 22 22 13 3 5 5 3 -3 
-7 -3