那么这一道题我在考试的时候写挂了(0分 呜呜~)

我原来的思路是广搜来骗取部分分(哈哈~)

但是我忘记了一个非常重要的问题

我广搜开的数组没有考虑负的下标

下一次考试如果再写暴力

就可以把坐标都加上一个数就行了~

那么这一道题 n<=10^6  每一个点的坐标在 ±10^18次方之间

那么这个数据范围就很尴尬了

广搜深搜。。。都肯定不行!

那么应该咋办呢??

我们来想一下

假如要从 (sx,sy) 走到 (ex,ey)

移动分为被动和主动

其实只要主动走的方向和被动走的方向是正好相反的

那么醉汉就待在原地不动了

也就是说

假如醉汉到家的最短时间是t

那么t+1他也同样能到家

t+2 t+3 t+4....只要醉汉想待下去,就可以一直待在原地

我们来看一个数轴

t往右的都可以往左的则不行

这就满足了可二分性

可以进行二分答案

10^18 二分也就最多30次

当然不超时咯,很快就会出答案

那么每一个时间怎么来判断它是不是成立呢

首先从起点到终点我们可以算一个曼哈顿距离

然后醉汉的移动是有周期的

比如SSZX

那么一个周期下来相当于向上移动了一格,向左移动了一格

t/n的就可以直接计算出来

t%n的就直接模拟一下就行了

二分答案在确定当前枚举的步数t是否成立时,可以先把原坐标被动移动后的新坐标求出来 然后再求曼哈顿距离,判断是否小于等于t

加油~

/*
那么这一道题我在考试的时候写挂了(0分 呜呜~) 我原来的思路是广搜来骗取部分分(哈哈~) 但是我忘记了一个非常重要的问题 我广搜开的数组没有考虑负的下标 下一次考试如果再写暴力 就可以把坐标都加上一个数就行了~ 那么这一道题 n<=10^6 每一个点的坐标在 ±10^18次方之间 那么这个数据范围就很尴尬了 广搜深搜。。。都肯定不行! 那么应该咋办呢?? 我们来想一下 假如要从 (sx,sy) 走到 (ex,ey) 移动分为被动和主动 其实只要主动走的方向和被动走的方向是正好相反的 那么醉汉就待在原地不动了 也就是说 假如醉汉到家的最短时间是t 那么t+1他也同样能到家 t+2 t+3 t+4....只要醉汉想待下去,就可以一直待在原地 我们来看一个数轴 t往右的都可以往左的则不行 这就满足了可二分性 可以进行二分答案 10^18 二分也就最多30次 当然不超时咯,很快就会出答案 那么每一个时间怎么来判断它是不是成立呢 首先从起点到终点我们可以算一个曼哈顿距离 然后醉汉的移动是有周期的 比如SSZX 那么一个周期下来相当于向上移动了一格,向左移动了一格 t/n的就可以直接计算出来 t%n的就直接模拟一下就行了 二分答案在确定当前枚举的步数t是否成立时,可以先把原坐标被动移动后的新坐标求出来 然后再求曼哈顿距离,判断是否小于t 加油~
*/
#include<bits/stdc++.h>
using namespace std;
string s;
int Movx,Movy;
long long sx,sy,ex,ey;
int n;
int check(long long t){
long long ans=;
long long X=sx,Y=sy;
X+=Movx*(t/n);
Y+=Movy*(t/n);
long long movx=,movy=;
int Left=t%n;
for(int i=;i<Left;i++){
if(s[i]=='S')
movy++;
if(s[i]=='X')
movy--;
if(s[i]=='Z')
movx--;
if(s[i]=='Y')
movx++;
}
X+=movx;
Y+=movy;
ans+=abs(ex-X);
ans+=abs(ey-Y);
if(ans<=t)
return ;
return ;
}
void Turning(){
for(int i=;i<n;i++){
if(s[i]=='S')
Movy++;
if(s[i]=='X')
Movy--;
if(s[i]=='Z')
Movx--;
if(s[i]=='Y')
Movx++;
} }
int main()
{
freopen("drunk.in","r",stdin);
freopen("drunk.out","w",stdout);
cin>>n;
cin>>s;
cin>>sx>>sy>>ex>>ey;
Turning();
long long l=,r=;
int flag=;
// cout<<check(9);
long long ans=;
while(l<=r){
long long mid=(l+r)/;
// cout<<l<<" "<<r<<" "<<mid<<endl;
if(check(mid)==){
flag=;
ans=mid;
r=mid-;
}
else
l=mid+;
}
if(flag==){
cout<<"Impossible";
return ;
}
cout<<ans; return ;
}

