poj2481 cows——树状数组

Cows

Time Limit: 3000MSMemory Limit: 65536K
Total Submissions: 21386Accepted: 7245

- Description

Farmer John’s cows have discovered that the clover growing along the ridge of the hill (which we can think of as a one-dimensional number line) in his field is particularly good.
Farmer John has N cows (we number the cows from 1 to N). Each of Farmer John’s N cows has a range of clover that she particularly likes (these ranges might overlap). The ranges are defined by a closed interval [S,E].
But some cows are strong and some are weak. Given two cows: cowi and cowj, their favourite clover range is [Si, Ei] and [Sj, Ej]. If Si <= Sj and Ej <= Ei and Ei - Si > Ej - Sj, we say that cowi is stronger than cowj.
For each cow, how many cows are stronger than her? Farmer John needs your help!

  • Input

    The input contains multiple test cases.
    For each test case, the first line is an integer N (1 <= N <= 105), which is the number of cows. Then come N lines, the i-th of which contains two integers: S and E(0 <= S < E <= 105) specifying the start end location respectively of a range preferred by some cow. Locations are given as distance from the start of the ridge.
    The end of the input contains a single 0.

  • Output

    For each test case, output one line containing n space-separated integers, the i-th of which specifying the number of cows that are stronger than cowi.

  • Sample Input

3
1 2
0 3
3 4
0
  • Sample Output
1 0 0
  • Hint

Huge input and output,scanf and printf is recommended.

点x左上角的点强于x

#include <iostream>
#include <map>
#include <iterator>
#include <algorithm>
#include <vector>
#include <queue>
#include <list>
#include <cmath>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <string>
#include <sstream>
#define INF 1e6
const int maxn=100005;
using namespace std;
struct Node{
    int x,y,id;
}a[maxn];
bool cmp(const Node &a,const Node &b){
    return (a.x<b.x)||(a.x==b.x && a.y>b.y);
}
int Tree[maxn];
inline int lowbit(int x){
    return (x&-x);
}
void add(int x,int value){
    for(int i=x;i<=maxn;i+=lowbit(i))
        Tree[i]+=value;
}
int get(int x){
    int sum = 0;
    for(int i=x;i;i-=lowbit(i))
        sum+=Tree[i];
    return sum;
}
int main(){
    int n,aa,bb;
    while(scanf("%d",&n)&&n){
        vector<int>ans(maxn);
        memset(a,0,sizeof a);
        memset(Tree,0,sizeof Tree);
        for(int i=1;i<=n;i++){
            scanf("%d%d",&aa,&bb);
            a[i].x = aa+1;
            a[i].y = bb+1;
            a[i].id = i;
        }
        sort(a,a+n+1,cmp);
        ans[a[1].id]=0;
        add(a[1].y,1);
        int Max=a[1].y;
        for(int i=2;i<=n;i++){
            if((a[i].x==a[i-1].x)&&(a[i].y==a[i-1].y))
                ans[a[i].id]=ans[a[i-1].id];
            else
                ans[a[i].id]=get(Max)-get(a[i].y-1);//统计
            add(a[i].y,1);//插入
            Max=max(Max,a[i].y);//更新Max
        }
        for(int i=1;i<=n;i++)
            printf("%d ",ans[i]);
        printf("\n");
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值