結果
問題 | No.1266 7 Colors |
ユーザー |
![]() |
提出日時 | 2020-10-24 15:23:31 |
言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
結果 |
AC
|
実行時間 | 361 ms / 3,000 ms |
コード長 | 1,845 bytes |
コンパイル時間 | 1,899 ms |
コンパイル使用メモリ | 202,112 KB |
最終ジャッジ日時 | 2025-01-15 15:06:23 |
ジャッジサーバーID (参考情報) |
judge4 / judge3 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 3 |
other | AC * 19 |
ソースコード
#include <bits/stdc++.h>using namespace std;#define rep(i,n) for(int i = 0; i < (n); i++)typedef long long ll;typedef long double ld;typedef pair<int,int> P;struct UnionFind{vector<int> data;int __size;UnionFind(int sz) {data.assign(sz, -1);__size = sz;}bool unite(int x, int y) {x = find(x), y = find(y);if(x == y) return (false);if(data[x] > data[y]) swap(x, y);//親は負でサイズを保存__size--;data[x] += data[y];data[y] = x;return (true);}int find(int k) {if(data[k] < 0) return (k);return (data[k] = find(data[k]));}bool same(int x, int y){return find(x) == find(y);}int size(int k) {return (-data[find(k)]);}int union_count() {return (__size);}};int main() {int n, m, q;cin >> n >> m >> q;vector<string> s(n);vector<vector<int>> g(n);rep(i,n) cin >> s[i];rep(i,m) {int u, v;cin >> u >> v;u--; v--;g[u].emplace_back(v);g[v].emplace_back(u);}UnionFind uf(n * 7);for (int i = 0; i < n; i++) {for (int j = 0; j < 7; j++) {if (s[i][j] == '0') continue;for (auto k : g[i]) if (s[k][j] == '1') uf.unite(i * 7 + j, k * 7 + j);int a = (j + 1) % 7, b = (j - 1 + 7) % 7;if (s[i][a] == '1') uf.unite(i * 7 + j, i * 7 + a);if (s[i][b] == '1') uf.unite(i * 7 + j, i * 7 + b);}}while (q--) {int t, u, x;cin >> t >> u >> x;u--; x--;if (t == 1) {s[u][x] = '1';for (auto v : g[u]) if (s[v][x] == '1') uf.unite(u * 7 + x, v * 7 + x);int a = (x + 1) % 7, b = (x - 1 + 7) % 7;if (s[u][a] == '1') uf.unite(u * 7 + x, u * 7 + a);if (s[u][b] == '1') uf.unite(u * 7 + x, u * 7 + b);} else {cout << uf.size(u * 7) << endl;}}return 0;}