全RE求调
查看原帖
全RE求调
599287
_masppy_楼主2023/6/18 14:25
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int maxn=1e5+10;
int n,m,t,c,a,b,ans;
int dct[maxn];
vector<int>q[maxn*20];
int vis[maxn*10],cp[maxn*10],af[maxn],bf[maxn],cf[10000][10000];
bool dfs(int u,int t){
	if(vis[u]==t) return false;
	vis[u]=t;
	int siz=q[u].size();
	for(int i=0;i<siz;i++){
		int v=q[u][i];
		if((!cp[v])||dfs(cp[v],t)){
			cp[v]=u;
			return true;
		}
	}
	return false;
} 
int main(){
	scanf("%d",&t);
	while(t--){
		for(int i=1;i<=3000;i++) q[i].clear();
		memset(vis,0,sizeof(vis));
		memset(cp,0,sizeof(cp));
		scanf("%d%d%d",&a,&b,&m);
		for(int i=1;i<=a;i++) scanf("%d",&af[i]);
		for(int i=1;i<=b;i++) scanf("%d",&bf[i]);
		
		for(int i=1;i<=b;i++){
			if(!(bf[i]&1)) continue;
			for(int j=1;j<=b;j++){
				if(bf[j]&1) continue;
				if(!((__builtin_popcount((bf[i]|bf[j])))&1)) q[bf[i]].push_back(bf[j]); 
			}
		}
		
		for(int i=1;i<=b;i++){
			if(bf[i]&1==0) continue;
			if(dfs(bf[i],i)) ans++;
		}
		ans=b-ans;
		
		for(int i=1;i<=m;i++){
			int x,y;
			scanf("%d%d",&x,&y);
			cf[x][y+a]=cf[y+a][x]=1;
		}
		
		for(int i=1;i<=a;i++){
			memset(vis,0,sizeof(vis));
			int cnt=0,cnt1=0;
			for(int j=1;j<=b;j++){
				if(cf[i][j+a]){
					cnt1++;
					if(bf[j]&1){
						if(dfs(bf[j],j)) cnt++;
					}
				}
			}
			ans=max(ans,cnt1-cnt+1);
		}
		
		for(int i=1;i<=a;i++){
			for(int j=i+1;j<=a;j++){
				if((af[i]^af[j])%2==0) continue;
				memset(vis,0,sizeof(vis));
				int cnt=0,cnt1=0;
				for(int k=1;k<=b;k++){
					if(cf[i][k+a]&&cf[j][k+a]){
						cnt1++;
						if(bf[k]&1){
							if(dfs(bf[k],k)) cnt++;
						}
					}
				}
				ans=max(ans,cnt1-cnt+2);
			}
		}
		printf("%d",ans);
	}
	return 0;
}
2023/6/18 14:25
加载中...