B

来源:互联网 发布:人工智能信息系统 编辑:程序博客网 时间:2024/04/30 07:53

此题做法同这个题,之前做过,但是真的是惭愧,自己写在博客上的东西真的很少拿出来看了.掌握的也不扎实,理解不透,一般也就记个几天时间.唉。。。

题目链接

还是和以前的做法一样,先记录这个数的左面比他大的数的个数与比它小的数的个数的差,然后再看这个数右面的,比它小的数的个数与比它大的个数的差,记录对应的值,另外不要忘了该数本身(可以看成差为0的),和左面右面各自为0的情况.

#include<bits/stdc++.h>using namespace std;const int maxn=1e4+10;int n,m;int ans[8*maxn];int s[8*maxn];int vis[8*maxn];int main(){while(~scanf("%d %d",&n,&m)){memset(ans,0,sizeof(ans));memset(vis,0,sizeof(vis));int mid;for(int i=1;i<=n;i++){   scanf("%d",&s[i]);   if(s[i]>m)   vis[i]=1;   else if(s[i]<m)   vis[i]=-1;   else{   vis[i]=0;   mid=i;   }}int s=0;int cnt=0;ans[4*maxn]++;//自己本身的情况for(int i=mid-1;i>0;i--){cnt+=vis[i];ans[cnt+4*maxn]++;}s+=ans[4*maxn];//左面就构成中位数的情况cnt=0;for(int i=mid+1;i<=n;i++){cnt-=vis[i];s+=ans[cnt+4*maxn];}printf("%d\n",s);}}


原创粉丝点击