随笔 - 18  文章 - 0  评论 - 2  阅读 - 411

IOI 2007 Aliens

今天开始做IOI的学习笔记, 就从我出生的年份开始吧

IOI 2007 Aliens:

给你三个整数 N, X, Y 表示网格有N * N大, 而 (X,Y)是黑色的图

那个图是这样的:

复制代码
#.#.#

.#.#.

#.#.#

.#.#.

#.#.#
复制代码

 

#表示黑色  .表示白色

而整个N*N的网格只有一个这样的图形, 每个箱子有一个偶数 M 为长度和宽度

 

询问: 问(x,y) 是不是黑色的

300次询问内寻找到中间点

 

很容易看出来是二分吧? (一看题目就感觉到了)

先考虑往右边边走:一开始为(x,y)

如果说现在的步数为 L, 那么如果下一个 2*L不是黑色的了就代表说我们的边界点必须在[L,2*L)

那么就代表我们可以倍增法找到第一个 L是黑色 2*L是白色的

为什么我们可以保证这样不会询问到下一个格子呢

如果说 x+L 是黑的,代表(x+L) 还是在格子里, 证明 L<M, 同时去下一个格子最少需要 M+1,因此 x+2*L不可能到达下一个格子

 

OK, 所以我们找出来我们的四个边界点了

因此我们的四个角落以及中间点也找出来了

 

接下来就询问四个方向有多少个格子

然后做一点暴力。 答案就出来了。

 

需要注意的东西:

1. examine必须要写到下一行 & fflush(stdout)

2. 如果我现在x+1就是白的了要特判

评价: erm 难度适中但是打出来代码很幸苦

 

具体代码的submission:

https://oj.uz/submission/867633

抱歉没有注释但是我觉得我的代码不会丑, 应该能读懂

posted on   yl_neo  阅读(14)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 因为Apifox不支持离线,我果断选择了Apipost!
· 通过 API 将Deepseek响应流式内容输出到前端
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

点击右上角即可分享
微信分享提示