P1627 [CQOI2009]中位数
给出1~n的一个排列,统计该排列有多少个长度为奇数的连续子序列的中位数是b。中位数是指把所有元素从小到大排列后,位于中间的数。
中位数的题目有关统计的话,可以转化成$0,-1,1$这三个数来做,分别表示这个数$=x$,$<x$和$>x$
这个题也就是要求统计$x$左边和右边相同的$s$的对数,$s$表示前缀和之差
基数排序
#include<bits/stdc++.h> using namespace std; int n,x; long long ans,c[2][200005]; int main() { scanf("%d%d",&n,&x); int flg=0; c[0][n]=1; for(int s=n,p,i=1; i<=n; i++) { scanf("%d",&p); if(x==p) flg=1; else s+=p>x?1:-1; c[flg][s]++; } for(int i=0; i<=n*2; i++) ans+=c[0][i]*c[1][i]; // cout<<c[0][i]<<" "<<c[1][i]<<" "; printf("%lld ",ans); return 0; }