zoukankan      html  css  js  c++  java
  • POJ 2481 Cows (线段树)

    Cows


    题意:有N头牛,每仅仅牛有一个值[S,E],假设对于牛i和牛j来说,它们的值满足以下的条件则证明牛i比牛j强壮:Si <=Sjand Ej <= Ei and Ei - Si > Ej - Sj。

    如今已知每一头牛的測验值,要求输出每头牛有几头牛比其强壮。


    思路:将牛依照S从小到大排序。S同样依照E从大到小排序,这就保证了排在后面的牛一定不比前面的牛强壮。

    再依照E值(离散化后)建立一颗线段树(这里最值仅仅有1e5,所以不用离散化也行)。遍历每一头牛,在它之前的。E值大于它的牛的数目即是答案(要注意两者同样的情况)。

    事实上,上面的线段树就是排序好之后的E值序列的中每个数的逆序对数目。

    代码:
    #include<map>
    #include<set>
    #include<queue>
    #include<stack>
    #include<cmath>
    #include<cstdio>
    #include<vector>
    #include<string>
    #include<fstream>
    #include<cstring>
    #include<ctype.h>
    #include<iostream>
    #include<algorithm>
    #define INF (1<<30)
    #define PI acos(-1.0)
    #define mem(a, b) memset(a, b, sizeof(a))
    #define rep(i, n) for (int i = 0; i < n; i++)
    #define debug puts("===============")
    typedef long long ll;
    using namespace std;
    const int maxn = 100100;
    int n;
    struct node {
        int x, y, id;
    }e[maxn];
    bool cmp(node s, node v) {
        if (s.x == v.x) return s.y > v.y;
        return s.x < v.x;
    }
    int x[maxn], index[maxn], dis[maxn];
    int discrete(int x[], int index[], int dis[], int n) {
        int cpy[n];
        for (int i = 0; i < n; i++) {
            x[i] = e[i].y;
            cpy[i] = x[i];
        }
        sort(cpy, cpy + n);
        int tot = unique(cpy, cpy + n) - cpy;
        for (int i = 0; i < n; i++) {
            dis[i] = lower_bound(cpy, cpy + tot, x[i]) - cpy;
            index[dis[i]] = i;
        }
        return tot;
    }
    #define lson l, m, rt << 1
    #define rson m + 1, r, rt << 1 | 1
    int has[maxn];
    int sum[maxn << 2];
    void pushup(int rt) {
        sum[rt] = sum[rt << 1] + sum[rt << 1 | 1];
    }
    void build(int l, int r, int rt) {
        sum[rt] = 0;
        if (l == r) return ;
        int m = (l + r) >> 1;
        build(lson);
        build(rson);
    }
    void add(int pos, int x, int l, int r, int rt) {
        if (l == r) {
            sum[rt] += x;
            return ;
        }
        int m = (l + r) >> 1;
        if (pos <= m) add(pos, x, lson);
        else add(pos, x, rson);
        pushup(rt);
    }
    int query(int L, int R, int l, int r, int rt) {
        if (L <= l && r <= R) return sum[rt];
        int m = (l + r) >> 1;
        int res = 0;
        if (L <= m) res += query(L, R, lson);
        if (R > m) res += query(L, R, rson);
        return res;
    }
    int main () {
        while(~scanf("%d", &n), n) {
            for (int i = 0; i < n; i++) {
                scanf("%d%d", &e[i].x, &e[i].y);
                e[i].id = i;
            }
            sort(e, e + n, cmp);
            int m = discrete(x, index, dis, n);
            //rep(i, n) cout<<e[i].x<<" "<<e[i].y<<"-------->"<<e[i].id<<" "<<dis[i]<<endl;
            int nowx = -1, nowy = -1, ans = 0, cnt = 1;
            build(0, m - 1, 1);
            for (int i = 0; i < n; i++) {
                if (e[i].x == nowx && e[i].y == nowy) {
                    has[e[i].id] = ans;
                } else {
                    ans = query(dis[i], m - 1, 0, m - 1, 1);
                    has[e[i].id] = ans;
                    nowx = e[i].x, nowy = e[i].y;
                }
                add(dis[i], 1, 0, m - 1, 1);
            }
            for (int i = 0; i < n; i++) printf("%d%c", has[i], i == n - 1 ? '
    ' : ' ');
        }
        return 0;
    }
    


  • 相关阅读:
    阿里云弹性计算研发团队如何从0到1自建SRE体系
    开创云端时空智能,千寻位置加速三维实景中国建设
    实时复制真实世界,51World用云上数字孪生变革产业
    阿里云弹性计算性能测试负责人三年实战复盘 | 性能测试没那么简单
    阿里技术实战:一些云上资源调度的经验谈
    阿里云第七代云服务器,引领IaaS市场四大趋势
    最新干货!如何深入集群调度与管理?
    E2E性能再攀高峰、安全再加码,阿里云第七代ECS云服务器正式进入公测阶段
    centos7装linux翻译软件
    MySql 5.7中添加用户,新建数据库,用户授权,删除用户,修改密码
  • 原文地址:https://www.cnblogs.com/gccbuaa/p/6960981.html
Copyright © 2011-2022 走看看