ARC105E Keep Graph Disconnected 题解
正向考虑是很难的,从结果入手,发现最后一定是分别包含
考虑表示出这两个人一共加了多少边:
由于是判断先手还是后手必胜,所以只需看结果对
当
当
当
时空线性。
代码:
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define vi vector < int >
#define eb emplace_back
#define pii pair < int, int >
#define fi first
#define se second
#define TIME 1e3 * clock() / CLOCKS_PER_SEC
int Mbe;
mt19937_64 rng(35);
constexpr int N = 1e5 + 10;
int n, m;
int fa[N], sz[N];
int find(int x) {
if(fa[x] == x) return x;
return fa[x] = find(fa[x]);
}
ll calc(int x) {
return x * 1ll * (x - 1) / 2;
}
void solve() {
cin >> n >> m;
for(int i = 1; i <= n; ++i) {
fa[i] = i;
sz[i] = 0;
}
for(int i = 1; i <= m; ++i) {
int u, v;
cin >> u >> v;
fa[find(u)] = find(v);
}
for(int i = 1; i <= n; ++i) ++sz[find(i)];
ll x = find(1), y = find(n);
if(x == y) {
cout << "Second" << "\n";
return;
}
if(n & 1) {
if(calc(n) % 2 - m % 2) cout << "First" << "\n";
else cout << "Second" << "\n";
return;
}
if(sz[x] % 2 != sz[y] % 2) {
cout << "First" << "\n";
return;
}
if((calc(n) - m - sz[x] % 2) & 1) cout << "First" << "\n";
else cout << "Second" << "\n";
}
int Med;
int main() {
fprintf(stderr, "%.3lf MB\n", (&Mbe - &Med) / 1048576.0);
ios :: sync_with_stdio(0);
cin.tie(0); cout.tie(0);
int T;
cin >> T;
while(T--) solve();
cerr << TIME << "ms\n";
return 0;
}
标签:
题解
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现