[CQOI2009]中位数图

[CQOI2009]中位数图

https://ac.nowcoder.com/acm/problem/19913

QAQ,因为放在第三节习题题单里,搞得我以为需要二分!!!
根据题意,中位数是一定在奇数序列里,所以从值b的k位置开始枚举;对于大于b的数1.小于b的数-1;以b位置左部分为求后缀和,后部分为前缀和。左右两部分相加为0的序列满足题意;
对于奇偶判断:因为以k为起点,左边的值如果为-x,右边的值为x,(如果x为1,那么只有一个数,两边一共2个,再加上中位数,就是三个;)写几个例子就理解了;

#include<bits/stdc++.h>
using namespace std;
int a[101000],tong[1000000],big[101000],sum[101000],sum1[101000];
inline int read(){
   int s=0,w=1;
   char ch=getchar();
   while(ch<'0'||ch>'9'){if(ch=='-')w=-1;ch=getchar();}
   while(ch>='0'&&ch<='9') s=s*10+ch-'0',ch=getchar();
   return s*w;
}
int main()
{

    int n,ans=0,b,k,cnt=1;
    n=read(),b=read();
    for(int i=1;i<=n;i++) {
            a[i]=read();
            if(a[i]<b) big[i]=-1;
            if(a[i]==b) big[i]=0,k=i;
            if(a[i]>b) big[i]=1;
    }
    for(int i=k-1;i>=1;i--)
    {
        sum[i]=sum[i+1]+big[i];
        if(sum[i]==0&&(k-i+1)%2) cnt++;
        tong[sum[i]+n]++;//装到桶里,sum【i】可能为负数,所以+n
    }
    for(int i=k+1;i<=n;i++)
    {
        sum1[i]=sum1[i-1]+big[i];
        if(sum1[i]==0&&(i-k+1)%2) cnt++;    
        cnt+=tong[n-sum1[i]];
    }
    cout<<cnt;
}
全部评论

相关推荐

点赞 评论 收藏
分享
巧克力1:双选会不如教室宣讲会
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务