[CF1368E] Ski Accidents(神仙结论构造)
生活随笔
收集整理的這篇文章主要介紹了
[CF1368E] Ski Accidents(神仙结论构造)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
problem
CF1368E Ski Accidents
solution
這個 47n\frac 47n74?n 的限制,提示這存在一個特定構造方案,由 777 我們聯想到 1+2+4=71+2+4=71+2+4=7。
暗示把頂點分為三類 A,B,CA,B,CA,B,C,滿足 ∣C∣≤2∣B∣≤4∣A∣|C|\le 2|B|\le 4|A|∣C∣≤2∣B∣≤4∣A∣。
此時 CCC 組的元素數目一定 ≤47n\le \frac{4}{7}n≤74?n。
- 構造方式:把所有入度為 000 的點都放入 AAA,把至少有一條入邊來自 AAA ,但沒有來自 BBB 的入邊的點放入 BBB。然后,把至少有一條入邊來自 BBB 的入邊的點放入 CCC。剩下的點(所有入邊都來 CCC )放入 AAA。
此時,各類包含的頂點要求為:
- A:A:A: 入度為 000;所有入邊都來自 CCC。
- B:B:B: 至少有一條入邊來自 AAA,但沒有來自 BBB 的入邊。
- C:C:C: 至少有一條入邊來自 BBB。
不難發現,三類形成了一個有效的集合劃分。
且因為每個點的出度都不超過 222,即 AAA 的出邊至多有 2∣A∣2|A|2∣A∣ 條,所以 2∣A∣≥∣B∣2|A|\ge |B|2∣A∣≥∣B∣,2∣B∣≥∣C∣2|B|\ge |C|2∣B∣≥∣C∣ 同理。
此時將 CCC 類點盡數刪除。
由于 A,BA,BA,B 都沒有來自 BBB 的入邊,而 AAA 內部點之間也不存在邊,所以一定不存在長度超過 111 的路徑。
有向無環圖,所以可以在 O(n)O(n)O(n) 的時間內完成求解。
code
#include <bits/stdc++.h> using namespace std; #define maxn 200005 vector < int > G[maxn], ans; int T, n, m; int col[maxn];int main() {scanf( "%d", &T );while( T -- ) {scanf( "%d %d", &n, &m );for( int i = 1;i <= n;i ++ ) G[i].clear(), col[i] = 0;for( int i = 1, u, v;i <= m;i ++ ) {scanf( "%d %d", &u, &v );G[v].push_back( u );}for( int v = 1;v <= n;v ++ )for( int u : G[v] ) {if( col[u] == 1 )col[v] = 2;if( col[v] ^ 2 and col[u] == 0 )col[v] = 1;}ans.clear();for( int i = 1;i <= n;i ++ )if( col[i] == 2 ) ans.push_back( i );printf( "%d\n", ans.size() );for( int i : ans ) printf( "%d ", i );puts("");} return 0; }總結
以上是生活随笔為你收集整理的[CF1368E] Ski Accidents(神仙结论构造)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 如何打开联想笔记本电脑的电源管理
- 下一篇: Function Query(树状数组)