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