暑假提高组集训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 中出现的顺序依次连接起来得到一 个新的字符串,请问 ...
随机推荐
- tensorflow -gpu安装,史上最新最简单的途径(不用自己装cuda,cdnn)
tensorflow -gpu安装首先,安装Anoconda1. 官网下载点我: 2.安装 点击 python 3.6 version自动下载x64版,下载好之后,然后安装. 如图,打上勾之后,一路n ...
- Roslyn 静态分析
本文告诉大家如何使用 Roslyn 分析代码 首先创建一个项目,项目使用.net Framework 4.6.2 ,控制台项目.然后需要安装一些需要的库 Nuget 安装 打开 Nuget 安装下面两 ...
- element-ui—dialog使用过程中的坑
场景一:我们将dialog写成一个可复用的公共组件用于显示不同内容(如表格操作中的修改或添加的弹窗),之后发现dialog的遮罩将弹出层(点击修改或添加后理应由一个弹窗显示出来)都盖住了,而我想要的效 ...
- Linux 内核提交 urb
一旦 urb 被正确地创建,并且被 USB 驱动初始化, 它已准备好被提交给 USB 核心来发送 出到 USB 设备. 这通过调用函数 usb_submit_urb 实现: int usb_submi ...
- 初识Ubuntu 18.04(更换系统头像,截图,sy)
其实我认识ubuntu也有一段时间了,只是我一直沉迷Windows无法自拔,但是熟悉一下ubuntu的环境对于各项比赛以及今后的工作还是很有用处的,不过在未来的很长一段时间里,我只会以一个普通用户的身 ...
- RecursiveTask和RecursiveAction的使用总结
一:什么是Fork/Join框架 Fork/Join框架是Java7提供了的一个用于并行执行任务的框架, 是一个把大任务分割成若干个小任务,最终汇总每个小任务结果后得到大任务结果的框架.我们再通 ...
- python知识点总结02(不定时更新)
请用至少两种方式实现m与n值交换m=10,n=5 # 方式一 temp = 0 m = 10 n = 5 print(f'方式一交换前,m:{},n:{}') temp = m m = n n = t ...
- UNITY->(width*height)style Inventory
项目过后对项目功能进行记录,(width*height)风格背包实现细节,包含对物体的存放,装备,替换,对未知装备的鉴定,物体前缀的获取,项目类型为tcg+rpg,背包的作用主要为游戏中的物品的获取存 ...
- js对当前时间进行处理
//1.JS获取两个日期之间相差的天数 function getDaysBetween(dateString1, dateString2) { var startDate = Date.parse(d ...
- k8s集群---apiserver,controller-manager,scheduler部署
#证书自签名脚本 root@k8s-master: ~/k8s/k8s-cert :: $ cat k8s-cert.sh cat > ca-config.json <<EOF { ...