[CQOI2009]中位数图

1、这题一个比较聪明的做法是引入c数组来记录大于b和小于b的差值,从而变成了O(n)的算法。

2、本题的数列是一个“排列”,所以说,b只会出现一次,不用考虑1 1 1之类的情况。

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;i       if(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;
}

你可能感兴趣的:(NOIp/NOI)