# poj2481 cows——树状数组

## Cows

Time Limit: 3000MS Memory Limit: 65536K
Total Submissions: 21386 Accepted: 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.

#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);
}
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;
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);//统计
Max=max(Max,a[i].y);//更新Max
}
for(int i=1;i<=n;i++)
printf("%d ",ans[i]);
printf("\n");
}
}


• 广告
• 抄袭
• 版权
• 政治
• 色情
• 无意义
• 其他

120