呜呜呜,蒟蒻完全不会构造怎么办
考场上刚了近1h,没搞出来,发现自己这个憨憨把两个空格子没有共同点看成没有共同边
当然我这么菜就算看对也不一定会做就是了,但yssy好做很多
若$m equiv 0(mod 3)$,则我们把$2,5,8,11,cdots,m-1$列全部变为空格子
若$m otequiv 0(mod 3)$,则我们把$1,4,7,10,cdots,(m or m-1)$列全部变为空格子
然后两个相邻的空列要记得连起来
CF1450C2
CF(gym102900B)
[CF1364D]Ehab's Last Corollary
jly答辩的时候,我完全没意识到自己居然做过,还是学弟提醒我我才知道我居然做过
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#include <bits/stdc++.h> #define Mod 998244353 using namespace std; typedef long long ll; inline int read() { int out = 0; bool flag = false; register char cc = getchar(); while (cc < '0' || cc > '9') { if (cc == '-') flag = true; cc = getchar(); } while (cc >= '0' && cc <= '9') { out = (out << 3) + (out << 1) + (cc ^ 48); cc = getchar(); } return flag ? -out : out; } inline void write(int x) { if (x < 0) putchar('-'), x = -x; if (x == 0) putchar('0'); else { int num = 0; char cc[20]; while (x) cc[++num] = x % 10 + 48, x /= 10; while (num) putchar(cc[num--]); } putchar(' '); } ll ksm(ll x, ll y) { ll res = 1; while (y) { if (y & 1) res = res * x % Mod; x = x * x % Mod; y >>= 1; } return res; } int n, m, k, head[400010], to[400010], nxt[400010], cnt = -1; void add(int u, int v) { to[++cnt] = v; nxt[cnt] = head[u]; head[u] = cnt; } int dep[400010], fa[400010], dfn[400010]; vector<int> ans, x, y; void print() { if (ans.size() <= k) { puts("2"); cout << ans.size() << endl; for (auto p : ans) write(p); } else { puts("1"); for (int i = 0; i < (k + 1) / 2; i++) write(ans[i * 2]); } } void dfs(int u, int fae, int opt) { dep[u] = dep[fa[u]] + 1; dfn[dep[u]] = u; if (opt) x.push_back(u); else y.push_back(u); for (int i = head[u]; i != -1; i = nxt[i]) { if ((i ^ 1) == fae) continue; int v = to[i]; if (dep[v]) { for (int j = dep[v]; j <= dep[u]; j++) ans.push_back(dfn[j]); print(); exit(0); } fa[v] = u; dfs(v, i, opt ^ 1); } } int main() { n = read(), m = read(), k = read(); memset(head, -1, sizeof(head)); for (int i = 1; i <= m; i++) { int u = read(), v = read(); add(u, v); add(v, u); } dfs(1, -1, 0); if (x.size() >= (k + 1) / 2) { puts("1"); for (int i = 0; i < (k + 1) / 2; i++) write(x[i]); } else { puts("1"); for (int i = 0; i < (k + 1) / 2; i++) write(y[i]); } return 0; }
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#include <bits/stdc++.h> using namespace std; const int N = 1e5 + 10, M = 2e5 + 10; int n, m, a, b, c, A = 1, B = 2, C = 3; int head[N], to[M << 1], nxt[M << 1], cnt; void add_edge(int u, int v) { to[++cnt] = v, nxt[cnt] = head[u], head[u] = cnt; } vector<int> son[N]; bool vis[N]; int fa[N]; void dfs(int u) { vis[u] = true; for (int i = head[u]; i; i = nxt[i]) { int v = to[i]; if (vis[v]) continue; dfs(v), son[u].push_back(v), fa[v] = u; } } int sze[N], g, ans[N]; void find(int u) { bool flag = true; sze[u] = 1; for (int i = son[u].size() - 1; i >= 0; i--) { int v = son[u][i]; find(v), sze[u] += sze[v]; if (sze[v] > (n / 2)) flag = false; } if (n - sze[u] > (n / 2)) flag = false; if (flag) g = u; } int t[N]; void sign(int u, int p) { t[u] = p; for (int i = son[u].size() - 1; i >= 0; i--) { int v = son[u][i]; sign(v, p); } } bool pd(int u) { for (int i = head[u]; i; i = nxt[i]) { if (!t[to[i]]) return true; } for (int i = son[u].size() - 1; i >= 0; i--) { int v = son[u][i]; if (pd(v)) return true; } return false; } void go(int u, int p, int q) { if (ans[u] || t[u] != q) return ; if (p == A) ans[u] = (a > 0 ? A : -1), a--; if (p == B) ans[u] = (b > 0 ? B : -1), b--; for (int i = head[u]; i; i = nxt[i]) { int v = to[i]; go(v, p, q); } } int main() { scanf("%d%d", &n, &m); scanf("%d%d%d", &a, &b, &c); if (a > b) swap(a, b), swap(A, B); if (a > c) swap(a, c), swap(A, C); if (b > c) swap(b, c), swap(B, C); for (int i = 1; i <= m; i++) { int u, v; scanf("%d%d", &u, &v); u++, v++; add_edge(u, v), add_edge(v, u); } dfs(1), find(1); for (int i = son[g].size() - 1; i >= 0; i--) { int v = son[g][i]; if (sze[v] >= a) { sign(v, 1), go(v, A, 1), go(g, B, 0); for (int j = 1; j <= n; j++) { if (ans[j] > 0) printf("%d ", ans[j]); else printf("%d ", C); } return 0; } } int s = n - sze[g]; //cout << s << endl; sign(g, 1); for (int i = son[g].size() - 1; i >= 0 && s < a; i--) { int v = son[g][i]; //cout << sze[v] << " "; if (!pd(v)) continue; sign(v, 0), s += sze[v]; } if (s < a) { //cout << s << " " << a << endl; for (int i = 1; i <= n; i++) printf("0 "); putchar(' '); return 0; } go(fa[g], A, 0), go(g, B, 1); for (int i = 1; i <= n; i++) { if (ans[i] > 0) printf("%d ", ans[i]); else printf("%d ", C); } return 0; }
CF(gym101221A)
CF1470D
移球游戏