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.
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.
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 }