rt,算了一下,复杂度是 O(r×(c+∑l)),大样例跑了 5s,求卡常。
#include <bits/stdc++.h>
using namespace std;
const int N = 1e5 + 10, L = 2e5 + 10, R = 110;
int t, n, K, q, l[L], c[L], h[L];
vector<int> s[N];
vector<pair<int, int>> v[L];
bitset<L> m[R];
vector<pair<int, int>> qj[N];
int main()
{
ios::sync_with_stdio(0), cin.tie(0);
cin >> t;
while (t--)
{
cin >> n >> K >> q;
for (int i = 1; i <= n; ++i)
{
cin >> l[i];
s[i].resize(l[i] + 1);
for (int j = 1; j <= l[i]; ++j) cin >> s[i][j], v[s[i][j]].emplace_back(i, j);
}
m[1][1] = 0;
if (!v[1].empty()) m[1][1] = 1, c[1] = v[1].size(), h[1] = v[1].front().first;
for (int k = 2; k < R; ++k)
{
m[k] = 0;
for (int x = 1; x < L; ++x)
{
if (!m[k - 1][x]) continue;
for (auto y : v[x])
{
int i = y.first, j = y.second;
if (c[x] == 1 && h[x] == i) continue;
if (j != l[i]) qj[i].emplace_back(j + 1, min(l[i], j + K - 1));
}
}
for (int i = 1; i < L; ++i) c[i] = h[i] = 0;
for (int i = 1; i <= n; ++i)
{
sort(qj[i].begin(), qj[i].end());
int lst = 0, pos = 0;
for (int j = 1; j <= l[i]; ++j)
{
while (pos < qj[i].size() && j == qj[i][pos].first) lst = max(lst, qj[i][pos].second), ++pos;
if (j <= lst) m[k][s[i][j]] = 1, c[s[i][j]] += h[s[i][j]] != i, h[s[i][j]] = i;
}
}
for (int i = 1; i <= n; ++i) qj[i].clear();
}
while (q--)
{
int r, c;
cin >> r >> c;
cout << m[r + 1][c] << '\n';
}
for (int i = 1; i < L; ++i) c[i] = 0;
for (int i = 1; i < L; ++i) v[i].clear();
}
return 0;
}