bzoj[CQOI2009]中位数图

Posted oi-forever

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了bzoj[CQOI2009]中位数图相关的知识,希望对你有一定的参考价值。

又是一道巧妙的题

将大于b的数标为1,将小于b的数标为-1

以b为界限,向两边分别求后缀和与前缀和,用l,r分别统计左右两边每个前缀和的数量

因为前缀和有负数所以整体加个n

于是答案就是l[i]*r[2*n-i]//和为2*n,即减去加上的n,和为0,此时b为中位数

 

因为题目中说要满足长度为奇数,此时若两个和加起来为2*n,个数相加一定为偶数,加上一个b就为奇数了

#include<bits/stdc++.h>
using namespace std;

const int maxn=100005;
int n,b,l[maxn<<1],pos;
int a[maxn],r[maxn<<1];

int main()
{
    scanf("%d%d",&n,&b);
    for(int i=1;i<=n;++i){
        
        scanf("%d",&a[i]);
        if(a[i]==b)pos=i,a[i]=0;
        if(a[i]>b)a[i]=1;
        else if(a[i]<b)a[i]=-1;
    }
    l[n]=r[n]=1;//b本身
        int ans=0,x=0;
    for(int i=pos-1;i>=1;--i){x+=a[i];l[x+n]++;}x=0;
    for(int i=pos+1;i<=n;++i){x+=a[i];r[x+n]++;}
    for(int i=0;i<=2*n;++i)ans+=l[i]*r[2*n-i];
    printf("%d\n",ans);
    return 0;
}

 

以上是关于bzoj[CQOI2009]中位数图的主要内容,如果未能解决你的问题,请参考以下文章

BZOJ1303: [CQOI2009]中位数图

BZOJ 1303: [CQOI2009]中位数图前缀和

bzoj 1303: [CQOI2009]中位数图

[BZOJ1303] [CQOI2009] 中位数图

BZOJ1303 [CQOI2009]中位数图

bzoj千题计划175:bzoj1303: [CQOI2009]中位数图