O(nk+mk)会炸吗
查看原帖
O(nk+mk)会炸吗
239832
sipu6174楼主2020/11/9 07:51

没有看到所有qiq_i互不相同,太惨了。

注:部分地方使用了vector

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
const int N=1e6+10;
ull read(){
	ull s=0,f=1;char ch=getchar();
	while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
	while(ch>='0'&&ch<='9'){s=s*10+ch-'0';ch=getchar();}
	return s*f;
}
ull ans=1,a[N];
int n,m,c,k,x[N],y[N];
bitset<65>bi[N];
//bitset<64>req;//required but not bought
bitset<N*100>ci; //require c list
vector<int>req[65];
void trans(int x,ull v){
	int cnt=0;
	while(v){
		if(v&1) bi[x][cnt]=1;
		v>>=1;
		cnt++;
	}
}
int main(){
//	freopen("zoo.in","r",stdin);
//	freopen("zoo.out","w",stdout);
	scanf("%d%d%d%d",&n,&m,&c,&k);
	for(int i=1;i<=n;i++){
		a[i]=read();
		trans(i,a[i]);
	}
	for(int i=1;i<=m;i++){
		scanf("%d%d",&x[i],&y[i]);
		req[x[i]].push_back(y[i]);
		ci[y[i]]=1;
	}
	for(int i=0;i<k;i++)
		for(int j=1;j<=n;j++)
			if(bi[j][i]) {
				for(int k=0;k<req[i].size();k++)
					ci[req[i][k]]=0; //it has been bought
			}
	int FLG=1;
	for(int i=0;i<k;i++){
		int flg=1;
		for(int j=0;j<req[i].size();j++)
			if(ci[req[i][j]]) {FLG=flg=0;break;}
		if(flg) ans*=2;
	}
	if(FLG&&n==0&&k==64) puts("18446744073709551616");
	else cout<<ans-n;	
	return 0;
}
2020/11/9 07:51
加载中...