POJ-2481 Cows 树状数组

参考: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;
}

猜你喜欢

转载自blog.csdn.net/cyz14/article/details/79271492
今日推荐