結果
問題 | No.2294 Union Path Query (Easy) |
ユーザー |
![]() |
提出日時 | 2023-05-05 23:00:56 |
言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
結果 |
AC
|
実行時間 | 411 ms / 4,000 ms |
コード長 | 2,362 bytes |
コンパイル時間 | 2,195 ms |
コンパイル使用メモリ | 203,164 KB |
最終ジャッジ日時 | 2025-02-12 19:17:23 |
ジャッジサーバーID (参考情報) |
judge4 / judge2 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 3 |
other | AC * 46 |
ソースコード
#include <bits/stdc++.h>using namespace std;constexpr int mod = 998244353;struct UnionFind {vector<int> par;vector<int> size;vector<int> sum;vector<vector<int>>cnt;vector<vector<int>>cld;UnionFind(int n) {par.resize(n);sum.resize(n);size.resize(n,1);cld.resize(n);cnt.resize(n);for(int i = 0; i < n; i++) {par[i] = i;cld[i].push_back(i);cnt[i].resize(30);}}int find(int x) {if(par[x] == x) {return x;}return par[x] = find(par[x]);}bool same(int x, int y) {return find(x) == find(y);}int consize(int x) {return size[find(x)];}bool unite(int x,int y,int w) {int s = sum[x]^sum[y];x = find(x);y = find(y);if(x == y) {return false;}if(size[x] > size[y]) {swap(x,y);}par[x] = y;size[y] += size[x];for(auto i:cld[x]) {sum[i] ^= s^w;for(int j = 0; j < 30; j++) {if(1 & (sum[i] >> j)) {cnt[y][j]++;}}cld[y].push_back(i);}return true;}};int main() {ios::sync_with_stdio(false);cin.tie(nullptr);int N,X,Q;cin >> N >> X >> Q;UnionFind uf(N);while(Q--) {int f;cin >> f;if(f == 1) {int v,w;cin >> v >> w;uf.unite(v,X,w);}if(f == 2) {int u,v;cin >> u >> v;if(uf.same(u,v)) {int s = uf.sum[u]^uf.sum[v];cout << s << "\n";X = (X+s)%N;}else {cout << -1 << "\n";}}if(f == 3) {int v;cin >> v;int s = uf.consize(v);int ans = 0;for(int i = 0; i < 30; i++) {int c = uf.cnt[uf.find(v)][i];ans += (1ll << i)*(s-c)*c%mod;if(ans >= mod) ans -= mod;}cout << ans << "\n";}if(f == 4) {int v;cin >> v;X = (X+v)%N;}}}