考察で迷走したあげく、ギャグ問であったことを知ったときの衝撃たるや・・・
問題
https://codeforces.com/contest/1375/problem/C
問題概要
長さnの順列が与えられる。あなたは順列中のとなるようなiについて、とのいずれかを除去することができる。
上記の操作を繰り返すことで、順列の長さを1にできるかどうか答えよ。
考察
最初、1より右とnより左は任意の一つが残せるとか、1とnの位置関係とかあまり実のないことを延々考えてしまいました。
落ち着いて、端から順に操作していくことを考えてみます。
のとき、いずれかを消すことができます。あとの処理を考えて、小さい方を残したほうが明らかに得なので、を消してを残します。
のとき、消すことができません。ここでさらに先に進んで、となるjが現れたときのことを考えます。
これは実はのみを残して他をすべて消すことが可能です。が成り立ち、jの左に現れている数はすべてより小さいからです。
このような操作を繰り返していくと、より大きな数の右により小さな数があるときはそれが残ってしまうことがわかります。
結局、ならば長さを1にできるし、ならば少なくとも両端は残るため長さを1にできないということになります。
なお、はいかなる操作によってもより大きな数に変換することができません。それができるのはの右により大きな数があるときのみですが、そもそもは一番右にあるからです。
#include <bits/stdc++.h> using namespace std; int main() { int t; cin >> t; while (t--) { int n; cin >> n; int a, b; cin >> a; for (int i = 1; i < n; i++) cin >> b; cout << (a < b ? "YES" : "NO") << endl; } }