• POJ-2481-Cows


    链接:https://vjudge.net/problem/POJ-2481

    题意:

    有n头牛,每头牛有一个范围,s-e,当一头牛的s大于等于另一头牛和e小于等于另一头牛同时e-s也小于另一头牛

    说明另一头牛比这头牛强壮。

    求这n头牛每头牛有几个比他强壮。

    思路:

    树状数组。

    先按照e从大到小排序,保证后面的牛的e小于等于前面一头牛,

    同时树状数组记录每个s对应的值,根据前面有几个比他小的s来判断比他强壮的牛的个数。

    代码:

    #include <iostream>
    #include <memory.h>
    #include <vector>
    #include <map>
    #include <algorithm>
    #include <cstdio>
    #include <math.h>
    #include <queue>
    #include <string>
    #include <stack>
    #include <iterator>
    #include <stdlib.h>
    #include <time.h>
    #include <assert.h>
    
    using namespace std;
    typedef long long LL;
    
    const int MAXN = 5e5+10;
    int c[MAXN],res[MAXN];
    int n;
    
    struct Node
    {
        int s, e;
        int pos;
        bool operator < (const Node & that)const
        {
            if (this->e != that.e)
                return this->e > that.e;
            return this->s < that.s;
        }
    }node[MAXN];
    
    int Lowbit(int k)
    {
        return k&(-k);
    }
    
    void Add(int x, int v)
    {
        while (x <= MAXN)
        {
            c[x] += v;
            x += Lowbit(x);
        }
    }
    
    int Sum(int x)
    {
        int res = 0;
        while (x > 0)
        {
            res += c[x];
            x -= Lowbit(x);
        }
        return res;
    }
    
    int main()
    {
        while(~scanf("%d", &n) && n)
        {
            memset(c, 0, sizeof(c));
            for (int i = 1;i <= n;i++)
            {
                scanf("%d%d", &node[i].s, &node[i].e);
                node[i].pos = i;
            }
            sort(node+1, node+1+n);
            res[node[1].pos] = 0;
            Add(node[1].s+1, 1);
            for (int i = 2;i <= n;i++)
            {
                if (node[i].e == node[i-1].e && node[i].s == node[i-1].s)
                    res[node[i].pos] = res[node[i-1].pos];
                else
                    res[node[i].pos] = Sum(node[i].s+1);
                Add(node[i].s+1, 1);
            }
            for (int i = 1;i <= n;i++)
                printf("%d ", res[i]);
            printf("
    ");
        }
        return 0;
    }
    

      

  • 相关阅读:
    dp思维
    快速幂+地推
    背包问题找物品
    石子合并问题
    hihocoder 1580 Matrix(北京icpc2017网络赛)
    ACM对拍造数据
    主席树学习小结(POJ 2104)
    莫队算法入门 BZOJ 2038
    hdu 2586
    Kattis
  • 原文地址:https://www.cnblogs.com/YDDDD/p/10688993.html
Copyright © 2020-2023  润新知