ABC077C
解法
解説では二分探索で解いていたが、頭に尺取り法しか無かったため、尺取り法で解いた。
まず、単調減少である必要があるため、降順にソートする。
次に、が大きい順にとなる組み合わせを求める。
この時、となるの個数を調べるのだが、の全ての場合においてとなるので、の個数をの個数に掛ければ良い。
となる組み合わせや、となるの個数は、大きい順に見ていくことから、一つ前でどこまで見たかを覚えておけば、合計で求めることができる。
計算量は、尺取り法がだが、ソートで要するので、全体でである。]
コード
#include <iostream> #include <vector> #include <algorithm> using namespace std; int main() { int n; cin >> n; vector<int> a(n), b(n), c(n); for (int i = 0; i < n; i++) cin >> a[i]; for (int i = 0; i < n; i++) cin >> b[i]; for (int i = 0; i < n; i++) cin >> c[i]; sort(a.begin(), a.end(), greater<int>()); sort(b.begin(), b.end(), greater<int>()); sort(c.begin(), c.end(), greater<int>()); long long ans = 0; int i = 0, j = 0, k = 0; while (i < n) { while (j < n && a[i] < b[j]) { while (k < n && b[j] < c[k]) k++; ans += 1LL * (n - i) * k; j++; } i++; } cout << ans << endl; }
感想
Bを軸とする発想が浮かばなかったので、二分探索を思いつくことができなかった。
尺取り法を考えていくうちにBを軸とすれば良いことはわかったが、解く時間が長くなってしまったため、考察力を磨く必要がある。
また、最近解いた問題の解法に引きずられる傾向があるので、頭をリセットして取り組めるようになりたいところ。