hdu 3282 Running Median

题目连接

http://acm.hdu.edu.cn/showproblem.php?pid=3282

Running Median

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 \leq P \leq 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 \leq M \leq 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.

SampleInput

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

SampleOutput

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

动态的求中位数,套个平衡树即可。。

  1 #include<algorithm>
  2 #include<iostream>
  3 #include<cstdlib>
  4 #include<cstring>
  5 #include<cstdio>
  6 #include<vector>
  7 #include<map>
  8 #include<set>
  9 using std::cin;
 10 using std::cout;
 11 using std::endl;
 12 using std::find;
 13 using std::sort;
 14 using std::set;
 15 using std::map;
 16 using std::pair;
 17 using std::vector;
 18 #define sz(c) (int)(c).size()
 19 #define all(c) (c).begin(), (c).end()
 20 #define iter(c) decltype((c).begin())
 21 #define cls(arr,val) memset(arr,val,sizeof(arr))
 22 #define cpresent(c, e) (find(all(c), (e)) != (c).end())
 23 #define rep(i, n) for (int i = 0; i < (int)(n); i++)
 24 #define fork(i, k, n) for (int i = (int)k; i <= (int)n; i++)
 25 #define tr(c, i) for (iter(c) i = (c).begin(); i != (c).end(); ++i)
 26 #define pb(e) push_back(e)
 27 #define mp(a, b) make_pair(a, b)
 28 const int Max_N = 10010;
 29 typedef unsigned long long ull;
 30 struct Node {
 31     int v, s;
 32     Node *ch[2];
 33     inline void setc(int _v, int _s, Node *p) {
 34         v = _v, s = _s;
 35         ch[0] = ch[1] = p;
 36     }
 37     inline void push_up() {
 38         s = ch[0]->s + ch[1]->s + 1;
 39     }
 40 };
 41 struct SBT {
 42     Node stack[Max_N];
 43     Node *root, *null, *tail;
 44     inline void init() {
 45         tail = &stack[0];
 46         null = tail++;
 47         null->setc(0, 0, NULL);
 48         root = null;
 49     }
 50     inline Node *newNode(int v) {
 51         Node *p = tail++;
 52         p->setc(v, 1, null);
 53         return p;
 54     }
 55     inline void rotate(Node *&x, bool d) {
 56         Node *k = x->ch[!d]; x->ch[!d] = k->ch[d]; k->ch[d] = x;
 57         k->s = x->s;
 58         x->push_up();
 59         x = k;
 60     }
 61     inline void Maintain(Node *&x, bool d) {
 62         if (!x->ch[d]->s) return;
 63         if (x->ch[d]->ch[d]->s > x->ch[!d]->s) rotate(x, !d);
 64         else if (x->ch[d]->ch[!d]->s > x->ch[!d]->s) rotate(x->ch[d], d), rotate(x, !d);
 65         else return;
 66         Maintain(x, 0), Maintain(x, 1);
 67     }
 68     inline void insert(Node *&x, int v) {
 69         if (!x->s) { x = newNode(v); return; }
 70         bool d = v > x->v; x->s++;
 71         insert(x->ch[d], v);
 72         x->push_up();
 73         Maintain(x, d);
 74     }
 75     inline int kth(int k) {
 76         int t;
 77         Node *x = root;
 78         for (; x->s;) {
 79             t = x->ch[0]->s;
 80             if (k == t + 1) break;
 81             else if (k <= t) x = x->ch[0];
 82             else k -= t + 1, x = x->ch[1];
 83         }
 84         return x->v;
 85     }
 86     inline void go() {
 87         vector<int> res;
 88         int v, q, n, k = 1;
 89         scanf("%d %d", &q, &n);
 90         printf("%d %d\n", q, (n + 1) >> 1);
 91         fork(i, 1, n) {
 92             scanf("%d", &v);
 93             insert(root, v);
 94             if (i & 1) res.push_back(kth((root->s >> 1) + 1));
 95         }
 96         n = sz(res);
 97         rep(i, n) {
 98             if ((i + 1) % 10) {
 99                 if (i == n - 1) printf("%d\n", res[i]);
100                 else printf("%d ", res[i]);
101             }
102             else  printf("%d\n", res[i]);
103         }
104     }
105 }sbt;
106 int main() {
107 #ifdef LOCAL
108     freopen("in.txt", "r", stdin);
109     freopen("out.txt", "w+", stdout);
110 #endif
111     int t;
112     scanf("%d", &t);
113     while (t--){
114         sbt.init();
115         sbt.go();
116     }
117     return 0;
118 }
View Code

 

posted @ 2015-06-16 18:06  GadyPu  阅读(190)  评论(0编辑  收藏  举报