20180520模拟赛T3——chess
【问题描述】
小美很喜欢下象棋。
而且她特别喜欢象棋中的马。
她觉得马的跳跃方式很独特。(以日字格的方式跳跃)
小芳给了小美一张很大的棋盘,这个棋盘是一个无穷的笛卡尔坐标。
一开始\(time=0\)的时候,马在原点。每个时刻马都跳一步。
可是这个坐标图有点残缺,有几个点是不能跳到的。
然后小美很好奇在\(time=[0,K]\)中,马能跳到多少个不同的格子。
【输入格式】
从文件chess.in中读入数据。
第一行两个数K,n表示时间上限和残缺的点的数量。
接下来n行,每行一个坐标 xi,yi 表示一个残缺点的坐标。
【输出格式】
输出到文件chess.out中。
第一行输出一个数字表示答案。由于这个数字会很大,你需要输出他模 1000000007 。
【样例输入】
1 0
【样例输出】
9
【样例输入】
2 7
-1 2
1 2
2 1
2 -1
1 -2
-1 -2
-2 -1
【样例输出】
9
【数据规模】
对于\(30\%\)的数据\(K\le 500\)。
对于\(100\%\)的数据\(0\le K \le 10^{18}, 0\le n\le 440, |xi|\le10, |yi|\le 10\)。
【来源】
题解
一道神奇的乱搞题。
首先,对于一个oier,最基本的技能是暴力,于是我们先用bfs打一个暴力(代码下面会有)。
于是就拿到了37分的好成绩。
但是除了大暴力,我们似乎并没有什么路可走——因为情况非常复杂。
那么这题为什么这么复杂?
因为有这句话:可是这个坐标图有点残缺,有几个点是不能跳到的。
于是我们想到简化:那这句话不在会怎么样?
我们发现一时找不出规律,但我们可以打张表。
#include <cstdio>
#include <queue>
using namespace std;
int mp[2003][2003];
int ans[6000];//ans[i]:第i步所到新到达的地方
int dirx[] = {1, 1, -1, -1, 2, 2, -2, -2};
int diry[] = {2, -2, 2, -2, 1, -1, 1, -1};
struct sxd
{
int x, y;
};
queue<sxd> Q;
int n;
long long k;
long long cnt;
inline void bfs(int x, int y)
{
mp[x][y] = 1;
Q.push((sxd){x, y});
while(!Q.empty())
{
sxd tmp = Q.front();
Q.pop();
ans[mp[tmp.x][tmp.y]]++;
if(mp[tmp.x][tmp.y] > 70)
break;
for(int i = 0; i < 8; ++i)
{
int tx = tmp.x + dirx[i];
int ty = tmp.y + diry[i];
if(mp[tx][ty]) continue;
mp[tx][ty] = mp[tmp.x][tmp.y] + 1;
Q.push((sxd){tx, ty});
}
}
}
int main()
{
bfs(1001, 1001);
for(int i = 1; i <= 60; ++i)
printf("%d,", ans[i]);
return 0;
}
运行结果:
1,8,32,68,96,120,148,176,204,232,260,288,316,344,372,400,428,456,484,512,540,568,596,624,652,680,708,736,764,792,820,848,876,904,932,960,988,1016,1044,1072,1100,1128,1156,1184,1212,1240,1268,1296,1324,1352,1380,1408,1436,1464,1492,1520,1548,1576,1604,1632,
发现了什么?(并没有发现什么)到了后面项,该数列竟趋向于一个等差数列!
把printf("%d,", ans[i]);改成printf("%d,", ans[i+1]-ans[i]);会更清晰:
7,24,36,28,24,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,
然后我们就可以大胆猜想了……
我们发现数据规模中\(|xi|, |yi|\)的值很小,是不是这样就不怎么会影响等差数列的波动幅度?
于是我们需要验证一下
//前面只是把if(mp[tmp.x][tmp.y] > 70)改成了if(mp[tmp.x][tmp.y] > 200)
int main()
{
bfs(1001, 1001);
cin >> n;
for(int i = 1, x, y; i <= n; ++i)
{
cin >> x >> y;
x += 1001;
y += 1001;
mp[x][y] = 1;//这样做还是挺妙的,把残缺坐标直接看成已访问
}
for(int i = 1; i <= 150; ++i)//输出多一些,让结论更可信
printf("%d,", ans[i+1] - ans[i]);
return 0;
}
随便造组数据验证一下:
8
2 3
1 2
2 1
5 6
-1 -2
-2 -1
-3 -4
-3 -2
输出
7,24,36,28,24,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,
经过多次验证,我们就可以很方便地想到正解:先暴力搜索几步(似乎都是选择500步的),然后用等差数列直接求出答案。
于是代码如下
//前面的bfs都差不多,就在写一遍了。
signed main()
{
fin >> k >> n;//由于当时是模拟赛所以用了文件流
for(int i = 1, x, y; i <= n; ++i)
{
fin >> x >> y;
x += 1001;
y += 1001;
mp[x][y] = 1;
}
bfs(1001, 1001);
if(k < 500)
{
for(int i = 1; i <= k+1; ++i)
cnt = (cnt+ans[i])%mod;
fout << cnt << endl;
}
else
{
long long inc = ans[500] - ans[499];//等差数列的公差
k -= 498;
k %= mod;
for(int i = 0; i <= 499; ++i)
cnt = (cnt+ans[i])%mod;
fout << (((k*ans[500]%mod+cnt)%mod+(k*(k-1)>>1)%mod*inc%mod)%mod+mod)%mod << endl;
}
return 0;
}
最后,恭喜你打出了一道tourist当场也没打出来的题。
20180520模拟赛T3——chess的更多相关文章
- 体育成绩统计——20180801模拟赛T3
体育成绩统计 / Score 题目描述 正所谓“无体育,不清华”.为了更好地督促同学们进行体育锻炼,更加科学地对同学们进行评价,五道口体校的老师们在体育成绩的考核上可谓是煞费苦心.然而每到学期期末时, ...
- 20161005 NOIP 模拟赛 T3 解题报告
subset 3.1 题目描述 一开始你有一个空集,集合可以出现重复元素,然后有 Q 个操作 1. add s 在集合中加入数字 s. 2. del s 在集合中删除数字 s.保证 s 存在 3. c ...
- ztz11的noip模拟赛T3:评分系统
代码: #include<iostream> #include<cstdio> #include<cstring> #include<algorithm> ...
- 20180711模拟赛T3——聚变
文件名: fusion 题目类型: 传统题 时间限制: 3秒 内存限制: 256MB 编译优化: 无 题目描述 知名科学家小A在2118年在计算机上实现了模拟聚变的过程. 我们将她研究的过程简化. 核 ...
- 4.26 省选模拟赛 T3 状压dp 差分求答案
LINK:T3 比较好的题目 考试的时候被毒瘤的T2给搞的心态爆炸 这道题连正解的思路都没有想到. 一看到题求删除点的最少个 可以使得不连通. 瞬间想到最小割 发现对于10分直接跑最小割即可. 不过想 ...
- NOIP欢乐模拟赛 T3 解题报告
3.小澳的葫芦 (calabash.cpp/c/pas) [题目描述] 小澳最喜欢的歌曲就是<葫芦娃>. 一日表演唱歌,他尽了洪荒之力,唱响心中圣歌. 随之,小澳进入了葫芦世界. 葫芦世界 ...
- 字符串模拟赛T3
只看我的做法就够了 #include<iostream> #include<cstdio> #include<string> #include<cstring ...
- 神奇的NOIP模拟赛 T3 LGTB 玩THD
LGTB 玩THD LGTB 最近在玩一个类似DOTA 的游戏名叫THD有一天他在守一座塔,对面的N 个小兵排成一列从近到远站在塔前面每个小兵有一定的血量hi,杀死后有一定的金钱gi每一秒,他都可以攻 ...
- [模拟赛] T3 Exploit
Description 4X概念体系,是指在PC战略游戏中一种相当普及和成熟的系统概念,得名自4个同样以"EX"为开头的英语单词. eXplore(探索) eXpand(拓张与发展 ...
随机推荐
- day60——单表操作补充(批量插入、查询、表结构)
day60 批量插入(bulk_create) # bulk_create obj_list = [] for i in range(20): obj = models.Book( title=f'金 ...
- 【题解】Luogu P5468 [NOI2019]回家路线
原题传送门 前置芝士:斜率优化 不会的可以去杜神博客学 这道题我考场上只会拆点跑最短路的70pts做法 后来回家后发现错误的爆搜都能拿满分(刀片) 还有很多人\(O(mt)\)过的,还是要坚持写正解好 ...
- ES7.3.0配置邮件告警
情况说明: 三台es组成集群,一台kibana,版本均为7.3.0 es版本要求是白金版,基础版的不行,不过可以试用30天的白金版 步骤:先说我自己走通的流程,然后介绍官方说明 1.因为我这边使用的是 ...
- 在配置和销售凭证 GET_CONFIG_MODE 间通信时内部出错
“在配置和销售凭证 GET_CONFIG_MODE 间通信时内部出错” 订单打开出现这种错误提示,多半是配置对象号问题. SAP NOTE 2019-09-27 901893901893 - Repo ...
- Entity Framework Core今日所得:避免 IEnumerable 以及 IQueryable 陷阱
避免 IEnumerable 以及 IQueryable 陷阱: IEnumerable示用Linq会先去数据库查询所有记录,然后再条件查询. IQueryable接口派生自IEnumerable,但 ...
- windows中Crontab的使用
一.jdk的安装 安装地址ttps://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html 二 . ...
- python3 marshmallow学习
python3 marshmallow学习 官方文档:https://marshmallow.readthedocs.io/en/stable/ 安装: pip install -U marshmal ...
- Mysql之视图和事务(五)
一:视图 1.问题 对于复杂的查询,往往是有多个数据表进行关联查询而得到,如果数据库因为需求等原因发生了改变,为了保证查询出来的数据与之前相同,则需要在多个地方进行修改,维护起来非常麻烦 解决办法:定 ...
- Java自学-日期 Calendar
Java的Calendar类 Calendar类即日历类,常用于进行"翻日历",比如下个月的今天是哪天 示例 1 : Calendar与Date进行转换 采用单例模式获取日历对象C ...
- 树莓派Raspbian系统密码
树莓派Raspbian系统密码 树莓派Raspbian系统默认登录用户名为pi,该账户默认密码是raspberry(可在raspi-config中修改). 树莓派的Raspbian系统root用户默认 ...