有n头牛,每头牛有一个领地范围(s1, e1),如果另一头牛的领地(s2, e2)覆盖住了这头牛则称那头牛比这头牛强壮,stars那题的变形
#include <stdio.h>
#include <string.h>
#include <iostream>
#include <algorithm>
using namespace std;
struct node
{
int s, e, n;
} a[110000];
int c[101000];
bool cmp(const node a, const node b)
{
if(a.e == b.e)
{
return a.s < b.s;
}
return a.e > b.e;
}
int lowbit(int x)
{
// printf("-1\n");
return x & (-x);
}
int sum(int x)
{
int s = 0;
while(x > 0)
{
s += c[x];
x -= lowbit(x);
}
return s;
}
void add(int x, int a)
{
while(x <= 100100)
{
c[x] += a;
x += lowbit(x);
}
}
int main()
{
int d;
while(scanf("%d", &d), d)
{
int ans[100010];
memset(ans, 0, sizeof(ans));
memset(c, 0, sizeof(c));
for(int i = 0; i < d; i++)
{
scanf("%d%d", &a[i].s, &a[i].e);
a[i].n = i;
}
sort(a, a + d, cmp);
add(a[0].s + 1, 1);
ans[a[0].n] = 0;
for(int i = 1; i < d; i++)
{
if(a[i].s == a[i - 1].s && a[i].e == a[i - 1].e)
{
ans[a[i].n] = ans[a[i - 1].n];
}
else
{
ans[a[i].n] = sum(a[i].s + 1);
}
add(a[i].s + 1, 1);
}
for(int i = 0; i < d; i++)
{
printf("%d ", ans[i]);
}
printf("\n");
}
// sort()
}
注意两头牛相等的时候