給定 n (≤ 15000) 顆星星的坐標 (x, y),已按 y 升序、y 相同按 x 升序輸入。
星星等級 = 左下方(含同列同行)星星數量。輸出每個等級的星星個數。
因輸入已按 y 排序,處理到第 i 顆星星時,所有 y' ≤ y_i 的星星已處理完畢。
只需統計已處理星星中 x' ≤ x_i 的個數 → 樹狀數組維护 x 軸前綴和。
x 坐標範圍 [0, 32000],樹狀數組大小 32002(1-based 索引,x+1)。int level = bit.query(x + 1); // 查詢 ≤ x 的星星數
ans[level]++;
bit.add(x + 1, 1); // 插入當前星星
ans[0] ... ans[n-1]。const int MAXX = 32002;
int bit[MAXX], ans[15005];
int lowbit(int x) { return x & -x; }
void add(int x, int v) { for (; x < MAXX; x += lowbit(x)) bit[x] += v; }
int query(int x) { int r = 0; for (; x; x -= lowbit(x)) r += bit[x]; return r; }
int main() {
int n;
while (scanf("%d", &n) == 1) {
memset(bit, 0, sizeof(bit));
memset(ans, 0, sizeof(ans));
for (int i = 0, x, y; i < n; ++i) {
scanf("%d%d", &x, &y);
int lvl = query(x + 1);
ans[lvl]++;
add(x + 1, 1);
}
for (int i = 0; i < n; ++i) printf("%d\n", ans[i]);
}
return 0;
}
O(n log MAXX) ≈ 15000 * 15,極快。O(MAXX) ≈ 128 KB。x 可能為 0,樹狀數組下標從 1 開始,故用 x+1。n 行,即使某等級為 0 也要輸出 0。query(x-1)。