USACO 2017 January Contest, Gold Problem 1. Balanced Photo

来源:互联网 发布:python绝技 pdf 中文 编辑:程序博客网 时间:2024/05/19 06:35

这里写图片描述

利用树状数组,由于1e9太大,所以先进行排序,按数字大小进行排名。

#include<iostream>#include<algorithm>#include<cstring>#define MA 100005using namespace std;class node {public:    int id;    int w;    int rank;    int LN, RN;};int pre[MA];//树状数组int lowbit(int v){    return v&-v;}void join(int index, int val){    while (index < MA)    {        pre[index] += val;        index += lowbit(index);    }}int GetSum(int index){    int sum = 0;    while (index)    {        sum += pre[index];        index -= lowbit(index);    }    return sum;}node all[MA];int main(){    freopen("bphoto.in", "r", stdin);    freopen("bphoto.out", "w", stdout);    int N;    scanf("%d", &N);    for (int t = 0; t < N; ++t)    {        all[t].id = t;        scanf("%d", &all[t].w);    }    sort(all, all + N, [](const node a, const node b) {return a.w > b.w; });    all[0].rank = 1;    for (int t = 1; t < N; ++t)//按数字大小进行编号        if (all[t].w == all[t - 1].w) all[t].rank = all[t - 1].rank;        else all[t].rank = t+1;    sort(all,all+N, [](const node a, const node b) {return a.id < b.id; });    for (int t = N - 1; t >= 0; --t)//先计算出右边比此位置数字大的元素个数    {        all[t].RN = GetSum(all[t].rank-1);        join(all[t].rank, 1);    }    memset(pre, 0, sizeof(pre));    int cnt = 0;    for (int t = 0; t < N; ++t)//先计算出左边比此位置数字大的元素个数,并进行讨论    {        all[t].LN = GetSum(all[t].rank - 1);        join(all[t].rank, 1);        if (min(all[t].RN, all[t].LN) * 2 < max(all[t].RN, all[t].LN))++cnt;    }    printf("%d\n", cnt);}
0 0