#include<iostream>
#include<vector>
#include<cstdio>
#include<algorithm>
using namespace std;
int n,m,c,k;
unsigned long long a[1000005];
unsigned long long zipped=0;
pair<int,int> cond[1000005];
bool f(pair<int,int> a,pair<int,int> b){
return a.second<b.second;
}
namespace Union{
int father[1000005];
bool light[1000005];
int find(int x){
int i,j;
if(father[x]==x)
return x;
return father[x]=find(father[x]);
}
bool isConnect(int x,int y){
return find(x)==find(y);
}
void connect(int x,int y){
int i,j;
light[find(y)]=light[find(y)] && light[find(x)];
father[find(x)]=find(y);
}
}
bool idigit(int i,unsigned long long x){
return (x>>i)&1;
}
int main(){
int i,j;
freopen("zoo.in","r",stdin);
freopen("zoo.out","w",stdout);
cin>>n>>m>>c>>k;
for(i=0;i<n;i++){
cin>>a[i];
zipped|=a[i];
}
for(i=0;i<m;i++)
cin>>(cond[i].first)>>(cond[i].second);
sort(cond,cond+m,f); //m log m
for(i=0;i<1000005;i++){
Union::father[i]=i;
Union::light[i]=0;
}
if(idigit((cond[0].first),zipped)==0)
Union::light[cond[0].first]=1;
for(i=1;i<m;i++){
if(idigit((cond[i].first),zipped)==0)
Union::light[cond[i].first]=1;
if(cond[i].second==cond[i-1].second){
if(!Union::isConnect((cond[i].first),(cond[i-1].first)))
Union::connect((cond[i].first),(cond[i-1].first));
}
}
int kk=k;
for(i=0;i<k;i++)
if(Union::light[i])
kk--;
unsigned long long ans=(1<<kk)-n;
cout<<ans<<endl;
fclose(stdin);
fclose(stdout);
return 0;
}
为什么这题才60多分?
求大佬查错。