那么这一道题我在考试的时候写挂了(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. python基础七之集合

    集合:可变的数据类型,他里面的元素必须是不可变的数据类型,无序,不重复. 增加 set1 = {'zxc', 'zxf'} set1.add('zxv') # 无序添加 set1.update('zx ...

  2. P1095 水仙花数

    题目描述 春天是鲜花的季节,水仙花就是其中最迷人的代表,数学上有个水仙花数,他是这样定义的:"水仙花数"是指一个三位数,它的各位数字的立方和等于其本身,比如:153=1^3+5^3 ...

  3. 一眼看懂promise async的区别

    // promise方法 let p1 = new Promise((resolve,reject) => { setTimeout(() => { resolve('我是p1') },4 ...

  4. Linux 内核 usb_control_msg 接口

    usb_control_msg 函数就像 usb_bulk_msg 函数, 除了它允许一个驱动发送和结束 USB 控制信息: int usb_control_msg(struct usb_device ...

  5. JS 手札记

    addEventListener中的事件如果移除(removeEventListener)的话不能在事件中执行bind(this)否则会移除无效! // selectCurrent() // copy ...

  6. jq 技巧汇总

    1,jQuery方法$()实际上是拥有两个参数的 $('li','.firstEl').onclick(function(){.......})   这里,第二个参数用来限制第一个参数给定的查找结果 ...

  7. 【Kubernetes】架构全图

    K8s是什么 Kubernetes是Google开源的容器集群管理系统.它构建在Docker技术之上,为容器化的应用提供资源调度.部署运行.服务发现.扩容缩容等一整套功能. K8s能做什么 ①容器的自 ...

  8. Android生命周期函数执行顺序

    转载自:http://blog.csdn.net/intheair100/article/details/39061473 程序正常启动:onCreate()->onStart()->on ...

  9. Linux基础:认识Linux

    1.Linux操作系统的特点 优点 ​ (1)可靠性高:linux是基于Unix的概念开发出来的系统,拥有Unix的稳定且效率的特点.运行一年以上而不曾宕机.不必关机是很平常的事情 : ​ (2)彻底 ...

  10. 从头学pytorch(六):权重衰减

    深度学习中常常会存在过拟合现象,比如当训练数据过少时,训练得到的模型很可能在训练集上表现非常好,但是在测试集上表现不好. 应对过拟合,可以通过数据增强,增大训练集数量.我们这里先不介绍数据增强,先从模 ...