POJ 2481 Cows

来源:互联网 发布:微信矩阵怎么弄 编辑:程序博客网 时间:2024/05/19 02:06

树状数组,我代码写得很清晰啊,(●ˇ∀ˇ●)

#include <iostream>#include <cstdio>#include <cstring>#include <algorithm>using namespace std;const int MAX = 1e5 + 5;struct NODE{    int s, e, id;    bool operator==(NODE& tmp)    {        return this -> s == tmp.s && this -> e == tmp.e;    }}node[MAX];int cnt[MAX];int n;int arr[MAX];int comp(NODE a, NODE b){    return a.e == b.e ? a.s < b.s : a.e > b.e;}int lowbit(int x){    return x & (-x);}void update(int k, int num){    while (k <= n)    {        cnt[k] += num;        k += lowbit(k);    }}int sum(int k){    int res = 0;    while (k)    {        res += cnt[k];        k -= lowbit(k);    }    return res;}int main(){    while (scanf("%d", &n))    {        if (!n)            break;        memset(arr, 0, sizeof(arr));        memset(cnt, 0, sizeof(arr));        for (int i = 1; i <= n; ++i)        {            scanf("%d%d", &node[i].s, &node[i].e);            node[i].id = i;        }        sort(node + 1, node + 1 + n, comp);        for (int i = 1; i <= n; ++i)        {            if (node[i] == node[i - 1])                arr[node[i].id] = arr[node[i - 1].id];            else                arr[node[i].id] = sum(node[i].s + 1);            //因为s可以等于0,所以才加1的。            update(node[i].s + 1, 1);        }        for (int i = 1; i <= n; ++i)        {            printf(i == n? "%d\n" : "%d ", arr[i]);        }    }    return 0;}


0 0