55pts 求助
查看原帖
55pts 求助
681941
OIer_Hhy楼主2024/10/27 11:26

rt,我这个应该是能到 60 pts 的。

#include<bits/stdc++.h>
using namespace std;
const int N=1e3+10;
int n,m,q,r,c,a[N][2005];
int l[N];
bool f[12][1005][2005];
set<int> st;
int cnt;
void solve(){
	st.clear();
	memset(f,0,sizeof f);
	cin>>n>>m>>q;
	for(int i=1;i<=n;i++){
		cin>>l[i];
		for(int j=1;j<=l[i];j++){
			cin>>a[i][j];
			st.insert(a[i][j]);
		}
	}
	vector<int> v;
	for(auto x:st) v.push_back(x);
	for(int i=1;i<=n;i++){
		for(int j=1;j<=l[i];j++) a[i][j]=lower_bound(v.begin(),v.end(),a[i][j])-v.begin()+1;
	}
	for(int i=1;i<=n;i++){
		for(int k=1;k<=l[i];k++){
			if(a[i][k]==1){
				for(int j=2;j<=m&&j+k-1<=l[i];j++) f[1][i][a[i][j+k-1]]=1;
			}
		}
	}
	for(int i=1;i<=10;i++){
		for(int j=1;j<=n;j++){
			for(int k=1;k<=l[j];k++){
				for(int u=1;u<=n;u++){
					if(u==j) continue;
					vector<int> vec;
					for(int v=1;v<=l[u];v++){
						if(a[j][k]==a[u][v]) vec.emplace_back(v);
					}
					for(auto x:vec){
						for(int o=2;o<=m&&x+o-1<=l[u];o++)
							f[i+1][u][a[u][x+o-1]]|=f[i][j][a[j][k]];
					}
				}
			}
		}
	}
	while(q--){
		++cnt;
		cin>>r>>c;
		auto it=lower_bound(v.begin(),v.end(),c);
		if(*it!=c||it==v.end()){
			cout<<0<<'\n';
			continue;
		}
		c=it-v.begin()+1;
		int ans=0;
		for(int i=1;i<=n;i++) ans|=f[r][i][c];
		cout<<ans<<'\n';
	}
}
signed main(){
//	freopen("chain4.in","r",stdin);
//	freopen("chain4.out","w",stdout);
	int t;
	cin>>t;
	while(t--) solve();
	return 0;
}

2024/10/27 11:26
加载中...