• 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
    ",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("
    ");
    89             }
    90         }
    91         if(j!=t)printf("
    ");
    92     }
    93 }
  • 相关阅读:
    easy ui 表单ajax和from两种提交数据方法
    easy ui 下拉级联效果 ,下拉框绑定数据select控件
    easy ui 下拉框绑定数据select控件
    easy ui 异步上传文件,跨域
    easy ui 菜单和按钮(Menu and Button)
    HTTP 错误 404.3
    EXTJS4.2 后台管理菜单栏
    HTML 背景图片自适应
    easy ui 表单元素input控件后面加说明(红色)
    EXTJS 4.2 添加滚动条
  • 原文地址:https://www.cnblogs.com/lcxer/p/9441531.html
Copyright © 2020-2023  润新知