#include<bits/stdc++.h> usingnamespace std; #define ll long long constint INF = 0x3f3f3f3f; const ll inf = 0x3f3f3f3f3f3f3f3f; const ll mod = 998244353; constint N = 2e6 + 10; constdouble eps = 1e-5; int T; int n, m, q; vector<int>G[N]; list<int>ls[N]; int par[N], vis[N]; intfind(int x){ return par[x] == x ? x : par[x] = find(par[x]); } voiduni(int x, int y){ x = find(x); y = find(y); if (x == y)return; par[x] = y; ls[y].splice(ls[y].end(), ls[x]); } voidbfs(int s){ if (find(s) != s)return; int n = ls[s].size(); for (int i = 0; i < n; i++) { int u = ls[s].front(); if (vis[u])continue; vis[u] = 1; for (int v : G[u]) { if (vis[v])continue; uni(v, s); } ls[s].pop_front(); } } intmain(){ scanf("%d", &T); while (T--) { scanf("%d%d", &n, &m); for (int i = 0; i < n; i++) { par[i] = i; G[i].clear(); ls[i].clear(); ls[i].push_back(i); vis[i] = 0; } for (int i = 0; i < m; i++) { int u, v; scanf("%d%d", &u, &v); G[u].push_back(v); G[v].push_back(u); } scanf("%d", &q); while (q--) { int x; scanf("%d", &x); bfs(x); } for (int i = 0; i < n; i++)printf("%d%s", find(i), i == n - 1 ? "\n" : " "); } return0; }
D - Points Construction Problem
题意:给定 n,m。无限的二维平面上的整点,初始全是白色,选 n 个点涂成黑色,满足恰有 m 对点相邻,且颜色不同。一点与四周四个点相邻。
#include<bits/stdc++.h> usingnamespace std; #define ll long long constint INF = 0x3f3f3f3f; const ll inf = 0x3f3f3f3f3f3f3f3f; const ll mod = 998244353; constint N = 2e6 + 10; int T; int n, m; intmain(){ scanf("%d", &T); while (T--) { scanf("%d%d", &n, &m); if ((m & 1) || m > 4 * n || m * m < 16 * n)puts("No"); else { puts("Yes"); if (m >= 2 * n + 2) { int x = (4 * n + 2 - m) / 2, y = n - x; for (int i = 1; i <= x; i++)printf("1 %d\n", i); for (int i = 1; i <= y; i++)printf("3 %d\n", i * 2); } else { int x = m / 4, y = m / 2 - x; for (int i = 1; i <= x; i++)printf("%d 1\n", i); for (int i = 2; i <= y; i++)printf("1 %d\n", i); int cnt = n - x - y + 1; int t = 2; while (cnt > 0) { for (int i = 2; i <= y && cnt > 0; i++, cnt--) { printf("%d %d\n", t, i); } t++; } } } } return0; }