20分求调
查看原帖
20分求调
1127772
newlab楼主2024/11/6 12:42

如下

#include <bits/stdc++.h>
using namespace std;

const int R=1e2+5, N=2e5+5;
bool dp1[R][N]; // r round, end with n
bool dp2[R][N]; // r round, end with nth
int n, k, q, r, c, l[N], s[N], cnt[R][N];
// l: end pos of each player.
// s: complete set of nums.
// cnt: r round, end with n
int ah; // available methods of head num.


void solve()
{
        memset(dp1, 0, sizeof(dp1));
        memset(dp2, 0, sizeof(dp2));
        memset(cnt, 0, sizeof(cnt));

        cin >> n >> k >> q;
        for (int i=1; i<=n; ++i) {
                cin >> l[i];
                l[i] += l[i-1];
                for (int j=l[i-1]+1; j<=l[i]; ++j) {
                        cin >> s[j];
                }
        }
        for (int i=1; i<=l[n]; ++i) {
                if (s[i]==1) {
                        dp1[0][1] = 1;
                        dp2[0][i] = 1;
                        ++cnt[0][1];
                }
        }
        for (r=1; r<=100; ++r) {
                for (int i=1; i<=n; ++i) {
                        ah = 0;
                        for (int j=l[i-1]+1; j<=l[i]; ++j) {
                                cnt[r-1][s[j]] -= dp2[r-1][j];
                        }
                        for (int j=l[i-1]+1; j<=l[i]; ++j) { // end with s[j]
                                if (j-k > l[i-1]) {
                                        ah -= (cnt[r-1][s[j-k]]>0);
                                }
                                if (ah) {
                                        dp1[r][s[j]]=1;
                                        dp2[r][j]=1;
                                        ++cnt[r][s[j]];
                                }
                                ah += (cnt[r-1][s[j]]>0);
                        }
                        for (int j=l[i-1]+1; j<=l[i]; ++j) {
                                cnt[r-1][s[j]] += dp2[r-1][j];
                        }
                }
        }
        for (int i=0; i<q; ++i) {
                cin >> r >> c;
                cout << dp1[r][c] << '\n';
        }
        return;
}

int main()
{
        int T;
        ios::sync_with_stdio(false);
        cin >> T;
        for (int i=0; i<T; ++i) {
                solve();
        }
        return 0;
}
2024/11/6 12:42
加载中...