POJ 2352 - Stars

解法

点の座標が(y座標, x座標)の辞書順で昇順になるよう与えられます. ですので各クエリ(p_x, p_y)について, 今までに与えられた頂点の中から, x座標がp_x以下である頂点の個数がその星のレベルとなります. そのような頂点の個数はFenwick treeを使えば時間内に求めることができます.

ソースコード

#include <cstdio>
#include <vector>
using namespace std;

const int MAX_X = 32000;

// 0-indexedのFenwick tree.
// [0, n)を管理する.
// 実装は蟻本と同じだが, 添字を++して0-indexedに見せかけてる.
template <class T>
struct FenwickTree {
    int n;
    vector<int> elt;

    FenwickTree(int size) {
        n = size;
        elt.resize(size + 1, 0);
    }

    void add(int i, T x) {
        i++;
        while (i <= n) {
            elt[i] += x;
            i += i & -i;
        }
    }

    T sum(int i) {
        i++;

        T res = 0;
        while (i > 0) {
            res += elt[i];
            i -= i & -i;
        }
        return res;
    }
};

int main() {
    int n;
    scanf("%d", &n);

    vector<int> counter(n);

    FenwickTree<int> ft(MAX_X + 1);
    for (int i = 0; i < n; i++) {
        int x, y;
        scanf("%d%d", &x, &y);

        counter[ft.sum(x)]++;
        ft.add(x, 1);
    }

    for (int i = 0; i < n; i++) {
        printf("%d\n", counter[i]);
    }

    return 0;
}

感想

セグツリー問題集の2問目(1問目はなんかやったことあった)です. これはやるだけ.