浙工大race 线性基
Posted goto_1600
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了浙工大race 线性基相关的知识,希望对你有一定的参考价值。
#include<bits/stdc++.h>
using namespace std;
int b[200010][33];
int n,m,q,k;
const int N=200010;
bool st[N];
int p[N];
int cnt;
int h[N],e[N<<1],ne[N<<1],idx,w[N<<1];
int id[N];
int d[N];
unordered_set<int>Set[N];
int find(int x)
return p[x]==x?x:p[x]=find(p[x]);
bool insert(int b[],int x)
for(int i=30;i>=0;i--)
if(!(x>>i&1)) continue;
if(!b[i])
b[i]=x;
return 1;
x^=b[i];
return false;
bool insert2(int b[],int x)
for(int i=30;i>=0;i--)
// if(x==0) return false;
if(!(x>>i&1)) continue;
if(!b[i])
return 1;
x^=b[i];
return false;
void add(int a,int b,int c)
e[idx]=b,ne[idx]=h[a],w[idx]=c,h[a]=idx++;
void dfs(int u,int fa,int vv)
st[u]=1;
d[u]=vv;
id[u]=cnt;
for(int i=h[u];~i;i=ne[i])
int j=e[i];
if(j==fa) continue;
Set[cnt].insert(w[i]);
// cout<<w[i]<<endl;
if(st[j])
// cout<<u<<" "<<" "<<j<<" "<<(vv^d[u]^(1<<w[i]))<<endl;
// cout<<cnt<<" "<<(vv^d[u]^(1<<w[i]))<<endl;
insert(b[cnt],(vv^d[j]^(1<<w[i])));
else dfs(j,u,vv^(1<<w[i]));
int main()
// freopen("data.in","r",stdin);
// freopen("a.out","w",stdout);
memset(h,-1,sizeof h);
cin>>n>>m>>k>>q;
for(int i=1;i<=n;i++) p[i]=i;
while(m--)
int a,b,c;
cin>>a>>b>>c;
c--;
add(a,b,c);
add(b,a,c);
a=find(a);
b=find(b);
if(a!=b) p[a]=b;
for(int i=1;i<=n;i++)
if(!st[i])
++cnt;
dfs(i,-1,0);
int ct=0;
while(q--)
int s,t;
cin>>s>>t;
// cout<<(d[s]^d[t])<<endl;
if(s==t)
puts("Yes");
continue;
if(Set[id[s]].size()!=k)
puts("No");
continue;
if(find(s)!=find(t))
puts("No");
else
int x=(d[s]^d[t]);
// cout<<d[s]<<' '<<d[t]<<" "<<s<<" "<<t<<endl;
// cout<<++ct<<" "<<s<<" "<<t<<x;
// int x2=x;
// for(int i=30;i>=0;i--)
//
// if((x^b[cnt][i])>x) x^=b[cnt][i];
// if((x2^b[cnt][i])<x2) x2^=b[cnt][i];
//
// if(x2==0 || x==(1<<k)-1)
// puts("Yes");
// else
// puts("No");
// continue;
// cout<<insert2(b[id[s]],x)<<" "<<x<<" "<<id[s]<<endl;
if(insert2(b[id[s]],x)==false || insert2(b[id[s]],x^((1ll<<k)-1))==false)
puts("Yes");
else
puts("No");
return 0;
以上是关于浙工大race 线性基的主要内容,如果未能解决你的问题,请参考以下文章
[2017浙工大之江学院决赛 L] qwb与整数对(离线,筛)
[2017浙工大之江学院决赛 E] qwb和李主席(折半枚举,二分)
2015浙工大校赛-Problem C: 三角—— 费马大定理+勾股数