BZOJ 1303 [CQOI2009]中位数图
题解:
从s向两端维护大于b的数和小于b的数即可
#include<iostream> #include<cstdio> #include<cstring> #include<map> using namespace std; const int maxn=100009; int n,b,s; int a[maxn]; map<int,int>ma; long long ans=0; int main(){ scanf("%d%d",&n,&b); for(int i=1;i<=n;++i){ scanf("%d",&a[i]); if(a[i]==b)s=i; } ma[0]=1; int cnt=0; for(int i=s+1;i<=n;++i){ if(a[i]>b)++cnt; else --cnt; ma[cnt]++; } cnt=0; ans+=ma[0]; for(int i=s-1;i>=1;--i){ if(a[i]>b)++cnt; else --cnt; ans+=ma[-cnt]; } cout<<ans<<endl; return 0; }
致歉:笔者已经意识到这是一篇几乎没有价值的文章,给您的阅读带来不好的体验,并且干扰了您的搜索环境,非常抱歉!