【POJ 2481】 Cows

【题目链接】

             http://poj.org/problem?id=2481

【算法】

            树状数组

            注意特判两头牛的s,e值相同

【代码】

           

#include <algorithm>
#include <bitset>
#include <cctype>
#include <cerrno>
#include <clocale>
#include <cmath>
#include <complex>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <ctime>
#include <deque>
#include <exception>
#include <fstream>
#include <functional>
#include <limits>
#include <list>
#include <map>
#include <iomanip>
#include <ios>
#include <iosfwd>
#include <iostream>
#include <istream>
#include <ostream>
#include <queue>
#include <set>
#include <sstream>
#include <stdexcept>
#include <streambuf>
#include <string>
#include <utility>
#include <vector>
#include <cwchar>
#include <cwctype>
#include <stack>
#include <limits.h>
using namespace std;
const int MAXN = 1e5 + 10;

struct info
{
        int id,s,e;
} a[MAXN];

int i,n;
int ans[MAXN];
 
class BinaryIndexedTree
{
        private :
                int c[MAXN];
        public :
                inline void clear()
                {
                        memset(c,0,sizeof(c));
                }
                inline int lowbit(int x)
                {
                        return x & (-x);
                }
                inline void modify(int pos,int val)
                {
                        int i;
                        for (i = pos; i < MAXN; i += lowbit(i)) c[i] += val;
                }
                inline int query(int pos)
                {
                        int i;
                        int ret = 0;
                        for (i = pos; i; i -= lowbit(i)) ret += c[i];
                        return ret;
                }
                inline int query(int l,int r)
                {
                        return query(r) - query(l-1);
                }
} BIT;

inline bool cmp(info a,info b)
{
        return a.s != b.s ? a.s < b.s : a.e > b.e;
}

int main() 
{
        
        while (scanf("%d",&n) && n)
        {
                BIT.clear();
                for (i = 1; i <= n; i++) 
                {
                        a[i].id = i;
                        scanf("%d%d",&a[i].s,&a[i].e);    
                        a[i].s++;
                        a[i].e++;
                }        
                sort(a+1,a+n+1,cmp);
                memset(ans,0,sizeof(ans));
                for (i = 1; i <= n; i++)
                {
                        if (i == 1) 
                        {
                                ans[a[i].id] = 0;
                                BIT.modify(a[i].e,1);
                        } else
                        {
                                if (a[i].s == a[i-1].s && a[i].e == a[i-1].e)
                                        ans[a[i].id] = ans[a[i-1].id];
                                else ans[a[i].id] = BIT.query(a[i].e,MAXN-1);
                                BIT.modify(a[i].e,1); 
                        }
                }
                for (i = 1; i < n; i++) printf("%d ",ans[i]);
                printf("%d
",ans[n]);
        }
        
        return 0;
    
}
原文地址:https://www.cnblogs.com/evenbao/p/9305513.html