题目:
poj2481
题意:
区间包含问题,牛2的范围 ⊆ 牛1的范围并且牛2的范围 ≠ 牛1的范围,那么牛1比牛2强
思路:
将牛的范围按e从大到小排序,e相等则按s从小到大排序。然后把牛范围的s值逐个插入树状数组,并计算0~s的和
代码
#include <iostream>
#include <algorithm>
#include <cstring>
using namespace std;
const int MAXN = 1e5 + 10;
#define lowbit(x) ((x) & -(x))
struct node{
int l, r, i;
friend bool operator < (const node &a, const node &b){
return (a.r == b.r) ? a.l < b.l : a.r > b.r;
}
}cow[MAXN];
int tree[MAXN], cnt[MAXN];
int final;
void add(int x, int d){
while (x <= final){
tree[x] += d;
x += lowbit(x);
}
}
int sum(int x){
int sum = 0;
while (x > 0){
sum += tree[x];
x -= lowbit(x);
}
return sum;
}
int main(){
int n, a, b, c, d, ans;
while (~scanf("%d", &n) && n != 0){
final = 0;
for (int i = 0; i < n; i++){
scanf("%d%d", &cow[i].l, &cow[i].r);
cow[i].i = i;
cow[i].l++; //向右偏移 1 位
cow[i].r++; //向右偏移 1 位
final = max(final, cow[i].r);
}
sort(cow, cow+n);
memset(cnt, 0, sizeof(int) * (n + 5));
memset(tree, 0, sizeof(int) * (final + 5));
add(cow[0].l, 1);
for (int i = 1; i < n; i++){
if (cow[i].l == cow[i-1].l && cow[i].r == cow[i-1].r)
cnt[cow[i].i] = cnt[cow[i-1].i];
else
cnt[cow[i].i] = sum(cow[i].l);
add(cow[i].l, 1);
}
for (int i = 0; i < n; i++)
printf("%d ", cnt[i]);
printf("\n");
}
return 0;
}