【AtCoder】ABC 429 C - Odd One Subsequence
AtCoder/ABC/C問題AtCoder/ABC/300点問題AtCoder/灰DiffAtCoder/NoviSteps/6QAtCoder/数え上げAtCoder/数学/組み合わせAtCoder/データ構造/連想配列(map)競技プログラミング
https://atcoder.jp/contests/abc429/tasks/abc429_c
atcoder.jp
実行時間制限: 2 sec / メモリ制限: 1024 MiB / Difficulty: 201 / NoviSteps: 3Q / 配点: 300 点
問題概要
長さ の整数列 が与えられる。 を満たす整数の組 であって、次の条件を満たすものの個数を求めよ。
- の中にちょうど 種類の値が含まれる。
制約
- 入力はすべて整数
考察
の中に 2 回出現する値 を固定して考える。
事前に に出現する要素の個数を連想配列などで数えておき、値 の出現回数を とする。
ある値 に注目したとき、
- から を 2 個選ぶ選び方は 通り
- の中で 以外の要素を選ぶ選び方は 通り
であるから、この によって得られる条件を満たす整数組 の個数は
となる。ただし、 の場合は を 2 個選ぶことができないので とする。
これを に出現する全ての値 について求めて総和を取ればよいので、求める答えは
となる。
実装例
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.#define repe(i, start, end) for (auto i = (start); (i) <= (end); (i)++)6. 7.using ll = long long;8. 9.// ======================================== //10. 11.int main()12.{13. int N;14. cin >> N;15. map<ll, ll> mp;16. rep(i, 0, N)17. {18. ll A;19. cin >> A;20. mp[A]++;21. }22. 23. ll ans = 0;24. repe(v, 1, N)25. {26. if (mp[v] < 2)27. continue;28. 29. ll pair = mp[v] * (mp[v] - 1) / 2;30. ll other = N - mp[v];31. ans += pair * other;32. }33. 34. cout << ans << endl;35. 36. return 0;37.}https://atcoder.jp/contests/abc429/submissions/70432545
atcoder.jp
実装時間: 20 分
コメント
「3 つの値の組は真ん中固定」という典型かと思ったら、組み合わせで数え上げるタイプの問題だった。
見極めムズイ。





