您的位置:首页 > 其它

POJ-2481 Cows 树状数组

2018-02-06 15:55 375 查看
参考:http://blog.jobbole.com/96430/

// Cows
// http://poj.org/problem?id=2481 
#include <cstdio>
#include <iostream>
#include <cstring>
#include <algorithm>

using namespace std;

const int maxn = 100000 + 10;
int maxe = -1;
struct Segment {
int s, e, id;
bool operator < (const Segment& r) const {
if (s < r.s) return true;
if (s > r.s) return false;
return e > r.e;
}
};

int N;
int arr[maxn];
Segment seg[maxn];
int ans[maxn];

inline int lowbit(int x) { return x & -x; }

void add(int *arr, int x, int v) {
for (int i = x; i <= maxe; i+=lowbit(i)) {
arr[i] += v;
}
}

int sum(int* arr, int x) {
int s = 0;
for (int i = x; i ; i-=lowbit(i)) {
s += arr[i];
}
return s;
}

int main() {
while (cin >> N) {
if (!N) break;
maxe = -1;
for (int i = 1; i <= N; i++) {
scanf("%d%d", &seg[i].s, &seg[i].e);
seg[i].id = i;
maxe = max(maxe, seg[i].e);
}
memset(arr, 0, (maxe+4)*sizeof(int));
sort(seg+1, seg+1+N);

int lasti = 1;
add(arr, seg[1].e, 1);
ans[seg[1].id] = 0;
for (int i = 2; i <= N; i++) {
if (seg[i].s == seg[lasti].s && seg[i].e == seg[lasti].e) {
ans[seg[i].id] = sum(arr, maxe) - sum(arr, seg[i].e - 1) - 1;
continue;
} else {
if (i-1 > lasti) {
add(arr, seg[lasti].e, i-1-lasti);
}
}
ans[seg[i].id] = sum(arr, maxe) - sum(arr, seg[i].e - 1);
add(arr, seg[i].e, 1);
lasti = i;
}
for (int i = 1; i <= N; i++) {
printf("%d ", ans[i]);
}
printf("\n");
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  树状数组