60分!!!求调!!!
查看原帖
60分!!!求调!!!
1500752
CrossAngle楼主2025/1/23 17:10
#include<bits/stdc++.h>
using namespace std;
#define N 200010
int T,n,k,q,le[N],ri[N],id[N];
int v[N];
bool f[102][N],g[102][N];
vector<int>c[N];
bool ans[N][102],mp[N];
signed main(){
	freopen("chain.in","r",stdin);
	freopen("chain.out","w",stdout);
	ios::sync_with_stdio(0);
	cin.tie(0); 
	cin>>T;
	while(T--){
		for(int i=1;i<=ri[n];i++){
			for(int j=1;j<=100;j++){
				g[j][i]=0;
				f[j][i]=0;
			}
		}
		cin>>n>>k>>q;
		for(int i=1;i<=200000;i++){
			c[i].clear();
			for(int j=1;j<=100;j++){
				ans[i][j]=0;
			}
		}
		for(int i=1;i<=n;i++){
			int l;
			le[i]=ri[i-1]+1;
			cin>>l;
			ri[i]=le[i]+l-1;
			for(int j=le[i];j<=ri[i];j++){
				cin>>v[j];
				id[j]=i;
				c[v[j]].push_back(j);
				for(int k=1;k<=100;k++){
					g[k][j]=0;
					f[k][j]=0;
				}
			}
		}
		for(int i=1;i<=n;i++){
			int pos=le[i]-1;
			for(int j=le[i];j<=ri[i];j++){
				if((pos!=(le[i]-1))&&((j-pos)<k)){
					f[1][j]=1;
				}
				if(v[j]==1){
					pos=j;
				}
			}
		}
		for(int i=1;i<=200000;i++){
			for(int j=0;j<c[i].size();j++){
				ans[i][1]|=f[1][c[i][j]];
			}
		}
		for(int l=2;l<=100;l++){
			for(int i=1;i<=200000;i++){
				int sum=0,pos;
				for(int j=0;j<c[i].size();j++){
					if(f[l-1][c[i][j]]){
						if(!mp[id[c[i][j]]]){
							sum++;
							pos=id[c[i][j]];
							mp[id[c[i][j]]]=1;
						}
					}
				}
				if(sum>=2){
					for(int j=0;j<c[i].size();j++){
						g[l-1][c[i][j]]=1;
						mp[id[c[i][j]]]=0;
					}
				}
				else{
					if(sum==1){
						for(int j=0;j<c[i].size();j++){
							if(id[c[i][j]]!=pos){
								g[l-1][c[i][j]]=1;
							}
							mp[id[c[i][j]]]=0;
						}
					}
					else{
						for(int j=0;j<c[i].size();j++){
							mp[id[c[i][j]]]=0;
						}
					}
				}
			}
			for(int i=1;i<=n;i++){
				int pos=le[i]-1;
				for(int j=le[i];j<=ri[i];j++){
					if((pos!=(le[i]-1))&&((j-pos)<k)){
						f[l][j]=1;
					}
					if(g[l-1][j]==1){
						pos=j;
					}
				}
			}
			for(int i=1;i<=200000;i++){
				for(int j=0;j<c[i].size();j++){
					ans[i][l]|=f[l][c[i][j]];
				}
			}
		}
		while(q--){
			int r,c;
			cin>>r>>c;
			cout<<ans[c][r]<<'\n';
		}
	}
	return 0;
}
2025/1/23 17:10
加载中...