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板子
代码:
#include<stdio.h>
#include<string.h>
int t,n,m,rt,now,v[10001],size[10001],ch[10001][2],f[10001];
void update(int x)
{
size[x]=size[ch[x][0]]+size[ch[x][1]]+1;
}
void move(int x,int &k)
{
int cnt=(ch[f[x]][1]==x),fa=f[x],faa=f[fa];
if(fa==k)k=x;
else if(faa)ch[faa][ch[faa][1]==fa]=x;
ch[fa][cnt]=ch[x][cnt^1];
f[ch[x][cnt^1]]=fa;
ch[x][cnt^1]=fa;
f[fa]=x;
f[x]=faa;
update(fa),update(x);
}
void splay(int x,int &k)
{
while(x!=k)
{
int y=f[x],z=f[y];
if(y!=k)
{
if((ch[y][0]==x)^(ch[z][0]==y))move(y,k);
else move(x,k);
}
move(x,k);
}
}
void ins(int x)
{
if(rt==0){v[++now]=x,size[now]=1,rt=now;return ;}
int root=rt;v[++now]=x;
while(1)
{
if(v[root]<x)
{
if(!ch[root][1])
{
ch[root][1]=now;
f[now]=root;
size[now]=1;
update(root);
break;
}
root=ch[root][1];
}
else
{
if(!ch[root][0])
{
ch[root][0]=now;
f[now]=root;
size[now]=1;
update(root);
break;
}
root=ch[root][0];
}
}
splay(now,rt);
}
int find(int x,int k)
{
if(x<=size[ch[k][0]])return find(x,ch[k][0]);
if(x==size[ch[k][0]]+1)return v[k];
return find(x-size[ch[k][0]]-1,ch[k][1]);
}
int main()
{
scanf("%d",&t);
for(int j=1;j<=t;j++)
{
now=0,rt=0;int sum=0;
memset(ch,0,sizeof(ch));
scanf("%d%d",&n,&m);
printf("%d %d\n",j,m/2+1);
for(int i=1,x;i<=m;i++)
{
scanf("%d",&x),ins(x);
if(i&1)
{
if(sum==0)printf("%d",find(i/2+1,rt)),sum++;
else printf(" %d",find(i/2+1,rt)),sum++;
if(sum==10)sum=0,printf("\n");
}
}
if(j!=t)printf("\n");
}
}
祝大家早日AC!!!