题意: 给出每个牛的吃草的范围,求比他优秀的牛有多少 si <= sj && ej <= si && ei-si > ej-sj
先对ei 降序排序
在对si 进行树状数组 就行
#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
using namespace std;
const int maxn = 1e5+9;
int c[maxn], f[maxn], n;
struct node
{
int x, y;
int ix;
}a[maxn];
bool cmp(node a, node b)
{
if(a.y == b.y) return a.x < b.x;
return a.y > b.y;
}
int lowbit(int x)
{
return x&-x;
}
void add(int x, int d)
{
while(x < maxn)
{
c[x] += d;
x += lowbit(x);
}
}
int sum(int x)
{
int ret = 0;
while(x > 0)
{
ret += c[x];
x -= lowbit(x);
}
return ret;
}
int main()
{
while(scanf("%d", &n) != EOF && n)
{
for(int i = 1; i <= n; i++)
{
int u, v;
scanf("%d%d", &u, &v);
a[i].x = u+1, a[i].y = v+1, a[i].ix = i;
}
sort(a+1, a+n+1, cmp);
memset(c, 0, sizeof(c));
for(int i = 1; i <= n; i++)
{
if(i != 1 && a[i].y == a[i-1].y && a[i].x == a[i-1].x)
{
f[a[i].ix] = f[a[i-1].ix];
}
else
{
f[a[i].ix] = sum(a[i].x);
}
add(a[i].x, 1);
}
for(int i = 1; i < n; i++)
printf("%d ", f[i]);
printf("%d\n", f[n]);
}
return 0;
}
poj Cows 树状数组
最新推荐文章于 2019-06-27 19:35:00 发布