結果
問題 |
No.1266 7 Colors
|
ユーザー |
|
提出日時 | 2025-09-11 00:14:54 |
言語 | C++23 (gcc 13.3.0 + boost 1.87.0) |
結果 |
WA
|
実行時間 | - |
コード長 | 1,772 bytes |
コンパイル時間 | 4,123 ms |
コンパイル使用メモリ | 287,500 KB |
実行使用メモリ | 30,032 KB |
最終ジャッジ日時 | 2025-09-11 00:15:07 |
合計ジャッジ時間 | 11,846 ms |
ジャッジサーバーID (参考情報) |
judge2 / judge |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 3 |
other | AC * 5 WA * 14 |
ソースコード
#include <bits/stdc++.h> using namespace std; #define rep(i,n) for (int i = 0; i< (n); ++i) #define repi(i, a, b) for (int i = (a); i < (b); ++i) #define all(x) (x).begin(), (x).end() #define fore(i, a) for(auto &i:a) using ll = long long; struct UnionFind { vector<ll> ran; vector<ll> parent; vector<ll> siz; UnionFind(int n):ran(n, 0), parent(n), siz(n, 1){ rep(i, n)parent[i] = i; } ll find(int x) { if(x == parent[x]) return x; return parent[x] = find(parent[x]); } bool issame(int x, int y) { return find(x) == find(y); } void unite(int x, int y) { x = find(x); y = find(y); if(x == y) return; if(ran[x] < ran[y]) swap(x, y); parent[y] = x; if(ran[x] == ran[y]) ran[x]++; siz[x] += siz[y]; return; } int size(int x) { return siz[find(x)]; } }; int main() { int n, m, q; cin >> n >> m >> q; vector<string> s(n); rep(i, n) cin >> s[i]; int N = 7*n; UnionFind uf(N); vector<vector<ll>> G(n); rep(i, m){ int u, v; cin >> u >> v; u--;v--; G[u].push_back(v); G[v].push_back(u); rep(i, 7){ if(s[u][i] == '1' && s[v][i] == '1')uf.unite(i*n+u, i*n+v); } } rep(j, n){ rep(i, 7){ if(s[j][i] == '1' && s[j][(i+1)%7] == '1'){ uf.unite(i*n+j, (i+1)%7*n+j); } } } vector<tuple<int,int,int>> qs(q); rep(i, q){ int t, x, y; cin >> t >> x >> y; qs[i] = {t, --x, --y}; } rep(i, q){ auto[t, x, y] = qs[i]; if(t == 1){ s[x][y] = '1'; if(s[x][(y+1)%7] == '1')uf.unite(y*n+x, (y+1)%7*n+x); if(s[x][(y-1)%7] == '1')uf.unite(y*n+x, (y+6)%7*n+x); fore(to, G[x]){ if(s[to][y] == '1')uf.unite(y*n+x, y*n+to); } } else{ cout << uf.size(x) << endl; } } }