• bzoj 1303: [CQOI2009]中位数图


     1 #include<cstdio>
     2 #include<iostream>
     3 #define M 100005
     4 using namespace std;
     5 int a[M],l[2*M],r[2*M],sum[M],n,m,p,ans;
     6 int main()
     7 {
     8     scanf("%d%d",&n,&m);
     9     for(int i=1;i<=n;i++)
    10       {
    11         scanf("%d",&a[i]);
    12         if(a[i]<m)
    13           a[i]=-1;
    14         if(a[i]==m)
    15           {
    16             a[i]=0;
    17             p=i;
    18           }
    19         if(a[i]>m)
    20           a[i]=1;
    21       }
    22     l[n]=r[n]=1;
    23     for(int i=p-1;i;i--)
    24       {
    25         sum[i]=sum[i+1]+a[i];
    26         l[n+sum[i]]++;
    27       }
    28     for(int i=p+1;i<=n;i++)
    29       {
    30         sum[i]=sum[i-1]+a[i];
    31         r[n+sum[i]]++;
    32       }
    33     for(int i=0;i<=2*n;i++)
    34       ans+=l[i]*r[2*n-i];
    35     printf("%d
    ",ans);
    36     return 0;
    37 }

    分别统计出在中位数左边右边比他大X(比他小X)的数有多少种方案,比他小赋值为-1,比他大赋值为1,用前缀和。最后相应的相乘。

  • 相关阅读:
    07周总结
    06周总结
    05周总结
    04周总结
    03周总结
    02周总结
    python数据特征预处理
    LeetCode Hard: 23. Merge k Sorted Lists
    LeetCode Hard: 4. Median of Two Sorted Arrays
    LeetCode Medium: 49. Group Anagrams
  • 原文地址:https://www.cnblogs.com/xydddd/p/5248894.html
Copyright © 2020-2023  润新知