【AtCoder】ABC 462 D - Accomplice

D - Accomplice
AtCoder is a programming contest site for anyone from beginners to experts. We hold weekly programming contests online.
AtCoder
実行時間制限: 2 sec / メモリ制限: 1024 MiB / Difficulty: 798 / NoviSteps: 1Q / 配点: 400 点
問題概要
とある館で起きた殺人事件の犯人の候補が 人いる。 人 は時刻 に館に入り、時刻 に館を出て、ほかの時刻には出入りしなかった。
犯行について以下のことが分かっている。
- 犯人はちょうど 人いる。
- 犯行はある整数時刻 に開始し、 単位時間かけて行われ、時刻 に完了した。
- 犯人は 人とも犯行開始から犯行完了まで常に館にいた(犯行開始と同時に館に入ったり、犯行完了と同時に館を出たりした可能性もある)。
人の犯人候補の中に犯人が 人ともいると仮定したとき、 人の犯人の組み合わせと犯行開始時刻の組としてありうるものは何通りあるか求めよ。
制約
- 入力される値は全て整数
考察
まず、各時刻 に何人が犯行可能かを考える。
人 が時刻 に犯行可能である条件は、
である。
したがって、人 が犯行可能な時刻の候補となる区間は である。
また、ある時刻 に犯行可能な人の数を とすると、 人の中から犯人を 人選ぶ方法は 通りあるので、求める答えは
となる。
今回は時刻の上限が なので、長さ の配列を用意して、imos法の要領で を求めることができる。
実装例
CPP
1.#include <bits/stdc++.h>2.using namespace std;3. 4.#define rep(i, start, end) for (auto i = (start); (i) < (end); (i)++)5. 6.using ll = long long;7. 8.// ======================================== //9. 10.int main()11.{12. int N, D;13. cin >> N >> D;14. 15. vector<int> time(1001000, 0);16. rep(i, 0, N) {17. int S, T;18. cin >> S >> T;19. 20. if (S <= T - D) {21. time[S]++;22. time[T - D + 1]--;23. }24. }25. 26. ll ans = 0, cnt = 0;27. rep(t, 1, 1001000) {28. cnt += time[t];29. ans += cnt * (cnt - 1) / 2;30. }31. 32. cout << ans << endl;33. 34. return 0;35.}https://atcoder.jp/contests/abc462/submissions/76639243
atcoder.jp
実装時間: 15 分
コメント
AtCoderの世界でも殺人事件って起こるのか...





