【Codeforces1117C_CF1117C】Magic Ship(构造)
题目:
考的时候很困,开局半小时后才过A,只做出来AB,排名3000+,掉了119……半夜体验极差。
翻译:
你是一个船长。最初你在点 \((x_1,y_1)\) (显然,大海上的所有点都可以用平面直角坐标描述),你想去点 \((x_2,y_2)\) 。
你看了天气预报——一个长为 \(n\) 的字符串 \(s\),只包含字母 U, D, L 和 R 。这些字母表示风向。并且,这个天气预报是循环的。例如,第一天风向是 \(s_1\) ,第二天是 \(s_2\) ,第 \(n\) 天是 \(s_n\) ,则第 \(n+1\) 天又是 \(s_1\) ,以此类推。
船的坐标按照如下方式改变:
如果风向是 U ,船从 \((x,y)\) 到 \((x,y+1)\) ;
如果风向是 D ,船从 \((x,y)\) 到 \((x,y-1)\) ;
如果风向是 L ,船从 \((x,y)\) 到 \((x-1,y)\) ;
如果风向是 R ,船从 \((x,y)\) 到 \((x+1,y)\) 。
每天,船也能自己向如上四个方向中的一个移动恰好 \(1\) 个单位或待在原地。船的位移与风向会相加。如果船待在原地,则只计算风向对船的影响。例如,如果风向是 U ,船向 L 移动,则它会从 \((x,y)\) 移动到 \((x-1,y+1)\) ;如果船向 U 移动,则它会移动到 \((x,y+2)\) 。
你的任务是确定移动到 \((x_2,y_2)\) 所需的最少天数。
输入
第一行包含两个整数 \(x_1,y_1\ (0\leq x_1,y_1\leq 1e9)\) ——船的初始坐标。
第二行包含两个整数 \(x_2,y_2\ (0\leq x_2,y_2\leq 1e9)\) ——目的地的坐标。
保证初始坐标与目的地的坐标不同。
第三行包含一个整数 \(n\ (1\leq n \leq 10^5)\) ——字符串 \(s\) 的长度。
第四行包含字符串 \(s\) ,只包含字母 U, D, L 和 R 。
输出
输出一行,移动到 \((x_2,y_2)\) 所需的最少天数。
如果不可能输出 \(-1\) 。
分析:
(以下这些“显然”的结论我在考场上一个都没看出来……)
首先答案具有可二分性。因为到达终点后每天都往与当天风向相反的方向航行就可以停留在原地。
由于无论在什么地方,风的影响都是一样的。所以相当于先被风吹 \(t\) 天,然后再在无风的情况下航行不超过 \(t\) 天到终点。即,算出被风吹 \(t\) 天后的坐标,如果到终点的曼哈顿距离不超过 \(t\) ,说明 \(t\) 合法,向下二分,否则向上二分。
通过类似前缀和的方式算出前 \(i\ (1\leq i \leq n)\) 天在风的影响下两维坐标的改变量 \(sumx[i]\) 和 \(sumy[i]\) ,则 \(t\) 天后的坐标是 \((x_1+\lfloor\frac{t}{n}\rfloor sumx[n]+sumx[t\mod n],y_1+\lfloor\frac{t}{n}\rfloor sumy[n]+sumy[t\mod n])\) 。
代码:
二分上界记着开充分大……
#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
namespace zyt
{
typedef long long ll;
const int N = 1e5 + 10;
int x1, y1, x2, y2, n;
char s[N];
int sumx[N], sumy[N];
inline ll abs(const ll x)
{
return x < 0 ? -x : x;
}
int work()
{
scanf("%d%d%d%d%d%s", &x1, &y1, &x2, &y2, &n, s + 1);
for (int i = 1; i <= n; i++)
{
sumx[i] = sumx[i - 1], sumy[i] = sumy[i - 1];
if (s[i] == 'U')
++sumy[i];
else if (s[i] == 'D')
--sumy[i];
else if (s[i] == 'L')
--sumx[i];
else
++sumx[i];
}
ll l = 1, r = 1e18, ans = -1;
while (l <= r)
{
ll mid = (l + r) >> 1;
if (abs(x1 + (ll)sumx[n] * (mid / n) + sumx[mid % n] - x2)
+ abs(y1 + (ll)sumy[n] * (mid / n) + sumy[mid % n] - y2) <= mid)
r = mid - 1, ans = mid;
else
l = mid + 1;
}
printf("%lld", ans);
return 0;
}
}
int main()
{
return zyt::work();
}
【Codeforces1117C_CF1117C】Magic Ship(构造)的更多相关文章
- Educational Codeforces Round 60 (Rated for Div. 2) - C. Magic Ship
Problem Educational Codeforces Round 60 (Rated for Div. 2) - C. Magic Ship Time Limit: 2000 mSec P ...
- C. Magic Ship cf 二分
C. Magic Ship time limit per test 2 seconds memory limit per test 256 megabytes input standard input ...
- CF1117C Magic Ship
CF1117C Magic Ship 考虑到答案具单调性(若第 \(i\) 天能到达目的点,第 \(i+1\) 天只需向风向相反的方向航行),可以二分答案. 现在要考虑给出一个天数 \(m\) ,问 ...
- 题解-Magic Ship
Magic Ship 你在 \((x_1,y_1)\),要到点 \((x_2,y_2)\).风向周期为 \(n\),一个字符串 \(s\{n\}\) 表示风向(每轮上下左右),每轮你都会被风向吹走一格 ...
- C. Magic Grid 构造矩阵
C. Magic Grid time limit per test 1 second memory limit per test 256 megabytes input standard input ...
- Educational Codeforces Round 60 (Rated for Div. 2) 即Codeforces Round 1117 C题 Magic Ship
time limit per test 2 second memory limit per test 256 megabytes input standard inputoutput standard ...
- CodeForces 1117C Magic Ship (循环节+二分答案)
<题目链接> 题目大意: 给定起点和终点,某艘船想从起点走到终点,但是海面上会周期性的刮风,船在任何时候都能够向四个方向走,或者选择不走,船的真正行走路线是船的行走和风的走向叠加的,求船从 ...
- C. Magic Ship (思维+二分)
https://codeforces.com/contest/1117/problem/C 你是一个船长.最初你在点 (x1,y1) (显然,大海上的所有点都可以用平面直角坐标描述),你想去点 (x2 ...
- 【Codeforces 1117C】Magic Ship
[链接] 我是链接,点我呀:) [题意] 题意 [题解] 我们可以把这个行船的过程分解成两个过程 1.船经过时间t被风吹到了某个地方 2.船用这t时间尝试到达终点(x2,y2) 会发现如果时间t能最终 ...
随机推荐
- LINUX-挂载一个文件系统
mount /dev/hda2 /mnt/hda2 挂载一个叫做hda2的盘 - 确定目录 '/ mnt/hda2' 已经存在 umount /dev/hda2 卸载一个叫做hda2的盘 - 先从挂载 ...
- swing中的按钮事件
package pack2; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax ...
- 关于js中的事件委托小案例
需求:页面上有一个按钮,和一个空的ul,要求点击按钮,会给ul中动态添加li元素,然后,点击动态添加的元素,在控制台上输出,这是第几个元素 <ul> </ul> <but ...
- shell输出颜色、printf输出颜色
1.echo开启彩色输出: -e 开启echo中的转义: \e或者\033来输出Esc颜色: 恢复默认颜色为:\e[0m; 命令格式: echo -e "\e[字背景颜色:文字颜色m字符串\ ...
- 【模板】Lca倍增法
Codevs 1036 商务旅行 #include<cstdio> #include<cmath> #include<algorithm> using namesp ...
- 【BZOJ4514】数字配对(费用流)
题意: 有 n 种数字,第 i 种数字是 ai.有 bi 个,权值是 ci. 若两个数字 ai.aj 满足,ai 是 aj 的倍数,且 ai/aj 是一个质数, 那么这两个数字可以配对,并获得 ci× ...
- Spring 进行junit单元测试时,出现method ‘initializationError’ 错误
首先检查一下所有的方法是否为public 然后看是否有commons-logging这个日志包
- android中listview点击监听器onItemClick四个参数的含义
public void onItemClick(AdapterView<?> arg0, View view, int position, long arg3) X, Y两个listvie ...
- 用API中的raf复制文件图片等及系统找不到指定的文件的解决办法
该运行是在eclipse中进行的操作,小白的基础理解,如有不妥之处,请大佬们指正.QQ:1055802635 package raf; import java.io.IOException;impor ...
- js禁止滚动条滚动,并且滚动条不消失,页面大小不变
//禁止滚动条滚动 function unScroll() { var top = $(document).scrollTop(); $(document).on('scroll.unable',fu ...