?
# | Author | Problem | Lang | Verdict | Time | Memory | Sent | Judged | |
---|---|---|---|---|---|---|---|---|---|
187520751 |
Practice: DaiRuiChen007 |
1659E - 29 | C++14 (GCC 6-32) | Accepted | 1497 ms | 26436 KB | 2023-01-01 15:27:50 | 2023-01-01 15:27:50 |
// LUOGU_RID: 98453998 #include<bits/stdc++.h> using namespace std; const int MAXN=1e5+1; inline bool bit(int x,int k) { return (x>>k)&1; } struct DSU { int dsu[MAXN]; inline void size(int n) { for(int i=1;i<=n;++i) dsu[i]=i; } inline int find(int x) { if(dsu[x]==x) return x; return dsu[x]=find(dsu[x]); } inline void merge(int u,int v) { dsu[find(u)]=find(v); } inline bool same(int u,int v) { return find(u)==find(v); } } G0[30],G1[30]; bool mark1[30][MAXN]; inline bool void0(int u,int v) { for(int k=0;k<30;++k) if(G0[k].same(u,v)) return true; return false; } inline bool void1(int u,int v) { if(G1[0].same(u,v)) return true; for(int k=1;k<30;++k) if(mark1[k][G1[k].find(u)]) return true; return false; } signed main() { int n,m; scanf("%d%d",&n,&m); for(int k=0;k<30;++k) G0[k].size(n),G1[k].size(n); for(int i=1;i<=m;++i) { int u,v,w; scanf("%d%d%d",&u,&v,&w); for(int k=0;k<30;++k) { if(bit(w,k)) G0[k].merge(u,v); if(k!=0) { if(bit(w,k)&&bit(w,0)) G1[k].merge(u,v); if(!bit(w,0)) mark1[k][u]=mark1[k][v]=true; } else if(!bit(w,0)) G1[k].merge(u,v); } } for(int i=1;i<=n;++i) for(int k=1;k<30;++k) mark1[k][G1[k].find(i)]|=mark1[k][i]; int q; scanf("%d",&q); while(q--) { int u,v; scanf("%d%d",&u,&v); if(void0(u,v)) puts("0"); else if(void1(u,v)) puts("1"); else puts("2"); } return 0; }
?
?
?
?