比赛 2025.2.25 评测结果 WWWWWTWWWWWTTEEETTETETTTT
题目名称 填数游戏 最终得分 0
用户昵称 郑霁桓 运行时间 34.869 s
代码语言 C++ 内存使用 4.30 MiB
提交时间 2025-02-25 11:57:48
显示代码纯文本
#include<bits/stdc++.h>
using namespace std;
int T,n,m,s[1000006][3],t[1000006][3],p[1000006],p1,p2;
vector<pair<int,int> >v[2005];
vector<int>e[2005];
int dfs(long long x,long long ss){
	if(x>n) return 0;
	int tp=1,pt=1,sp=-1,pp=-1;
	p[0]=1;
	if(p[t[x][1]]) tp=0;
	if(p[t[x][2]]) pt=0;
	for(int i=0;i<v[t[x][1]].size();i++){
		if(p[v[t[x][1]][i].first]&&v[t[x][1]][i].second>x) tp=0;
	}
	if(t[x][2]){
		for(int i=0;i<v[t[x][2]].size();i++){
	     if(p[v[t[x][2]][i].first]&&v[t[x][1]][i].second>x) pt=0;
		}
	}else pt=0;
	if(tp&&pt){
		p[t[x][1]]=1,sp=dfs(x+1,ss),p[t[x][1]]=0;
		if(sp==-1&&(s[x][2]==t[x][1]||s[x][1]==t[x][1])) ss++;
		p[t[x][2]]=1,pp=dfs(x+1,ss),p[t[x][2]]=0;
		if(pp==-1&&(s[x][2]==t[x][2]||s[x][1]==t[x][2])) ss++;
		if(sp==-1&&pp==-1) return -1;
		sp=max(sp,pp);
		return ss+sp;
	}
	if(tp&&!pt){
		if(s[x][1]==t[x][1]||s[x][2]==t[x][1]) ss++;
		p[t[x][1]]=1,sp=max(sp,dfs(x+1,ss)),p[t[x][1]]=0;
		if(sp==-1) return -1;
		return ss+sp;
	}
	if(!tp&&pt){
		if(s[x][1]==t[x][2]||s[x][2]==t[x][2]) ss++;
		p[t[x][2]]=1,sp=max(sp,dfs(x+1,ss)),p[t[x][2]]=0;
		if(sp==-1) return -1;
		return ss+sp;
	}
	return -1;
}
int main(){
    freopen("game.in","r",stdin);
    freopen("game.out","w",stdout);
    cin>>T;
    while(T--){
    	cin>>n>>m;
    	for(int i=1;i<=n;i++){
    		cin>>s[i][0];
    		for(int j=1;j<=s[i][0];j++) cin>>s[i][j];
		}
		for(int i=1;i<=n;i++){
    		cin>>t[i][0];
    		for(int j=1;j<=t[i][0];j++) cin>>t[i][j];
    		v[t[i][1]].push_back({t[i][2],i});
			v[t[i][2]].push_back({t[i][1],i});
		}
		cout<<dfs(1,0)<<"\n";
	}
    return 0;
}