【AtCoder】ABC 482 C - Band Count

C - Band Count
AtCoder is a programming contest site for anyone from beginners to experts. We hold weekly programming contests online.
AtCoder
実行時間制限: 2 sec / メモリ制限: 1024 MiB / Difficulty: 486 / NoviSteps: 2Q / 配点: 300 点
問題概要
のグリッドがあり、上から 行目、左から 列目のマスを とする。
グリッドには 個の駒が置かれており、 番目の駒は にある。
個のクエリに答えよ。 クエリは以下の 種類ある。
1 u d: 行目から 行目までに置かれている駒の個数を出力する。2 l r: 列目から 列目までに置かれている駒の個数を出力する。
制約
- ならば
- 入力される値は全て整数
考察
2種類のクエリは互いの答えに影響しないので、行と列を独立に考えることができる。
行方向について、駒が置かれている行番号を昇順にソートした配列 を用意する。
すると、クエリ1では
の要素の中で、 以上 以下の要素の個数
を求めればよい。
これは 以下の要素数から 未満の要素数を引くことに相当し、lower_bound と upper_bound を使って二分探索で求めることができる。
列方向も同様に処理できるので、全体としては の計算量で解くことができる。
実装例
CPP
1.#include <bits/stdc++.h>2.using namespace std;3. 4.#define all(x) (x).begin(), (x).end()5.#define rep(i, start, end) for (auto i = (start); (i) < (end); (i)++)6. 7.// ======================================== //8. 9.int main()10.{11. int H, W, N, Q;12. cin >> H >> W >> N >> Q;13. vector<int> R(N), C(N);14. rep(i, 0, N) cin >> R[i] >> C[i];15. 16. sort(all(R));17. sort(all(C));18. 19. while (Q--) {20. int t;21. cin >> t;22. 23. if (t == 1) {24. int u, d;25. cin >> u >> d;26. 27. int a = lower_bound(all(R), u) - R.begin();28. int b = upper_bound(all(R), d) - R.begin();29. 30. cout << b - a << endl;31. }32. else if (t == 2) {33. int l, r;34. cin >> l >> r;35. 36. int a = lower_bound(all(C), l) - C.begin();37. int b = upper_bound(all(C), r) - C.begin();38. 39. cout << b - a << endl;40. }41. }42. 43. return 0;44.}https://atcoder.jp/contests/abc482/submissions/80504209
atcoder.jp
実装時間: 5 分
コメント
の値が大きいので、累積和配列を作ることはできないことに注意。





