給出1~n的一個排列,統計該排列有多少個長度爲奇數的連續子序列的中位數是b。中位數是指把全部元素從小到大排列後,位於中間的數。c++
中位數的題目有關統計的話,能夠轉化成$0,-1,1$這三個數來作,分別表示這個數$=x$,$<x$和$>x$spa
這個題也就是要求統計$x$左邊和右邊相同的$s$的對數,$s$表示前綴和之差code
基數排序blog
#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]<<"\n"; printf("%lld\n",ans); return 0; }