zoukankan      html  css  js  c++  java
  • 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 }
  • 相关阅读:
    iOS-禁止scrollview垂直方向滚动,只允许水平方向滚动;或只允许垂直方向滚动
    MongoDB安装
    Vue运用
    egg-middleware 中间件
    如何判断扫码的客户端是微信还是支付宝
    node 短信接口的调用
    Mui 长按保存图片
    egg-sequelize --- nodejs
    egg-mongoose --- nodejs
    Mongoose 基本用法
  • 原文地址:https://www.cnblogs.com/lcxer/p/9441531.html
Copyright © 2011-2022 走看看