[codeforces]Goodbye_2015
Posted sysu_zjl
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[codeforces]Goodbye_2015相关的知识,希望对你有一定的参考价值。
F. New Year and Cleaning
ime limit per test2 seconds
memory limit per test256 megabytes
inputstandard input
outputstandard output
Limak is a little polar bear. His parents told him to clean a house before the New Year’s Eve. Their house is a rectangular grid with h rows and w columns. Each cell is an empty square.
He is a little bear and thus he can’t clean a house by himself. Instead, he is going to use a cleaning robot.
A cleaning robot has a built-in pattern of n moves, defined by a string of the length n. A single move (character) moves a robot to one of four adjacent cells. Each character is one of the following four: ‘U’ (up), ‘D’ (down), ‘L’ (left), ‘R’ (right). One move takes one minute.
A cleaning robot must be placed and started in some cell. Then it repeats its pattern of moves till it hits a wall (one of four borders of a house). After hitting a wall it can be placed and used again.
Limak isn’t sure if placing a cleaning robot in one cell will be enough. Thus, he is going to start it w·h times, one time in each cell. Maybe some cells will be cleaned more than once but who cares?
Limak asks you one question. How much time will it take to clean a house? Find and print the number of minutes modulo 109 + 7. It’s also possible that a cleaning robot will never stop — then print “-1” (without the quotes) instead.
Placing and starting a robot takes no time, however, you must count a move when robot hits a wall. Take a look into samples for further clarification.
Input
The first line contains three integers n, h and w (1 ≤ n, h, w ≤ 500 000) — the length of the pattern, the number of rows and the number of columns, respectively.
The second line contains a string of length n — the pattern of n moves. Each character is one of uppercase letters ‘U’, ‘D’, ‘L’ or ‘R’.
Output
Print one line with the answer.
If a cleaning robot will never stop, print “-1” (without the quotes). Otherwise, print the number of minutes it will take to clean a house modulo 109 + 7.
Sample test(s)
input
1 10 2
R
output
30
input
3 4 6
RUL
output
134
input
4 1 500000
RLRL
output
-1
Note
In the first sample house is a grid with 10 rows and 2 columns. Starting a robot anywhere in the second column will result in only one move (thus, one minute of cleaning) in which robot will hit a wall — he tried to go right but there is no third column. Starting a robot anywhere in the first column will result in two moves. The total number of minutes is 10·1 + 10·2 = 30.
In the second sample a started robot will try to move “RULRULRULR…” For example, for the leftmost cell in the second row robot will make 5 moves before it stops because of hitting an upper wall.
题目大意:有机器人在矩形w*h中进行大扫除,按给定的指令进行循环走路,直到走向墙壁就停止,重新放置位置。机器人每次放置在不同的位置,进行w*h次清洗。计算其耗费的总时间,每个动作花费1分钟。
解题思路:先不管机器人在哪个位置开始,假设从(0,0)开始,用minx,miny,maxx,maxy记录它走过的最大边界。开始执行n条指令,每次更新minx或者maxx, w就减1,ans 加上 现在执行的动作次数乘以h,同样地, 每次更新miny或者maxy,h就减1,ans 加上 现在执行的动作次数乘以w,
直到h == 0或w==0退出
计算完第一次n条指令后,判断当前坐标是否为(0,0),是的话输出-1.
否则计算第二次n条指令,这次每更新minx,miny,maxx,maxy,都要将该指令存储下来。
可想而知第三次n条指令,每次更新minx,miny,maxx,maxy都会跟第二次执行的命令相同。直到h == 0或w==0退出
这时只需循环记录下来的更新minx,miny,maxx,maxy命令第k次命令结束则继续第k+1次直到h == 0或w==0结束
#include <cstdio>
#include <algorithm>
using namespace std;
typedef long long LL;
char s[500010];
int a[500010];
int c[500010];
const int module = 1e9 + 7;
int n, h, w;
int main()
scanf("%d%d%d", &n, &h, &w);
scanf("%s", s);
int minx = 0, miny = 0, maxx = 0, maxy = 0,flag = 0;
int x = 0, y = 0;
int ans = 0, count = 0;
long long moves = 1;
for (int i = 0; i < n; i++)
if (s[i] == 'L')
x--;
if (minx > x)
ans = (ans+ moves * h % module) % module;
w--;
a[count++] = 1;
minx = min(x, minx);
else if (s[i] == 'R')
x++;
if (maxx < x)
ans = (ans + moves * h % module) % module;
w--;
a[count++] = 2;
maxx = max(x, maxx);
else if (s[i] == 'U')
y++;
if (maxy < y)
h--;
ans = (ans + moves * w % module) % module;
a[count++] = 3;
maxy = max(y, maxy);
else
y--;
if (miny > y)
h--;
ans = (ans + moves * w % module) % module;
a[count++] = 4;
miny = min(y, miny);
if (w == 0 || h == 0)
flag = 1;
break;
moves++;
if (x == 0 && y == 0 && !flag)
printf("-1\\n");
else
count = 0;
if (flag) // 无判断是否已达到退出情况导致time limits
printf("%d\\n", ans);
return 0;
for (int i = 0; i < n; i++)
if (s[i] == 'L')
x--;
if (minx > x)
ans = (ans+ moves * h % module) % module;
w--;
c[count] = moves%n;
a[count++] = 1;
minx = min(x, minx);
else if (s[i] == 'R')
x++;
if (maxx < x)
ans = (ans+ moves * h% module) % module;
w--;
c[count] = moves%n;
a[count++] = 2;
maxx = max(x, maxx);
else if (s[i] == 'U')
y++;
if (maxy < y)
h--;
ans = (ans + moves * w % module) % module;
c[count] = moves%n;
a[count++] = 3;
maxy = max(y, maxy);
else
y--;
if (miny > y)
h--;
ans = (ans + moves * w % module) % module;
c[count] = moves%n;
a[count++] = 4;
miny = min(y, miny);
if (count > 0 && c[count-1] % n == 0)
c[count-1] = n;
if (w == 0 || h == 0) // 第二次循环时无判断是否已达到退出情况导致time limits
flag = 1;
break;
moves++;
if (flag)
printf("%d\\n", ans);
return 0;
int i = 0;
long long k = 2;
while (h != 0 && w != 0)
if (a[i] == 1)
w--;
ans = (ans + (k * n % module + c[i]) * h % module)% module;
else if (a[i] == 2)
w--;
ans = (ans + (k * n % module + c[i]) * h % module)% module;
else if (a[i] == 3)
h--;
ans = (ans + (k * n % module + c[i]) * w % module)% module;
else
h--;
ans = (ans + (k * n % module + c[i]) * w % module)% module;
if (i == count-1)
i = 0;
k++;
else
i++;
printf("%d\\n", ans);
return 0;
以上是关于[codeforces]Goodbye_2015的主要内容,如果未能解决你的问题,请参考以下文章
[Codeforces]849E Goodbye Souvenir
[Codeforces]848C - Goodbye Souvenir
codeforces Goodbye2018 C. New Year and the Permutation Concatenation 傻瓜解法找规律+打表