Poj3784 Running Median

Description

动态维护中位数问题:依次读入一个整数序列,每当已经读入的整数个数为奇数时,输出已读入的整数构成的序列的中位数。

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

此题剧毒,格式坑死人!!!

 

10个输出一行!!10个输出一行!!10个输出一行!!!

其实我写这个就是来装逼的,网上还没有写splay的,我来填补这个空缺

此题spaly都是基本操作,就不用我讲了(不会自学,我不提供讲解):板子:splay板子

代码:

 1 #include<stdio.h>
 2 #include<string.h>
 3 int t,n,m,rt,now,v[10001],size[10001],ch[10001][2],f[10001];
 4 void update(int x)
 5 {
 6     size[x]=size[ch[x][0]]+size[ch[x][1]]+1;
 7 }
 8 void move(int x,int &k)
 9 {
10     int cnt=(ch[f[x]][1]==x),fa=f[x],faa=f[fa];
11     if(fa==k)k=x;
12     else if(faa)ch[faa][ch[faa][1]==fa]=x;
13     ch[fa][cnt]=ch[x][cnt^1];
14     f[ch[x][cnt^1]]=fa;
15     ch[x][cnt^1]=fa;
16     f[fa]=x;
17     f[x]=faa;
18     update(fa),update(x);
19 }
20 void splay(int x,int &k)
21 {
22     while(x!=k)
23     {
24         int y=f[x],z=f[y];
25         if(y!=k)
26         {
27             if((ch[y][0]==x)^(ch[z][0]==y))move(y,k);
28             else move(x,k);
29         }
30         move(x,k);
31     }
32 }
33 void ins(int x)
34 {
35     if(rt==0){v[++now]=x,size[now]=1,rt=now;return ;}
36     int root=rt;v[++now]=x;
37     while(1)
38     {
39         if(v[root]<x)
40         {
41             if(!ch[root][1])
42             {
43                 ch[root][1]=now;
44                 f[now]=root;
45                 size[now]=1;
46                 update(root);
47                 break;
48             }
49             root=ch[root][1];
50         }
51         else
52         {
53             if(!ch[root][0])
54             {
55                 ch[root][0]=now;
56                 f[now]=root;
57                 size[now]=1;
58                 update(root);
59                 break;
60             }
61             root=ch[root][0];
62         }
63     }
64     splay(now,rt);
65 }
66 int find(int x,int k)
67 {
68     if(x<=size[ch[k][0]])return find(x,ch[k][0]);
69     if(x==size[ch[k][0]]+1)return v[k];
70     return find(x-size[ch[k][0]]-1,ch[k][1]);
71 } 
72 int main()
73 {
74     scanf("%d",&t);
75     for(int j=1;j<=t;j++)
76     {
77         now=0,rt=0;int sum=0;
78         memset(ch,0,sizeof(ch));
79         scanf("%d%d",&n,&m);
80         printf("%d %d\n",j,m/2+1);
81         for(int i=1,x;i<=m;i++)
82         {
83             scanf("%d",&x),ins(x);
84             if(i&1)
85             {
86                 if(sum==0)printf("%d",find(i/2+1,rt)),sum++;
87                 else printf(" %d",find(i/2+1,rt)),sum++;
88                 if(sum==10)sum=0,printf("\n");
89             }
90         }
91         if(j!=t)printf("\n");
92     }
93 }

 

posted @ 2018-08-08 11:04  蒟蒻--lichenxi  阅读(226)  评论(0编辑  收藏  举报