【2020.11.14提高组模拟】无尽之前 (game) 题解

有趣的题面

题目背景

雏见泽,一个和平的,或者说本应和平的小村庄,却因连续四年的怪死事件而蒙上了阴 影。

无一例外,每年的事件都发生在棉流祭当晚。一人死亡,一人失踪。是御社神的作祟, 还是另有隐情?人们这样议论着。

六月已至,一年一度的棉流祭之火又将重新燃起。平日里冷清的集市渐渐热闹起来,人 们的欢声笑语环绕着这个宁静的小村庄。而同时,在不知名的角落里,也有些许不安的种子 在无声的发芽。

蓝色长发的少女站在山巅上,冷冷地看着山下即将发生的一切。

“这次,又将是谁呢?”

身后的人影无声地点头。

问题描述

这是开始前的故事。

羽入和小梨花在 \(n ∗ m\) 的棋盘上下棋,其中行从 \(1\) 到 \(n\) 标号,列从 \(1\) 到 \(m\) 标号。

棋盘上有两种棋子:车和兵。车每次可以往四个方向走任意格,直到在某个空地停下或 者碰到一个兵把兵吃掉并停下来。兵每次可以往四个方向走一格,要求格子是空地或者是车, 如果是车则将车吃掉。

现在羽入控制车,梨花控制兵,车初始在 \((x1, y1)\),终点在 \((x2, y2)\),如果车走到了终点 (无论下一步是否存活)则羽入获胜,否则若车被吃了或者羽入在 \(10^{100000}\) 步内无法获胜则梨花获胜。双方每次只能移动自己的某一个棋子走一步(也可以选择不移动)。

棋盘初始只有一个车,梨花在开始前可以选择在任意非车位置(包括终点)放兵,接着羽入先手操作车,之后两人轮流操作。

因为羽入除了会啊呜啊呜以外还很聪明,所以梨花想知道自己需要放的最少兵的数量, 使得两人都按照最优策略进行时自己可以获胜,如果无解输出 \(−1\)。

题意简述

一人控制一个车,一人控制\(x\)个兵。控制车的人先走。给定棋盘大小\(n \times m\)、起点\((sx,sy)\)、终点\((ex,ey)\),问兵能不能阻止车走到终点,不能输出\(-1\),否则最小化\(x\)并输出。

吓人的数据范围

对于\(100\%\)的数据保证起点和终点不相同,\(n,m \le 300\),\(1\le x_1,x_2\le n\),\(1\le y_1,y_2\le m\)

数据点编号 \(n,m\le\)
\(1,2,3\) \(3\)
\(4,5,6\) \(50\)
\(7,8,9,10\) \(300\)

题目分析

看数据范围和题面中的\(10^{100000}\)会不会以为是个很难的东西?

其实(就是我太菜了),这题是一个模拟+分类讨论的思维题。我们可以从特殊到一般地讨论所有情况。

Subtask1

起点终点只差一步

那么兵无法摆在起点和终点之间,车可以一步到位,输出\(-1\)。

Subtask2

终点到所有边界的距离\(\le1\)。

只可能出现在\(\le3\times3\)的地图上,终点到四周的距离才可能都\(\le1\)。

只要放一个兵在终点,车不能走到兵的四个方向上,因此答案是\(1\)。

Subtask3

长度或宽度\(\le2\)

如果某一维\(=1\)就连放两个兵;

如果\(=2\)的话用两个兵把路堵死。

如果车把其中一个兵吃了,就会被另一个兵吃掉,因此答案是\(2\)。

Subtask3.5

长度或宽度\(=2\)且起点在终点九宫格的斜脚处

因为正常情况下车不可能进入九宫格的。

三个兵放在起点和终点围成的矩形内,答案为3。

只用两个兵的话车可以往后退,同时压住兵不能移动,然后就可以获胜了。

但是还是有特殊情况(特殊情况中的特殊情况了):(默认为\(2\)的是高度)若到左右两边某一边的距离为\(1\),车也是靠着那个角落的,则可以只用横放两个兵,答案为\(2\)。

Subtask4

终点到某个角落的切比雪夫距离\(\le1\)

切比雪夫距离指的是国际象棋中的国王从一个起点到终点需要走的步数。

容易推出,S到T的切比雪夫距离就是\(max(\Delta x,\Delta y)\)。

只要在终点放一个,与终点相连的靠近起点的位置上放一个,车转不过来,因此答案为\(2\)

Subtask4.5

起点和终点是对角线相邻的状态,类似于Subtask3.5。答案为3。

