[CQOI2009]中位数图

1、这题一个比较聪明的做法是引入c数组来记录大于b和小于b的差值,从而变成了O(n)的算法。
2、本题的数列是一个“排列”,所以说,b只会出现一次,不用考虑1 1 1之类的情况。
【[CQOI2009]中位数图】3、由于出现负值,所以所得值要加上maxn,我刚开始c数组只开了maxn,所以WA,应该开2*maxn(最大maxn,最小负maxn)。
#include
#include
using namespace std;
const int maxn=100010;
int n,b,temp;
long long ans;
int a[maxn],c[maxn*2];
int main(){
scanf("%d%d",&n,&b);
for(int i=0; i scanf("%d",&a[i]);
if(a[i]==b) temp=i;
}
ans=0;
memset(c,0,sizeof(c));
int x=0,y=0;
for(int i=temp; iif(a[i]>b) x++;
else if(a[i] c[x-y+maxn]++;
}
x=0; y=0;
for(int i=temp; i>=0; i--){
if(a[i]>b) x++;
else if(a[i] ans+=c[y-x+maxn];
}
printf("%lld\n",ans);
return 0;
}

    推荐阅读