CF1335F Robots on a Grid
比较简单的倍增
但还是看了题解才会
题意
给出一个 \(n\times m\) 的网格,每个格子有颜色,\(0\) 黑 \(1\) 白,每个格子还有一个方向,表示这个格子上的机器人会向那个方向走,并保证不会走出格子
摆放机器人,它们同时开始运动,在任意时刻不能有两个机器人在同一个格子里
先最大化机器人个数,如果多种方案机器人个数相等,再最大化摆在黑格子里的机器人数量
首先,这个路线肯定是循环的,如果不循环,就会走到无限多个格子,不合理
然后,对于任意一个格子,从那里开始走到完成一个完整的循环,步数肯定小于等于 \(nm\),显然它不能走了比 \(nm\) 还多的格子仍然不开始循环
而对于两个不同的循环,它们一定没有交点(就是一个相同的格子),如果有,肯定就不会行成两个循环了
如果有两个机器人分别走了至少 \(nm\) 步,那么它们肯定已经各子循环了一次或以上了
所以,如果它们不在同一个循环,显然不会相遇
如果在一个循环,且没有在 \(nm\) 步内相遇,说明这时它们已经“同步”了,就是会一直保持这一个距离不断的走,永不相遇
当然,如果在 \(nm\) 步之前就已经相遇,那么它们会一直一起走,不会有影响
至此,我们判断两个格子上的机器人是否会相遇的方法,就是看它们走了 \(nm\) 步以后,是不是在同一个格子
所以,假设我们在所有格子都摆上机器人,让他们走,一旦有几个相遇了,就说明我们要去掉这些机器人只剩下其中的一个
这时,给这 \(nm\) 个点编号 \(1\ldots nm\),并用\(white_i,black_i\)表示的分别是有没有从白/黑格出发的机器人,\(nm\) 格后会走到这里
然后从 \(1\) 到 \(nm\) 统计答案,如果某个格子可以由黑色格子中的机器人走来,就保留黑色格子的那个,否则任意保留
就可以计算出答案了
对于走 \(nm\) 步那个操作,就要用倍增实现
#include<cstdio>
#include<algorithm>
#include<iostream>
#include<cmath>
#include<map>
#include<iomanip>
#include<cstring>
#define reg register
#define EN std::puts("")
#define LL long long
inline int read(){
register int x=0;register int y=1;
register char c=std::getchar();
while(c<'0'||c>'9'){if(c=='-') y=0;c=std::getchar();}
while(c>='0'&&c<='9'){x=x*10+(c^48);c=std::getchar();}
return y?x:-x;
}
int black[1000006],white[1000005];
int nex[24][1000006];
int color[1000006];
char s[1000006];
int main(){int T=read();while(T--){
int n=read(),m=read();
for(reg int i=1;i<=n;i++){
std::scanf("%s",s+1);
for(reg int j=1;j<=m;j++) color[(i-1)*m+j]=s[j]=='0'?0:1;
}
for(reg int i=1;i<=n;i++){
std::scanf("%s",s+1);
for(reg int j=1;j<=m;j++){
int now=(i-1)*m+j;
if(s[j]=='U') nex[0][now]=now-m;
else if(s[j]=='D') nex[0][now]=now+m;
else if(s[j]=='L') nex[0][now]=now-1;
else nex[0][now]=now+1;
}
}
n*=m;
for(reg int i=1;i<=20;i++)
for(reg int j=1;j<=n;j++) nex[i][j]=nex[i-1][nex[i-1][j]];
for(reg int j=1;j<=n;j++){
int to=j;
for(reg int i=20;~i;i--){//倒着循环,倍增传统套路,不过想想也能知道,要先走大的步数
if((1<<i)&n) to=nex[i][to];
}
color[j]?white[to]=1:black[to]=1;
}
int ans=0,black_num=0;
for(reg int i=1;i<=n;i++)
if(black[i]) black_num++,ans++,black[i]=white[i]=0;
else if(white[i]) ans++,black[i]=white[i]=0;
std::printf("%d %d\n",ans,black_num);
}
return 0;
}
CF1335F Robots on a Grid的更多相关文章
- Robots on a grid(DP+bfs())
链接:http://www.bnuoj.com/bnuoj/problem_show.php?pid=25585 Current Server Time: 2013-08-27 20:42:26 Ro ...
- Map-making Robots: A Review of the Occupancy Grid Map Algorithm
栅格地图算法:http://www.ikaros-project.org/articles/2008/gridmaps/
- WPF Wonders: Transformations (and Robots!)
indows Presentation Framework (WPF) gets a lot of mileage out of being layered on top of DirectX, in ...
- POJ 1548 Robots (Dilworth)
Robots Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 3621 Accepted: 1643 Description Yo ...
- hdu6229 Wandering Robots 2017沈阳区域赛M题 思维加map
题目传送门 题目大意: 给出一张n*n的图,机器人在一秒钟内任一格子上都可以有五种操作,上下左右或者停顿,(不能出边界,不能碰到障碍物).题目给出k个障碍物,但保证没有障碍物的地方是强联通的,问经过无 ...
- CH6802 車的放置 和 CH6B24 Place the Robots
6802 車的放置 0x60「图论」例题 描述 给定一个N行M列的棋盘,已知某些格子禁止放置.问棋盘上最多能放多少个不能互相攻击的車.車放在格子里,攻击范围与中国象棋的"車"一致. ...
- ZOJ 1654 Place the Robots(最大匹配)
Robert is a famous engineer. One day he was given a task by his boss. The background of the task was ...
- ZOJ 1654--Place the Robots【二分匹配 && 经典建图】
Place the Robots Time Limit: 5 Seconds Memory Limit: 32768 KB Robert is a famous engineer. One ...
- gym 100971 J Robots at Warehouse
Vitaly works at the warehouse. The warehouse can be represented as a grid of n × m cells, each of wh ...
随机推荐
- Linux管理,例行性工作,at和cron
at 仅执行一次就结束调度(服务atd必须启动) at的配置信息 1.我们设定的at进程其实都是被以文本的方式写入到/var/spool/at/目录内,然后这些设定的进程便会等待atd服务来启动这些进 ...
- 2017蓝桥杯最大公共子串(C++B组)
题目: 最大公共子串长度问题就是:求两个串的所有子串中能够匹配上的最大长度是多少.比如:"abcdkkk" 和 "baabcdadabc",可以找到的最长的公共 ...
- CVPR2018关键字分析生成词云图与查找
今日目标:爬取CVPR2018论文,进行分析总结出提到最多的关键字,生成wordCloud词云图展示,并且设置点击后出现对应的论文以及链接 对任务进行分解: ①爬取CVPR2018的标题,简介,关键字 ...
- MySQL InnoDB存储引擎体系架构 —— 索引高级
转载地址:https://mp.weixin.qq.com/s/HNnzAgUtBoDhhJpsA0fjKQ 世界上只两件东西能震撼人们的心灵:一件是我们心中崇高的道德标准:另一件是我们头顶上灿烂的星 ...
- sql 案例
select now();#获取当前系统时间 select now() from dual;#与Oracle兼容 show character set;#产看当前数据库支持的字符集 create da ...
- leetcode c++做题思路和题解(4)——队列的例题和总结
队列的例题和总结 0. 目录 栈实现队列 队列实现栈 滑动窗口最大值 1. 栈实现队列 FIFO和FILO,相当于+-号,互转都是利用"负负得正"的原理. 官方解答中第二种思路很6 ...
- java jdk 中HashMap的源码解读
HashMap是我们在日常写代码时最常用到的一个数据结构,它为我们提供key-value形式的数据存储.同时,它的查询,插入效率都非常高. 在之前的排序算法总结里面里,我大致学习了HashMap的实现 ...
- 【python实现卷积神经网络】Dropout层实现
代码来源:https://github.com/eriklindernoren/ML-From-Scratch 卷积神经网络中卷积层Conv2D(带stride.padding)的具体实现:https ...
- 003-scanf函数使用和表达式-C语言笔记
003-scanf函数使用和表达式-C语言笔记 学习目标 1.[掌握]输入函数scanf的基本使用方法 2.[掌握]输入函数scanf运行原理和缓冲区理解 3.[掌握]算术运算符和算术表达式的使用 4 ...
- Linux/UNIX 下 “command not found” 原因分析及解决
在使用 Linux/UNIX 时,会经常遇到 "command not found" 的错误,就如提示的信息,Linux /UNIX 没有找到该命令.原因无外乎你命令拼写错误或 L ...