1 条题解

  • 0
    @ 2025-10-8 17:01:13
    #include <bits/stdc++.h>
    using namespace std;
    typedef long long ll;
    const int N = 2e5 + 7;
    int n, k, q, dp[110][N];
    vector<int> G[N];
     
    void solve()
    {
        scanf("%d%d%d",&n,&k,&q);
    	memset(dp, -1, sizeof dp); // 初始化!!!
        for(int i = 1; i <= n; i ++)
    	{
            int L;scanf("%d",&L);
            G[i].clear();for(int j =1, x; j <= L; j ++)scanf("%d",&x), G[i].push_back(x);
        }
    
        dp[0][1] = 0; // 第一轮一定从1开始
        for(int r = 1; r <= 100; r ++) // 枚举轮数
    	{
            for(int i = 1; i <= n; i ++)// 每个人对当前轮做贡献 
    		{ 
                int cnt = 0; // 记录还有多少个可以作为接龙结尾的数
                for(auto x : G[i])// 遍历第i行每一个数
    			{ 
                    if(cnt > 0)
    				{
                        if(dp[r][x] == -1)     dp[r][x] = i; // 第一次被接龙
                        else if(dp[r][x] != i) dp[r][x] = 0; // 第二次被接龙后可以任意接龙
                        -- cnt; // 要接龙的个数--
                    }
                     
                    if(dp[r - 1][x] != -1 && dp[r - 1][x] != i) cnt = k - 1; // x之后的k-1个数都可以被接
                }
            }
        }
    
        while(q --)
    	{
            int r, c;scanf("%d%d",&r,&c); 
            printf("%d\n", ( dp[r][c] == -1? 0 : 1)  );
        }
    }
     
    int main()
    {
        int T;scanf("%d",&T);
        while(T --) solve();
        return 0;
    }
    
    • 1

    【动态规划:状态设计和继承】[CSP-J 2024] 接龙

    信息

    ID
    2553
    时间
    2000ms
    内存
    512MiB
    难度
    9
    标签
    递交数
    290
    已通过
    25
    上传者