2024CSP-J 普及组第二轮试题及解析(第四题、接龙(chain))

第四题参考程序代码:

#include <iostream>
#include <vector>
#include <bitset>
using namespace std;
const int inf =1 << 30;
const int mod =998244353;
const int N =2e5 +10,M=N<<1;
int T,n,k,q;
int len[N],a[N];
vector<int>s[N],tag[N];
bitset<N>vis[101];
inline void solve()
{
	 cin >>n >>k >>q;
	 int sumL =0;
	 for(int i=1;i<=n;i++)
	 {
	 	cin >>len[i];
		s[i].resize(len[i]+1);
		tag[i].resize(len[i]+1);
		for(int j=1;j<=len[i];j++)
		{
			cin >>s[i][j];
			if(s[i][j]==1)
				tag[i][j]=1;
			else 
				tag[i][j]=0;
        }
        sumL +=len[i];
    }
	for(int t =1;t<=100;t++)
	{
		for(int i=1;i<N;i++)
			a[i]=0,vis[t][i]=0;
		for(int i=1;i<=n;i++)
		{
			int pre =-k;
			for(int j=1;j<=len[i];j++)
			{
				if(j -pre +1<=k)
				{
					if(!a[s[i][j]])
						a[s[i][j]]=i;
					else if(a[s[i][j]]!=i)
						a[s[i][j]]=-1;
					vis[t][s[i][j]]=1;
				}
				if(tag[i][j])
					pre =j;
			}
		}
		for(int i=1;i<=n;i++)
		{
			for(int j=1;j<=len[i];j++)
			{
				if(a[s[i][j]]!=0 &&a[s[i][j]]!=i)
					tag[i][j]=1;
				else 
					tag[i][j]=0;
			}
		}
	}
	for(int i=1,r,c;i<=q;i++)
	{
		cin >>r >>c;
		if(vis[r][c])
			cout <<"1\n";
		else 
			cout <<"0\n";
	}
}
int main()
{
	int t=1;
	cin >>t;
	while(t--)
		solve();
	return 0;
}

猜你喜欢

转载自blog.csdn.net/weixin_60445850/article/details/143300421