试了一把树状数组,代码果然很简单。
#include <iostream> #include <string> #include <vector> #include <stack> #include <sstream> #include <utility> using namespace std; vector<int> cnt; vector<int> arr; // effective index: 1..N int lowb(int t) { return t & (-t); } void add(int i, int x) { int size = arr.size(); for (; i < size; i += lowb(i)) { arr[i] += x; } } int sum(int i) { int s = 0; for (; i > 0; i -= lowb(i)) { s += arr[i]; } return s; } int main() { int n = 0; while (scanf("%d",&n) != EOF) { cnt.assign(15010, 0); arr.assign(32010, 0); for (int i = 0; i < n; i++) { int x, y; scanf("%d%d",&x, &y); int tmp = sum(x + 1); cnt[tmp]++; add(x + 1, 1); } for(int i = 0; i < n; i++) { printf("%d ",cnt[i]); } } return 0; }