Description
給出1~n的一個排列,統計該排列有多少個長度為奇數的連續子序列的中位數是b。中位數是指把所有元素從小到大排列后,位于中間的數。
第一行為兩個正整數n和b ,第二行為1~n 的排列。
Output
輸出一個整數,即中位數為b的連續子序列個數。
7 4 5 7 2 4 3 1 6
Sample Output
4
HINT
第三個樣例解釋:{4}, {7,2,4}, {5,7,2,4,3}和{5,7,2,4,3,1,6} N<=100000
題解
這道題蠻好玩的,有點燒腦。
對于小于b的數,將其設置為-1; 對于大于b的數,將其設置為1; 用類似于求前綴和的方法,只要某一段區間和為0,則該段即符合條件(自己思考)
但是這題的范圍是100000 所以我們需要做一點處理,就是將b前后兩段分別處理,統計區間和為x的個數,ans=sigma(l[x] * r[x]) 具體細節看代碼
代碼
#include<cstdio>#include<cstring>#include<algorithm>using namespace std;#define N 100010int a[N],sl[N * 2],sr[N * 2];int n,b,pos;int main(){ scanf("%d%d",&n,&b); for(int i = 1;i <= n;i++) { scanf("%d",&a[i]); if(a[i] == b) pos = i; } memset(sl,0,sizeof(sl)); memset(sr,0,sizeof(sr)); int sum = 0; sl[N] = sr[N] = 1; for(int i = pos - 1;i >= 1;i--) sum += a[i] < b ? 1 : -1,sl[sum + N] ++; sum = 0; for(int i = pos + 1;i <= n;i++) sum += a[i] > b ? 1 : -1,sr[sum + N] ++; int ans = 0; for(int i = N - n;i <= N + n;i++) ans += sl[i] * sr[i];