暑假提高组集训Day1 T2的更多相关文章

  1. 暑假提高组集训Day1 T1

    说实话,今天的题真的有点难! ~备受打击~ 我们先来看一看第一题吧 看起来好像不太简单,其实并不难 下面来提供两种方法吧 1.做法一 //签到题 /* 那么这一题就是告诉你n个点的坐标,把它们分别放到 ...

  2. 【NOIP2015提高组】 Day1 T2 信息传递

    题目描述 有n个同学(编号为1到n)正在玩一个信息传递的游戏.在游戏里每人都有一个固定的信息传递对象,其中,编号为i的同学的信息传递对象是编号为Ti同学. 游戏开始时,每人都只知道自己的生日.之后每一 ...

  3. 国庆集训 Day1 T2 生成图 DP

    国庆集训 Day1 T2 生成图 现在要生成一张\(n\)个点的有向图.要求满足: 1.若有 a->b的边,则有 b->a 的边 2.若有 a->b 的边和 b->c 的边,则 ...

  4. 【FZSZ2017暑假提高组Day1】华容道游戏

    [问题描述] 华容道是一种有趣的滑块游戏,大概是下面这个样子的. 游戏局面由一个2*2的曹操滑块,五个2*1的蜀将滑块(横竖是不定的).四个1*1的小兵滑块以及两个空的位置构成,玩家需要利用空的位子移 ...

  5. 【FZSZ2017暑假提高组Day1】确定小组

    [问题描述] 有n个人坐成一排,这n个人都在某一个小组中,同一个小组的所有人所坐的位置一定是连续的. 有一个记者在现场进行采访,他每次采访都会询问一个人其所在的小组有多少人,被询问的每个人都给出了正确 ...

  6. 【FZSZ2017暑假提高组Day1】最大矩形

    [问题描述] 现在有n个宽度为1的矩形按如下图(左边的)所示的方式排在了一起: 用肉眼容易看出,在左图内部面积最大的矩形如右图绿色部分所标注. 现在我们考虑将其中一些宽度为1的矩形取出,按照原顺序再次 ...

  7. 【2020.11.28提高组模拟】T2 序列(array)

    序列(array) 题目描述 ​给定一个长为 \(m\) 的序列 \(a\). 有一个长为 \(m\) 的序列 \(b\),需满足 \(0\leq b_i \leq n\),\(\sum_{i=1}^ ...

  8. 【NOIP2016提高组】 Day2 T2 蚯蚓

    题目传送门:https://www.luogu.org/problemnew/show/P2827 自测时被题面所误导...,题面中说逢t的倍数才输出答案,以为有什么玄妙的方法直接将m次操作变成了m/ ...

  9. 【NOIP2015提高组】Day2 T2 子串

    题目描述 有两个仅包含小写英文字母的字符串 A 和 B.现在要从字符串 A 中取出 k 个互不重叠的非空子串,然后把这 k 个子串按照其在字符串 A 中出现的顺序依次连接起来得到一 个新的字符串,请问 ...

随机推荐

  1. ElasticSearch从不懂到会用1—安装篇

    连续加班近一个多月,项目终于告一段落了,也腾出时间写一写项目中用到的东西.在这个项目中,我负责的主要是多种业务场景下的数据查询和搜索,其中搜索用到了ElasticSearch搜索引擎.下面主要围绕El ...

  2. FtpService [windows] 配置

    ---恢复内容开始--- 1. 启动FtpService 2. 增加ftp用户 1) 复制ftpd.bat,重命名为adduser.bat 2) 把set MAIN_CLASS=org.apache. ...

  3. H5 新增表单属性和事件

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  4. JavaMail转发邮件

    最近要做一个邮件转发功能,看了好多blog,都是接受邮件,再解析邮件内容,再组装成新的邮件发出! 我按照这个不够,不错!邮件发出去了.但是好麻烦啊,接受邮件是个Message,发送邮件也是个Messa ...

  5. 【js】 vue 2.5.1 源码学习(六) initProxy initLifeCycle 渲染函数的作用域代理

    大体思路 (五) 1. initProxy 渲染函数的作用域代理 ==> es6 如果支持proxy (hasProxy) 就用proxy 不支持就用 defineProperty() prox ...

  6. win10 uwp 使用 LayoutTransformer

    如果需要使用旋转,那么很容易把图片旋转的布局被裁剪.如果需要旋转的控件还在指定的 Grid 内,就需要使用布局的旋转.本文告诉大家如何使用 LayoutTransformer.需要知道,uwp是没有 ...

  7. HDU 5912 Fraction(模拟)

    Problem Description Mr. Frog recently studied how to add two fractions up, and he came up with an ev ...

  8. P1044 最大值最小化

    题目描述 在印刷术发明之前,复制一本书是一个很困难的工作,工作量很大,而且需要大家的积极配合来抄写一本书,团队合作能力很重要.当时都是通过招募抄写员来进行书本的录入和复制工作的, 假设现在要抄写 \( ...

  9. idea启用列模式的方式小结

    (1)alt+鼠标左键----实现的是几个连续列要向上或者向下拉,能够同时操作多行数据. (2)Shift+alt+鼠标左键----可以实现点选跨行的列模式同时操作,而且不通行可以点选不通列,进行跨行 ...

  10. 51nod 1832 前序后序遍历

    思路:设只有一颗子树的节点有ans个设前序边历数组为pre[100],后序遍历数组为pos[100]:前序遍历的第二个元素是A的一个子节点左右节点不知,设ax-ay表示一个树的前序遍历,bx-by表示 ...