zoukankan      html  css  js  c++  java
  • POJ 3784 Running Median

    Running Median
    Time Limit: 1000MS   Memory Limit: 65536K
    Total Submissions: 2024   Accepted: 972

    Description

    For this problem, you will write a program that reads in a sequence of 32-bit signed integers. After each odd-indexed value is read, output the median (middle value) of the elements received so far.

    Input

    The first line of input contains a single integer P, (1 ≤ P ≤ 1000), which is the number of data sets that follow. The first line of each data set contains the data set number, followed by a space, followed by an odd decimal integer M, (1 ≤ M ≤ 9999), giving the total number of signed integers to be processed. The remaining line(s) in the dataset consists of the values, 10 per line, separated by a single space. The last line in the dataset may contain less than 10 values.

    Output

    For each data set the first line of output contains the data set number, a single space and the number of medians output (which should be one-half the number of input values plus one). The output medians will be on the following lines, 10 per line separated by a single space. The last line may have less than 10 elements, but at least 1 element. There should be no blank lines in the output.

    Sample Input

    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

    Sample Output

    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

    Source

    思路:对于输入的前2k个数,用一个大根堆存较小的k个数,一个小根堆存较大的k个数,每次插入元素时,与堆顶比较就行了。这个东西叫对顶堆,又可称为中根堆。复杂度nlogn。
    #include <iostream>
    #include <fstream>
    #include <sstream>
    #include <cstdlib>
    #include <cstdio>
    #include <cmath>
    #include <string>
    #include <cstring>
    #include <algorithm>
    #include <queue>
    #include <stack>
    #include <vector>
    #include <set>
    #include <map>
    #include <list>
    #include <iomanip>
    #include <cctype>
    #include <cassert>
    #include <bitset>
    #include <ctime>
    
    using namespace std;
    
    #define pau system("pause")
    #define ll long long
    #define pii pair<int, int>
    #define pb push_back
    #define mp make_pair
    #define clr(a, x) memset(a, x, sizeof(a))
    
    const double pi = acos(-1.0);
    const int INF = 0x3f3f3f3f;
    const int MOD = 1e9 + 7;
    const double EPS = 1e-9;
    
    int T, n, x, ca;
    vector<int> ans;
    priority_queue<int, vector<int>, less<int> > que1;
    priority_queue<int, vector<int>, greater<int> > que2;
    int main() {
        scanf("%d", &T);
        while (T--) {
            ans.clear();
            while (que1.size()) que1.pop();
            while (que2.size()) que2.pop();
            scanf("%d%d", &ca, &n);
            for (int i = 1; i <= n; ++i) {
                scanf("%d", &x);
                if (que1.size() < que2.size()) {
                    if (que2.size() && x > que2.top()) {
                        que2.push(x);
                        x = que2.top();
                        que2.pop();
                    }
                    que1.push(x);
                } else if (que1.size() > que2.size()) {
                    if (que1.size() && x < que1.top()) {
                        que1.push(x);
                        x = que1.top();
                        que1.pop();
                    }
                    que2.push(x);
                } else {
                    if (que1.empty() || x < que1.top()) {
                        que1.push(x);
                        ans.pb(que1.top());
                    } else {
                        que2.push(x);
                        ans.pb(que2.top());
                    }
                }
            }
            printf("%d %d
    ", ca, ans.size());
            for (int i = 0; i < ans.size(); ++i) {
                printf("%d", ans[i]);
                putchar(9 == i % 10 ? '
    ' : ' ');
            }
            if (ans.size() % 10) puts("");
        }
        return 0;
    }
  • 相关阅读:
    sabaki and leelazero
    apply current folder view to all folders
    string operation in powershell
    wirte function in powershell
    add environment path to powershell
    Module in powershell
    sql prompt
    vmware中鼠标在部分区域不能使用
    调整多个控件的dock的顺序
    行为型模型 策略模式
  • 原文地址:https://www.cnblogs.com/BIGTOM/p/8452199.html
Copyright © 2011-2022 走看看