CF1361E James and the Chase 题解
Description
给定一个有 -1
。
单个测试点内有多组数据。
Solution
考虑如何判断一个点是否是好的。
先以一个点
容易发现满足上面的两个条件就一定合法,但是这样做单次是
先不妨假设
然后有一个性质:如果
证明:
如果
如果
所以先找到一个为好点的
然后对于每个好点就一定和
至于找
时间复杂度:
Code
#include <bits/stdc++.h> // #define int int64_t const int kMaxN = 1e5 + 5; int n, m, fl = 1; int cnt[kMaxN], sum[kMaxN], fa[kMaxN]; bool ins[kMaxN], vis[kMaxN]; std::vector<int> G[kMaxN]; int find(int x) { return x == fa[x] ? x : fa[x] = find(fa[x]); } void unionn(int x, int y) { int fx = find(x), fy = find(y); if (fx != fy) fa[fx] = fy; } void dfs1(int u) { vis[u] = ins[u] = 1; for (auto v : G[u]) { if (!vis[v]) { dfs1(v); } else { if (!ins[v]) fl = 0; else ++cnt[u], --cnt[v], sum[u] += v, sum[v] -= v; } } ins[u] = 0; } void dfs2(int u) { ins[u] = 1; for (auto v : G[u]) { if (!ins[v]) { dfs2(v); cnt[u] += cnt[v], sum[u] += sum[v]; } else { } } ins[u] = 0; } void dickdreamer() { std::cin >> n >> m; for (int i = 1; i <= n; ++i) G[i].clear(); for (int i = 1; i <= m; ++i) { int u, v; std::cin >> u >> v; G[u].emplace_back(v); } std::vector<int> vec; for (int i = 1; i <= n; ++i) vec.emplace_back(i); std::shuffle(vec.begin(), vec.end(), std::mt19937(std::chrono::steady_clock::now().time_since_epoch().count())); for (int i = 0; i < std::min(100, (int)vec.size()); ++i) { int x = vec[i]; for (int i = 1; i <= n; ++i) { fa[i] = i; cnt[i] = sum[i] = ins[i] = vis[i] = 0; } fl = 1, dfs1(x); if (!fl) continue; std::fill_n(ins + 1, n, 0); dfs2(x); for (int i = 1; i <= n; ++i) { if (cnt[i] == 1) { unionn(i, sum[i]); } } std::vector<int> idx; for (int i = 1; i <= n; ++i) if (find(i) == find(x)) idx.emplace_back(i); if (idx.size() >= (n + 4) / 5) { for (auto u : idx) std::cout << u << ' '; std::cout << '\n'; } else { std::cout << "-1\n"; } return; } std::cout << "-1\n"; } int32_t main() { #ifdef ORZXKR freopen("in.txt", "r", stdin); freopen("out.txt", "w", stdout); #endif std::ios::sync_with_stdio(0), std::cin.tie(0), std::cout.tie(0); int T = 1; std::cin >> T; while (T--) dickdreamer(); // std::cerr << 1.0 * clock() / CLOCKS_PER_SEC << "s\n"; return 0; }
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步