[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; }