N 個點(星星),座標 (X,Y),0≤X,Y≤32000。點按 Y 升序輸入,Y 相同時按 X 升序。定義點的「等級」為:左下方(X'≤X 且 Y'≤Y)包含的點數(不含自身)。輸出每個等級 0~N-1 的點個數。
sum(x+1) 得到等級(x 從 0 開始,BIT 索引 +1)。add(x+1, 1)。level_cnt[level]++。level_cnt[0..N-1]。#include <cstdio>
#include <cstring>
const int MAXX = 32001;
int bit[MAXX], level_cnt[15005];
int lowbit(int x) { return x & -x; }
void add(int idx, int val) {
for (; idx < MAXX; idx += lowbit(idx)) bit[idx] += val;
}
int sum(int idx) {
int res = 0;
for (; idx > 0; idx -= lowbit(idx)) res += bit[idx];
return res;
}
int main() {
int n;
while (~scanf("%d", &n)) {
memset(bit, 0, sizeof(bit));
memset(level_cnt, 0, sizeof(level_cnt));
for (int i = 0; i < n; ++i) {
int x, y; scanf("%d%d", &x, &y);
int level = sum(x + 1); // x 0-based -> BIT 1-based
level_cnt[level]++;
add(x + 1, 1);
}
for (int i = 0; i < n; ++i) printf("%d\n", level_cnt[i]);
}
return 0;
}
32002 或 32005。scanf,關閉同步 ios::sync_with_stdio(false)。level_cnt。POJ 2352 是「二維偏序 + 離線處理 + 一維 BIT」的教科書級應用。輸入順序滿足 Y 排序,將二維問題降維為一維前綴和。掌握「排序 + BIT」模板,可解決大量「左下方/左上方/右下方點計數」類問題。關鍵點:座標 0-based 轉 1-based、BIT 尺寸、輸入輸出優化。