求卡常
查看原帖
求卡常
1203411
Louis_lxy楼主2024/10/31 21:55

rt,算了一下,复杂度是 O(r×(c+l))O(r\times (c+\sum 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;
}
2024/10/31 21:55
加载中...