暑假提高组集训Day1 T2
那么这一道题我在考试的时候写挂了(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的更多相关文章
- 暑假提高组集训Day1 T1
说实话,今天的题真的有点难! ~备受打击~ 我们先来看一看第一题吧 看起来好像不太简单,其实并不难 下面来提供两种方法吧 1.做法一 //签到题 /* 那么这一题就是告诉你n个点的坐标,把它们分别放到 ...
- 【NOIP2015提高组】 Day1 T2 信息传递
题目描述 有n个同学(编号为1到n)正在玩一个信息传递的游戏.在游戏里每人都有一个固定的信息传递对象,其中,编号为i的同学的信息传递对象是编号为Ti同学. 游戏开始时,每人都只知道自己的生日.之后每一 ...
- 国庆集训 Day1 T2 生成图 DP
国庆集训 Day1 T2 生成图 现在要生成一张\(n\)个点的有向图.要求满足: 1.若有 a->b的边,则有 b->a 的边 2.若有 a->b 的边和 b->c 的边,则 ...
- 【FZSZ2017暑假提高组Day1】华容道游戏
[问题描述] 华容道是一种有趣的滑块游戏,大概是下面这个样子的. 游戏局面由一个2*2的曹操滑块,五个2*1的蜀将滑块(横竖是不定的).四个1*1的小兵滑块以及两个空的位置构成,玩家需要利用空的位子移 ...
- 【FZSZ2017暑假提高组Day1】确定小组
[问题描述] 有n个人坐成一排,这n个人都在某一个小组中,同一个小组的所有人所坐的位置一定是连续的. 有一个记者在现场进行采访,他每次采访都会询问一个人其所在的小组有多少人,被询问的每个人都给出了正确 ...
- 【FZSZ2017暑假提高组Day1】最大矩形
[问题描述] 现在有n个宽度为1的矩形按如下图(左边的)所示的方式排在了一起: 用肉眼容易看出,在左图内部面积最大的矩形如右图绿色部分所标注. 现在我们考虑将其中一些宽度为1的矩形取出,按照原顺序再次 ...
- 【2020.11.28提高组模拟】T2 序列(array)
序列(array) 题目描述 给定一个长为 \(m\) 的序列 \(a\). 有一个长为 \(m\) 的序列 \(b\),需满足 \(0\leq b_i \leq n\),\(\sum_{i=1}^ ...
- 【NOIP2016提高组】 Day2 T2 蚯蚓
题目传送门:https://www.luogu.org/problemnew/show/P2827 自测时被题面所误导...,题面中说逢t的倍数才输出答案,以为有什么玄妙的方法直接将m次操作变成了m/ ...
- 【NOIP2015提高组】Day2 T2 子串
题目描述 有两个仅包含小写英文字母的字符串 A 和 B.现在要从字符串 A 中取出 k 个互不重叠的非空子串,然后把这 k 个子串按照其在字符串 A 中出现的顺序依次连接起来得到一 个新的字符串,请问 ...
随机推荐
- centos7.0 可以访问HTML文件,不能访问PHP文件,因为php-fpm没有扩展包
解决方法 :https://blog.csdn.net/ityang_/article/details/53980190 nginx调用PHP有sock方式和端口方式 1.确认nginx已经调用了ph ...
- C# 操作XML学习笔记
1. Customers.xml <?xml version="1.0" encoding="utf-8"?> <cust:customers ...
- cfp大纲
AFP基础知识 本章共14个考点,考试考15分左右. 本章重点: .职业道德准则 .家庭财务分析:净值的计算.储蓄的计算 .简单的财务比率分析 .金融理财和法律:企业组织形式.夫妻公共财产制度.财产分 ...
- JDK自带的native2ascii工具介绍
背景:在做Java开发的时候,常常会出现一些乱码,或者无法正确识别或读取的文件,比如常见的validator验证用的消息资源(properties)文件就需要进行Unicode重新编码.原因是java ...
- HTML常用布局
一般的局部布局无非采用如下的技术: 1)div + ul(ol)-li:用于分类导航或菜单等场合 2)div + dl-dt-dd:用于图文混编场合 3)table-tr-td:用于图 ...
- JS事件委托(代理)学习笔记
在开始之前我们先来熟悉一下HTML DOM addEventListener()方法,该方法用于向指定元素添加事件句柄.语法说明如下图所示: 主要想强调一下第三个参数useCapture,默认值为fa ...
- Linux 内核 动态设备
术语"热插拔"最普遍使用的意义产生于当讨论这样的事实时, 几乎所有的计算机系统现在 能够处理当系统有电时设备的出现或消失. 这非常不同于只是几年前的计算机系统, 那时 程序员知道他 ...
- Linux 内核设备驱动
设备模型跟踪所有对系统已知的驱动. 这个跟踪的主要原因是使驱动核心能匹配驱动和新 设备. 一旦驱动在系统中是已知的对象, 但是, 许多其他的事情变得有可能. 设备驱动可 输出和任何特定设备无关的信息和 ...
- Linux 内核硬件抽象
我们结束 PCI 的讨论, 通过快速看一下系统如何处理在市场上的多种 PCI 控制器. 这只 是一个信息性的小节, 打算来展示给好奇的读者, 内核的面向对象分布如何向下扩展到最 低层. 用来实现硬件抽 ...
- 2018-2-13-git-合并两个仓库
title author date CreateTime categories git 合并两个仓库 lindexi 2018-2-13 17:23:3 +0800 2018-2-13 17:23:3 ...