1. 程式人生 > >中位數圖 BZOJ

中位數圖 BZOJ

題目傳送門

思路:這個題我們先預先處理一個sum陣列表示這個數字的左邊有多少個大於m的數字減去小於m的數字的個數,然後我們在預處理一個數組表示,有多少個在數字m的左邊有多少個值為sum[i]的個數,然後就可以在一個O(N)的時間複雜度進行計算了。

#include <algorithm>
#include <cmath>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <list>
#include <map>
#include <queue>
#include <set> #include <stack> #include <string> #include <vector> #define MAXN 200010 #define MAXE 40 #define INF 0x7fffff #define MOD 100003 #define LL long long #define ULL unsigned long long #define pi 3.14159 using namespace std; int arr[MAXN]; int sum[MAXN]; int L[MAXN]; int
main() { std::ios::sync_with_stdio(false); int n, m; cin >> n >> m; int p = 0; memset(sum, 0, sizeof(sum)); memset(L, 0, sizeof(L)); for (int i = 1; i <= n; ++i) { cin >> arr[i]; if (arr[i] > m) { arr[i] = 1; } else
if (arr[i] < m) { arr[i] = -1; } else { p = i; arr[i] = 0; } sum[i] = sum[i - 1] + arr[i]; } for (int i = 0; i <= p - 1; ++i) { L[sum[i] + n]++; } int ans = 0; for (int i = p; i <= n; ++i) { ans += L[sum[i] + n]; } cout << ans << endl; return 0; }