https://vijos.org/p/1066
读入数据按x排序,然后按照y构造树状数组,因为排序后xi<xi+1, 所以第i个战壕的保护个数一定是[1..yi]的和
#include<cstdio>
#include<cstring>
#include<algorithm>
#define ms(i,j) memset(i, j, sizeof(i));
using namespace std;
const int maxn = 15000 + 10;
const int maxm = 32000 + 10;
int n;
int ans[maxn];
struct pos
{
int x;
int y;
}p[maxn];
bool cmp(const pos& a, const pos& b)
{
if (a.x==b.x) return a.y < b.y;
return a.x < b.x;
}
int sum[maxm];
int lowbit(int x)
{
return x&(-x);
}
void add(int x, int num)
{
while (x <= maxm)
{
sum[x] += num;
x += lowbit(x);
}
}
int sub(int x)
{
int ret = 0;
while (x > 0)
{
ret += sum[x];
x -= lowbit(x);
}
return ret;
}
int main ()
{
ms(sum,0);ms(ans,0);
scanf("%d", &n);
for (int i=0;i<n;i++)
{
scanf("%d%d", &p[i].x, &p[i].y);
}
sort(p, p+n, cmp);
for (int i=0;i<n;i++)
{
int a = sub(p[i].y);
ans[a]++;
add(p[i].y, 1);
}
for (int i=0;i<n;i++) printf("%d\n", ans[i]);
return 0;
}