题目:

Codeforces1117C

考的时候很困,开局半小时后才过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(构造)的更多相关文章

  1. 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 ...

  2. C. Magic Ship cf 二分

    C. Magic Ship time limit per test 2 seconds memory limit per test 256 megabytes input standard input ...

  3. CF1117C Magic Ship

    CF1117C Magic Ship 考虑到答案具单调性(若第 \(i\) 天能到达目的点,第 \(i+1\) 天只需向风向相反的方向航行),可以二分答案. 现在要考虑给出一个天数 \(m\) ,问 ...

  4. 题解-Magic Ship

    Magic Ship 你在 \((x_1,y_1)\),要到点 \((x_2,y_2)\).风向周期为 \(n\),一个字符串 \(s\{n\}\) 表示风向(每轮上下左右),每轮你都会被风向吹走一格 ...

  5. C. Magic Grid 构造矩阵

    C. Magic Grid time limit per test 1 second memory limit per test 256 megabytes input standard input ...

  6. 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 ...

  7. CodeForces 1117C Magic Ship (循环节+二分答案)

    <题目链接> 题目大意: 给定起点和终点,某艘船想从起点走到终点,但是海面上会周期性的刮风,船在任何时候都能够向四个方向走,或者选择不走,船的真正行走路线是船的行走和风的走向叠加的,求船从 ...

  8. C. Magic Ship (思维+二分)

    https://codeforces.com/contest/1117/problem/C 你是一个船长.最初你在点 (x1,y1) (显然,大海上的所有点都可以用平面直角坐标描述),你想去点 (x2 ...

  9. 【Codeforces 1117C】Magic Ship

    [链接] 我是链接,点我呀:) [题意] 题意 [题解] 我们可以把这个行船的过程分解成两个过程 1.船经过时间t被风吹到了某个地方 2.船用这t时间尝试到达终点(x2,y2) 会发现如果时间t能最终 ...

随机推荐

  1. Servlet监听器的使用

    Servlet监听器的使用 制作人:全心全意 在Servlet技术中已经定义了一些事件,并且可以针对这些事件来编写相关的事件监听器,从而对事件做出相应的处理.例如,想要在Web应用程序启动和关闭时来执 ...

  2. redis+php+mysql处理高并发实例

    一.实验环境ubuntu.php.apache或nginx.mysql二.利用Redis锁解决高并发问题,需求现在有一个接口可能会出现并发量比较大的情况,这个接口使用php写的,做的功能是接收 用户的 ...

  3. Java 字符串总结

    三种字符串类:String,StringBuilder,StringBuffer String类 1. 常用构造器 构造器   public String(char value[])   public ...

  4. 【Codeforces 339C】Xenia and Weights

    [链接] 我是链接,点我呀:) [题意] 在天平上放砝码 你要在左边放一下然后到右边放一下 一直重复这样放m次 每次你放在其中一边都要让另外一边的重量比你少 你可以用1~10中的某些砝码 问你要怎样放 ...

  5. print pdf bug & DOCTYPE

    print pdf bug & DOCTYPE OK with <!DOCTYPE html> <!DOCTYPE html> <html lang=" ...

  6. Eclipse不编译解决方案

    原文链接:http://blog.csdn.net/huahuagongzi99999/article/details/7719882    转来自己用 这两天Eclipse 不编译了,无论怎么更改保 ...

  7. hdu 1527威佐夫博弈

    //http://www.cnblogs.com/bo-tao/archive/2012/04/16/2452633.html #include<stdio.h> #include< ...

  8. Yet another Number Sequence 矩阵快速幂

    Let’s define another number sequence, given by the following function: f(0) = a f(1) = b f(n) = f(n ...

  9. POJ——1061 青蛙的约会

    青蛙的约会 Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 117858   Accepted: 24599 Descript ...

  10. Angularjs中比较实用的DateFormat库

    angular.module('newApp') .factory('dateUtil', function() { var symbolMap = { 'MM': function(date) { ...