动物园
  • 板块灌水区
  • 楼主lgmulti
  • 当前回复4
  • 已保存回复4
  • 发布时间2020/11/8 17:44
  • 上次更新2023/11/5 08:27:11
查看原帖
动物园
54769
lgmulti楼主2020/11/8 17:44
#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多分?

求大佬查错。

2020/11/8 17:44
加载中...