ABC478 E - lt and le
以下と未満
考え方
「未満」「以下」で区別するのではなく、「なるべく等しくしない」ことを考えてみる。
すると、この問題が言っていることは、ほぼ強連結成分分解そのものである。
よって、$u\to v$ の向きに辺を張った有向グラフを強連結成分分解すればよい。
そして、各番号の頂点が何番の成分に入ったかを整理する。
これで、全て「以下」なら必ず成立し、かつ可能な限り「未満」も成り立つようにしたものができる。
よって、これが条件を満たすかチェックすればよい。
満たすならこれがそのまま答え、満たさないならどうやっても不可能である。
AtCoder library の scc を使った場合、計算量は $O(N+Q)$ である。
入力例1での動作
入力を受け取る。
n: 7
q: 8
queries:
0 1 4
0 2 6
0 3 2
1 3 5
0 4 1
0 4 3
1 5 7
0 6 7
各条件について、$u\to v$ の向きに辺を張る。
1 -> 4
2 -> 6
3 -> 2
3 -> 5
4 -> 1
4 -> 3
5 -> 7
6 -> 7
この有向グラフを強連結成分分解すると、次のように分けられる。
| 成分番号 | 含まれる頂点 |
|---|---|
| $1$ | $1,4$ |
| $2$ | $3$ |
| $3$ | $5$ |
| $4$ | $2$ |
| $5$ | $6$ |
| $6$ | $7$ |
各頂点に、その頂点が入っている成分番号を割り当てる。
A: {1, 4, 2, 1, 3, 5, 6}
未満 の条件は $3\to5$ と $5\to7$ である。
それぞれ $A_3=2<A_5=3$、$A_5=3<A_7=6$ となっているので条件を満たす。
したがって、次のように出力できる。
Yes
1 4 2 1 3 5 6
注意点
特になし。
別解
特になし。