Subtask5

其他的所有情况

放三个在终点、终点的九宫格内

如图,假如白色九宫格中心是终点,那么对车的位置进行分类讨论。

无论车在哪种颜色中,兵都可以在相同或者更少的步数内走到安全的位置(保护中间的兵且如果车吃掉某个兵时会被另一个兵吃了)

Other Subtask

其实还是有一些没有考虑到的情况的。

\(n=m=3\),\(S\)=\((2,2)\),\(T\)在角落

答案为2,在两个对角各放一个。

......

也许还会有很多别的情况,以后想到再说吧。只有10个测试点没办法涵盖到所有情况的。

Code

#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<map>
#include<set>
#include<queue>
#include<vector>
#define IL inline
#define re register
#define LL long long
#define ULL unsigned long long
#define re register
#define debug printf("Now is %d\n",__LINE__);
using namespace std; template<class T>inline void read(T&x)
{
char ch=getchar();
while(!isdigit(ch))ch=getchar();
x=ch-'0';ch=getchar();
while(isdigit(ch)){x=x*10+ch-'0';ch=getchar();}
}
inline int read()
{
int x=0;
char ch=getchar();
while(!isdigit(ch))ch=getchar();
x=ch-'0';ch=getchar();
while(isdigit(ch)){x=x*10+ch-'0';ch=getchar();}
return x;
}
int G[55];
template<class T>inline void write(T x)
{
int g=0;
if(x<0) x=-x,putchar('-');
do{G[++g]=x%10;x/=10;}while(x);
for(re int i=g;i>=1;--i)putchar('0'+G[i]);putchar('\n');
}
int n,m,sx,sy,ex,ey,ans;
int main()
{
freopen("game.in","r",stdin);
freopen("game.out","w",stdout);
cin>>n>>m>>sx>>sy>>ex>>ey;
//Subtask1
if(abs(sx-ex)+abs(sy-ey)==1)
{
cout<<-1;
return 0;
}
//Subtask2
if(n<=3&&m<=3&&(ex-1<=1||n-ex<=1)&&(ey-1<=1||m-ey<=1))
{
cout<<1;
return 0;
}
//Subtask3
if(n<=2||m<=2)
{
//Subtask3.5
if((n==2||m==2)&&abs(sx-ex)*abs(sy-ey)==1)
{
if(m==2)
{
if((sx==1||sx==n)&&(ex==2||ex==n-1))
{
cout<<2;
return 0;
}
}
if(n==2)
{
if((sy==1||sy==n)&&(ey==2||ey==m-1))
{
cout<<2;
return 0;
}
}
cout<<3;
return 0;
}
cout<<2;
return 0;
}
//Subtask4
if(max(ex-1,ey-1)<=1||max(n-ex,m-ey)<=1||max(ex-1,m-ey)<=1||max(n-ex,ey-1)<=1)
{
//Subtask4.5
if(abs(sx-ex)*abs(sy-ey)==1) cout<<3;
else cout<<2;
return 0;
}
//Other Subtask
if(n==m&&m==3&&sy==sx&&sx==2&&(ex==1||ex==n)&&(ey==1||ey==m))
{
cout<<2;
return 0;
}
cout<<3;
return 0;
}

