题解(晚出)
查看原帖
题解(晚出)
1385791
fushuoting楼主2024/11/25 22:43
#include<iostream>
#include<vector>
using namespace std;
const int N=2e5+5;
const int M=100;//最大轮数
void solve()
{
    int n,k,q;
    cin>>n>>k>>q;
    vector<vector<int>>dp(M+1,vector<int>(N,-1));//打表
    vector<vector<int>>s(n+1);//选手卡牌
    for(int i=1;i<=n;i++)//输入
    {
        int len;
        cin>>len;
        for(int j=1;j<=len;j++)
        {
            int v;
            cin>>v;
            s[i].push_back(v);
        }
    }
    dp[0][1]=-2;
    for(int cnt=1;cnt<=M;cnt++)//最大轮数
    {
        for(int i=1;i<=n;i++)//n个人
        {
            int lst=-1;//last
            for(int j=0;j<s[i].size();j++)//第i个人的s[i].size()
            {
                int x=s[i][j];
                if(lst!=-1&&(j-lst+1<=k))
                {
                    if(dp[cnt-1][s[i][lst]]!=-1&&dp[cnt-1][s[i][lst]])//达标内容,如果多解为-2,无解-1,否则为那个人的编号
                    {
                        if(dp[cnt][x]==-1)
                        {
                            dp[cnt][x]=i;
                        }
                        else if(dp[cnt][x]!=i)
                        {
                            dp[cnt][x]=-2;
                        }
                    }
                }
                int v=dp[cnt-1][x];//进入到下一轮打表
                if(v!=-1&&v!=i)
                {
                    lst=j;
                }
            }
        }
    }
    while(q--)
    {
        int r,c;
        cin>>r>>c;
        if(dp[r][c]!=-1)//输出
        {
            cout<<1<<endl;
        }
        else
        {
            cout<<0<<endl;
        }
    }
}
int main()
{
    int T;
    cin>>T;
    while(T--)
    {
        solve();//封装成函数
    }
    return 0;
}

2024/11/25 22:43
加载中...