中位数图 BZOJ

来源:互联网 发布:仁化县网络问政平台 编辑:程序博客网 时间:2024/06/07 02:20

题目传送门

思路:这个题我们先预先处理一个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.14159using 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;}
原创粉丝点击