結果
問題 | No.1266 7 Colors |
ユーザー |
![]() |
提出日時 | 2020-10-23 23:08:04 |
言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
結果 |
AC
|
実行時間 | 126 ms / 3,000 ms |
コード長 | 2,028 bytes |
コンパイル時間 | 1,098 ms |
コンパイル使用メモリ | 99,648 KB |
最終ジャッジ日時 | 2025-01-15 13:54:31 |
ジャッジサーバーID (参考情報) |
judge1 / judge5 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 3 |
other | AC * 19 |
ソースコード
#include <iostream>#include <vector>#include <string>#include <algorithm>#include <cstdio>#include <cstring>#include <cmath>using namespace std;using ll = long long;struct UnionFind {UnionFind(int n) : p(n, -1) {}int root(int u) {return p[u] < 0 ? u : p[u] = root(p[u]);}int size(int u) {return -p[root(u)];}bool same(int u, int v) {return root(u) == root(v);}void unite(int u, int v) {u = root(u);v = root(v);if (u == v) return;if (p[u] > p[v]) swap(u, v);p[u] += p[v];p[v] = u;}vector<int> p;};int main() {ios::sync_with_stdio(false);cin.tie(0);int n, m, q;cin >> n >> m >> q;constexpr int C = 7;UnionFind uf(n * C);vector<char[C]> s(n);for (int i = 0; i < n; i++) {char c[C + 1];cin >> c;for (int j = 0; j < C; j++) {s[i][j] = c[j] - '0';}for (int j = 0; j < C; j++) {if (s[i][j] && s[i][(j + 1) % C]) {uf.unite(i * C + j, i * C + (j + 1) % C);}}}vector<vector<int>> e(n);for (int i = 0; i < m; i++) {int u, v;cin >> u >> v;u--; v--;e[u].push_back(v);e[v].push_back(u);for (int j = 0; j < C; j++) {if (s[u][j] && s[v][j]) {uf.unite(u * C + j, v * C + j);}}}while (q--) {int t, x, y;cin >> t >> x >> y;x--; y--;if (t == 1) {s[x][y] = 1;if (int j = (y + 1) % C; s[x][j]) uf.unite(x * C + y, x * C + j);if (int j = (y + C - 1) % C; s[x][j]) uf.unite(x * C + y, x * C + j);for (int v : e[x]) {if (s[v][y]) {uf.unite(x * C + y, v * C + y);}}} else {cout << uf.size(x * C) << '\n';}}return 0;}