POJ - 2352フェンウィックツリー

まず、コンテンツ

  • 各スターを代表する多くの曲座標を考えると、それはそのレベルで星の数を表し、その左と下フェンスで囲まれた領域上の星は、星のそれぞれの数であなたの0-N-1のレベルが属する尋ねます。

第二に、アイデア

  • 座標大に小さい、Y、XにY以下同じフロントに従ってソートyでソートした後、左と下縁が含まれていると題し求めている星の数は、単にxはあなたが持つことができますどのように多くの点の座標フェンウィックツリーのメンテナンスを使用しています。各点がなければならないので、以上の点の高さに等しいです
  • ように被験者によって与えられた座標は、0であってもよいXが+1プロセス座標

第三に、コード

#include <cstdio>
#include <algorithm>
using namespace std;
//c是树状数组 
int n, c[32005], ans[15005]; 

struct N {
	int x, y;
}p[15005];

bool cmp(N a, N b) {
	if (a.y == b.y) return a.x < b.x;
	return a.y < b.y;
}

void update(int x, int v) {
	for (int i = x; i <= 32005; i += i & (-i)) {
		c[i] += v;
	}
} 

int query(int x) {
	int ans = 0;
	for (int i = x; i > 0; i -= i & (-i)) {
		ans += c[i];
	}
	return ans;	
}
int main() {
	scanf("%d", &n);
	for (int i = 1; i <= n; i++) {
		scanf("%d%d", &p[i].x, &p[i].y);
		//由于x坐标可能为0 所以进行++ 树状数组不能维护0这个点 
		p[i].x++;
	}	
	sort(p + 1, p + 1 + n, cmp);
	for (int i = 1; i <= n; i++) {
		ans[query(p[i].x)]++;
		update(p[i].x, 1);
	}
	for (int i = 0; i < n; i++) {
		printf("%d\n", ans[i]);
	}
	return 0;
} 
公開された343元の記事 ウォンの賞賛244 ・は 40000 +を見て

おすすめ

転載: blog.csdn.net/qq_41280600/article/details/101100832
おすすめ