POJ-2352-Stars

这题分析一下就可以用树状数组去做,因为已经排过序了,所以我们每次读入的点,前面的点的纵坐标都是小于当前点的纵坐标的,所以我们只要统计,之前所有点x坐标小于当前点的x坐标的的星星数即可。
每次加入一个点,都用对应的x坐标进行加一更新,用来影响后面的点,而在同一个纵坐标的点,如果x坐标大于了后面的比他高,但是x坐标较小的点,实际上也不会影响。实际上很简单,稍微思考一下就出来了。
需要特别注意的是这题会TLE,因为x坐标给了0值,lowbit会一直返回0,i一直加0就会T掉。所以x坐标加1即可,不会有任何的影响。

#include <iostream>
#include <cstdio>

const int maxn=32005;
int level[maxn];
int bit[maxn];
int n;

int lowbit(int x)
{
	return x&(-x);
}

void edit(int x,int y)
{
	//if x=0 -> TLE
	for (int i=x;i<=maxn;i+=lowbit(i)) {
		bit[i]+=y;
	}
}

int sum(int x)
{
	int ans=0;
	for (int i=x;i>0;i-=lowbit(i)) {
		ans+=bit[i];
	}
	return ans;
}

int main()
{
	int x,y;
	scanf("%d",&n);
	for (int i=0;i<n;i++) {
		scanf("%d%d",&x,&y);
		level[sum(x+1)]++;
		edit(x+1,1);
//		for (int i=1;i<=8;i++) {
//			printf("%d ",bit[i]);
//		}
//		printf("
");
	}
	for (int i=0;i<n;i++) {
		printf("%d
",level[i]);
	}
	return 0;
}
/*
5
1 1
5 1
7 1
3 3
0 5
*/
原文地址:https://www.cnblogs.com/xyqxyq/p/12328896.html