Codeforces1335F Robots on a Grid

蒟蒻怕是颓了 std

Description

link

题意:给一个矩阵,上面有ULRD四种指向

同时这个矩阵的每个元素还有黑或白两种属性

在该格中则下一秒就到了指向的那个格子

现在在矩阵中放机器人,如果两个机器人在若干秒后相撞了,则该摆放不合法

求最大合法摆放个数和以之为前提最多有多少黑格

Solution

考场想到了二分图……显而易见地不入流

我们发现机器人的走法可能构成了一个环,长度n×m

如果两个机器人在某个时候相遇了,那么它们会接着同步走

考虑到环长,所以如果两个机器人会相遇,那么在n×m 步后会在一个格子上面

我们用倍增实现求从 (i,j) 开始 n×m 步会到达的位置即可

最后用桶一下就可以了

最后,这个题坑点还有清空数组,桶需要在求完了就即时清空

Code

#include<bits/stdc++.h>
using namespace std;
#define int long long
namespace yspm{
	inline int read()
	{
		int res=0,f=1; char k;
		while(!isdigit(k=getchar())) if(k=='-') f=-1;
		while(isdigit(k)) res=res*10+k-'0',k=getchar();
		return res*f;
	}
	const int N=1e6+10;
	int b[N],w[N],col[N]; char s[N];
	int nxt[24][N],n,m;
	inline int id(int x,int y)
	{
		return m*(x-1)+y;
	}
	inline void work()
	{
		n=read(); m=read(); 
		for(int i=1;i<=n;++i) 
		{
			scanf("%s",s+1);
			for(int j=1;j<=m;++j) col[id(i,j)]=s[j]-'0';
		}
		for(int i=1;i<=n;++i)
		{
			scanf("%s",s+1);
			for(int j=1;j<=m;++j)
			{
				int now=id(i,j);
				if(s[j]=='U') nxt[0][now]=now-m;
				else if(s[j]=='D') nxt[0][now]=now+m;
				else if(s[j]=='L') nxt[0][now]=now-1;
				else nxt[0][now]=now+1;
			}
		} 
		n*=m;
		for(int i=1;i<=20;++i) for(int j=1;j<=n;++j) nxt[i][j]=nxt[i-1][nxt[i-1][j]];
		for(int j=1;j<=n;++j) 
		{
			int to=j;
			for(int i=20;i>=0;--i) if((1<<i)&n) to=nxt[i][to];
			if(col[j]) w[to]=1; else b[to]=1;
		}
		int ans=0,maxx=0;
		for(int i=1;i<=n;++i)
		{
			if(b[i]) ans++,maxx++,b[i]=w[i]=0;
			else if(w[i]) ans++,b[i]=w[i]=0; 
		}printf("%lld %lld\n",ans,maxx);
		return ;
	}
	signed main()
	{
		int T=read(); while(T--) work();
		return 0;
	}
}
signed main(){return yspm::main();}
posted @   没学完四大礼包不改名  阅读(198)  评论(0编辑  收藏  举报
编辑推荐:
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律
点击右上角即可分享
微信分享提示