hdu 4908 BestCoder Sequence(計數),hdu4908
題目連結:hdu 4908 BestCoder Sequence
題目大意:給定N和M,N為序列的長度,由1~N組成,求有多少連續的子序列以M為中位元,長度為奇數。
解題思路:v[i]記錄的是從1~i這些位置上有多少個數大於M,i-v[i]就是小於M的個數。pos為M在序列中的位置。如果有等式i−j=2∗(v[i]−v[j−1]),i≥pos≥j
那麼i和j既是一組滿足的情況。將等式變形i−2∗v[i]=j−2∗v[j−1].
#include <cstdio>#include <cstring>#include <algorithm>using namespace std;const int maxn = 40000;int N, M, pos, v[maxn+5], c[2][maxn*2+5];void init () { int a; v[0] = 0; for (int i = 1; i <= N; i++) { v[i] = v[i-1]; scanf("%d", &a); if (a > M) v[i]++; if (a == M) pos = i; }}int solve () { memset(c, 0, sizeof(c)); for (int i = 1; i <= pos; i++) { int tmp = i - 2 * v[i-1]; c[0][tmp + maxn]++; } for (int i = pos; i <= N; i++) { int tmp = i - 2 * v[i]; c[1][tmp + maxn]++; } int ans = 0; for (int i = 0; i <= maxn*2; i++) ans += c[0][i] * c[1][i]; return ans;}int main () { while (scanf("%d%d", &N, &M) == 2) { init(); printf("%d\n", solve()); } return 0;}