BZOJ1303_中位数图_KEY
较水,开两个桶即可。
题目可以理解为,将大于B的数看为1,小于B的数看为-1,将以B这个数为中位数的序列左右分为两半,加起来为0.
code:
#include <cstdio> using namespace std; char tc() { static char fl[10000000],*A=fl,*B=fl; return A==B&&(B=(A=fl)+fread(fl,1,10000000,stdin),A==B)?EOF:*A++; } int read() { char c;while(c=tc(),c<'0'||c>'9');int x=c-'0'; while(c=tc(),c>='0'&&c<='9')x=x*10+c-'0'; return x; } int N,B,x,sum,t1[200005],t2[200005],P,num[100005]; int main() { N=read(),B=read(); long long ans=0; for(int i=1;i<=N;i++){ x=read(); if(x>B)num[i]=1; if(x==B)P=i; if(x<B)num[i]=-1; } t1[N]=1,t2[N]=1; for(int i=P-1;i>0;i--){ sum=sum+num[i]; t1[sum+N]++; }sum=0; for(int i=P+1;i<=N;i++){ sum=sum+num[i]; t2[sum+N]++; } for(int i=0;i<2*N;i++)ans+=t1[i]*t2[2*N-i]; printf("%lld",ans); return 0; }