您的位置:首页 > 编程语言 > Go语言

USACO 2017 January Contest, Gold Problem 1. Balanced Photo

2017-05-02 13:41 906 查看


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

#include<iostream>
#include<algorithm>
#include<cstring>
#define MA 100005
using 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);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: