【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能最终 ...
随机推荐
- Datatable 导出到execl 官网demo
<!DOCTYPE html> <html> <head> <meta http-equiv="Content-type" content ...
- 51nod1128 正整数分组V2
[题解] 二分一个最大值,check一下分出来的组数是否小于等于k即可. #include<cstdio> #include<algorithm> #define LL lon ...
- Python基础(八)装饰器
今天我们来介绍一下可以提升python代码逼格的东西——装饰器.在学习装饰器之前我们先来复习一下函数的几个小点,方便更好的理解装饰器的含义. 一.知识点复习 1, 在函数中f1和f1()有什么不同,f ...
- RequestMapping_Ant 路径
[使用@RequestMapping映射请求] [Ant风格资源地址支持3种匹配符] (1)? :匹配文件名中的一个字符. (2) * :匹配文件名中的任意字符. (3) ** :**匹配多层路径. ...
- Mysql 练习题 及 答案
--1.学生表 Student(S,Sname,Sage,Ssex) --S 学生编号,Sname 学生姓名,Sage 出生年月,Ssex 学生性别 --2.课程表 Course(C,Cname,T ...
- 【BZOJ4514】数字配对(费用流)
题意: 有 n 种数字,第 i 种数字是 ai.有 bi 个,权值是 ci. 若两个数字 ai.aj 满足,ai 是 aj 的倍数,且 ai/aj 是一个质数, 那么这两个数字可以配对,并获得 ci× ...
- E - Super Jumping! Jumping! Jumping! DP
Nowadays, a kind of chess game called “Super Jumping! Jumping! Jumping!” is very popular in HDU. May ...
- leetcode算法学习----155. 最小栈(MinStack )
下面题目是LeetCode算法155题: https://leetcode.com/problems/min-stack/ 题目1:最小函数min()栈 设计一个支持 push,pop,top 操作, ...
- 使用DBMS_REDEFINITION在线切换普通表到分区表
随着数据库数据量的不断增长,有些表须要由普通的堆表转换为分区表的模式.有几种不同的方法来对此进行操作.诸如导出表数据,然后创建分区表再导入数据到分区表.使用EXCHANGE PARTITION方式来转 ...
- C++学习之extern "C"
我们知道,extern关键字可以置于变量或者函数前,以标示变量或者函数的定义在别的文件中,提示编译器遇到此变量和函数时在其他模块中寻找其定义.这里起到的是声明作用范围的用处.另外,extern还可以与 ...