【2020.11.14提高组模拟】无尽之前 (game) 题解的更多相关文章

  1. 【2020.11.28提高组模拟】T1染色(color)

    [2020.11.28提高组模拟]T1染色(color) 题目 题目描述 给定 \(n\),你现在需要给整数 \(1\) 到 \(n\) 进行染色,使得对于所有的 \(1\leq i<j\leq ...

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

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

  3. 【2020.11.30提高组模拟】剪辣椒(chilli)

    剪辣椒(chilli) 题目描述 在花园里劳累了一上午之后,你决定用自己种的干辣椒奖励自己. 你有n个辣椒,这些辣椒用n-1条绳子连接在一起,任意两个辣椒通过用若干个绳子相连,即形成一棵树. 你决定分 ...

  4. 【2020.11.30提高组模拟】删边(delete)

    删边(delete) 题目 题目描述 给你一棵n个结点的树,每个结点有一个权值,删除一条边的费用为该边连接的两个子树中结点权值最大值之和.现要删除树中的所有边,删除边的顺序可以任意设定,请计算出所有方 ...

  5. JZOJ 【2020.11.30提高组模拟】剪辣椒(chilli)

    题目大意 给出一棵 \(n\) 个节点的树,删去其中两条边 使得分出的三个子树大小中最大与最小的差最小 分析 先一边 \(dfs\) 预处理出以 \(1\) 为根每个点的 \(size\) 然后按 \ ...

  6. JZOJ 6904. 【2020.11.28提高组模拟】T3 树上询问(query)

    题目 你有一棵 \(n\) 节点的树 ,回答 \(m\) 个询问,每次询问给你两个整数 \(l,r\) ,问存在多少个整数 \(k\) 使得从 \(l\) 沿着 \(l \to r\) 的简单路径走 ...

  7. 11.5NOIP2018提高组模拟题

    书信(letter) Description 有 n 个小朋友, 编号为 1 到 n, 他们每人写了一封信, 放到了一个信箱里, 接下来每个人从中抽取一封书信. 显然, 这样一共有 n!种拿到书信的情 ...

  8. 【2020.12.03提高组模拟】A组反思

    估计:40+10+0+0=50 实际:40+10+0+0=50 rank40 T1 赛时看到\(n,m\leq9\),我当机立断决定打表,暴力打了几个点之后发现在\(n\ne m\)且\(k\ne0\ ...

  9. 【2020.12.01提高组模拟】卡特兰数(catalan)

    题目 题目描述 今天,接触信息学不久的小\(A\)刚刚学习了卡特兰数. 卡特兰数的一个经典定义是,将\(n\)个数依次入栈,合法的出栈序列个数. 小\(A\)觉得这样的情况太平凡了.于是,他给出了\( ...

  10. 【2020.12.01提高组模拟】A组反思

    105,rk45 T1 赛时一开始先打了\(m=0\)的情况,也就是普通的卡特兰数,然后打了暴力,样例过了,把样例改改就不行了,原因没有保证是枚举的是合法的出栈序列 得分:\(WA\&TLE1 ...

随机推荐

  1. go generate

    介绍 go generate 命令是go 1.4版本里面新添加的一个命令,当运行 go generate 时,它将扫描与当前包相关的源代码文件,找出所有包含 //go:generate 的特殊注释,提 ...

  2. Golang 入门 : 浮点数

    浮点数介绍 Go语言提供了两种精度的浮点数:float32 和 float64.它们的算术规范由IEEE754浮点数国际标准定义,该浮点数规范被所有现代的CPU支持. 这些浮点数类型的范围可以从很微小 ...

  3. mongodb 数据库操作——备份 还原 导出 导入

    mongodump备份数据库 命令格式 mongodump -h IP --port 端口 -u 用户名 -p 密码 -d 数据库 -o 文件存在路径 如果没有用户,可以去掉-u和-p. 如果导出本机 ...

  4. 网站支持https之一:https原理和SSL证书类型

    1 https原理 https加密请求过程 Client和Server之间会进行一下几个步骤的交互: ① Client发送https请求: ② Client和Server通过tcp的三次握手建立连接, ...

  5. Vim 操作-替换

    Vim 操作-替换 substitute :[range]s[ubstitute]/{pattern}/{string}/{flag} 替换的操作范围以行为基础: %-全局范围,m,n-使用逗号隔开的 ...

  6. 【Linux】远程连接Linux虚拟机(MobaXterm)

    [Linux]远程连接Linux虚拟机(MobaXterm) 零.原因 有时候我们在虚拟机中操作Linux不太方便,比如不能复制粘贴,不能传文件等等,我们在主机上使用远程连接软件远程连接Linux虚拟 ...

  7. 【数据结构与算法】第K大的元素:三路快速排序算法思路

    第K大的元素:三路快速排序算法思路 Java https://leetcode-cn.com/problems/kth-largest-element-in-an-array/solution/di- ...

  8. GitLab 服务器宕机时的项目代码恢复方法

    重要前提:GitLab 数据挂载盘必须能够正常读取,且 /var/opt/gitlab/git-data/repositories 目录下的数据可以完整拷贝. 当 GitLab 服务器意外宕机且没有备 ...

  9. 《PDPU: An Open-Source Posit Dot-Product Unit for Deep Learning Applications》(三)

    Supporting suitable alignment width: In several designs [8] [19], quire [33] format is adopted to re ...

  10. 聊聊四种实时通信技术:长轮询、短轮询、WebSocket 和 SSE

    这篇文章,我们聊聊 四种实时通信技术:短轮询.长轮询.WebSocket 和 SSE . 1 短轮询 浏览器 定时(如每秒)向服务器发送 HTTP 请求,服务器立即返回当前数据(无论是否有更新). 优 ...