RE+TLE求解
查看原帖
RE+TLE求解
1050431
DevilsFlame楼主2025/2/8 12:38

万紫千红总是春

#include <bits/stdc++.h>
#define ba emplace_back
#define N 200010
#define R 105
#define fi first
#define se second
#define mk make_pair
using namespace std;
int T,n,k,Q,r,c,x,y,v;
vector <int> a[N];
vector <pair <int,int> > q;
bool ans[R][N];
int vis[N];
inline int rd()
{
	char s = getchar();
	x = 0;
	int f = 1;
	while(s < '0' || s > '9')
	{
		if(s == '-') f = -1;
		s = getchar();
	}
	while(s >= '0' && s <= '9')
	{
		x = x * 10 + s - 48;
		s = getchar();
	}
	x *= f;
	return x;
}
inline void work()
{
	memset(ans,0,sizeof(ans));
	for(int i = 1;i <= n;i ++)
	{
		v = -1e9;
		for(int j = 1;j <= a[i][0];j ++)
		{
			if(j - v < k)
			{
				ans[1][a[i][j]] = 1;
				q.ba(mk(a[i][j],i));
			}
			if(a[i][j] == 1) v = j;
		}
	}
	for(int i = 0;i < q.size();i ++)
	{
		x = q[i].fi,y = q[i].se;
		if(!vis[x]) vis[x] = y;
		else vis[x] = -1;
	}
	q.clear();
	for(r = 2;r <= 100;r ++)
	{
		for(int i = 1;i <= n;i ++)
		{
			v = -1e9;
			for(int j = 1;j <= a[i][0];j ++)
			{
				x = a[i][j];
				if(j - v < k)
				{
					ans[r][x] = 1;
					q.ba(mk(x,i));
				}
				if(vis[x] && vis[x] != i) v = j;//不是来自同一人
			}
		}
		memset(vis,0,sizeof(vis));
		for(int i = 0;i < q.size();i ++)
		{
			x = q[i].fi,y = q[i].se;
			if(!vis[x]) vis[x] = y;
			else vis[x] = -1;
		}
		q.clear();
	}
	return;
}
int main()
{
	ios::sync_with_stdio(0);
	cin.tie(0),cout.tie(0);
	T = rd();
	while(T --)
	{
		n = rd(),k = rd(),Q = rd();
		for(int i = 1;i <= n;i ++)
		{
			a[i].ba(rd());
			for(int j = 1;j <= a[i][0];j ++) a[i].ba(rd());
		}
		work();
		while(Q --)
		{
			r = rd(),c = rd();
			putchar(ans[r][c] + 48);
			putchar('\n');
		}
	}
	return 0;
}
2025/2/8 12:38
加载中...