P10735 [NOISG 2019 Prelim] Square or Rectangle?

题目背景

翻译自 [NOISG2019 Prelim D.Square or Rectangle?](https://github.com/noisg/sg_noi_archive/blob/master/2019_prelim/)。 请注意,本题为**交互题**,请**尽量使用 C++ 进行作答**。同时,你**只需要实现题目中要求的函数**。**不要将答案输出在标准输出。** 对于非 C++ 语言的选手,本题有 IO 交互版:,可在此进行评测。

题目描述

现在有一个 $N\times N$ 的网格,网格内**有一个至少占网格总大小 $4\%$ 的矩形**。但是,你现在不知道这个矩形是长方形还是正方形,你需要**定义一个函数**来完成这个问题。 ### 【实现细节】 你需要定义以下函数: `bool am_i_square(int N, int Q)` - $N$:网格的大小 - $Q$:能询问评测机的次数。 为了确定形状,你可以向评测机至多调用 $Q$ 次 `bool inside_shape(int X, int Y)` 函数。调用这个来询问评测机方格 $(X,Y)$ 是否在这个矩形中。 一旦你确定了形状,你就可以返回一个 `bool` 类型的量,代表这个矩形是否为**正方形**。 评测机会调用你的函数 $T$ 次。$T$ 的大小见【数据范围与评测方法】。

输入格式

见【实现细节】。

输出格式

见【实现细节】。

说明/提示

### 【样例】 考虑以下调用: ![](https://cdn.luogu.com.cn/upload/image_hosting/so2eprl8.png) `am_i_square(5, 25)` 这表示这是一个 $5 \times 5$ 大小的网格,你可以调用至多 $25$ 次。 `inside_shape(3, 3) = true` 这询问了方格 $(3,3)$ 是否在矩形内,它在正方形的正中间,所以返回 `true`。 `inside_shape(5, 4) = false` 这询问了方格 $(5,4)$ 是否在矩形内,它不在正方形内,所以返回 `false`。 `inside_shape(1, 1) = false` 这询问了方格 $(1,1)$ 是否在矩形内,它不在正方形内,所以返回 `false`。 `inside_shape(2, 4) = true` 这询问了方格 $(2,4)$ 是否在矩形内,它在正方形的左下角,所以返回 `true`。 综上,我们可以确定这是一个正方形,所以该函数返回 `true`。 ### 【数据范围与评测方法】 对于 $100\%$ 的测试点:$N=100,1\leq T \leq 1000$。 | $\text{Subtask}$ | 分值 | 附加条件 | | :----------: | :----------: | :----------: | | $0$ | $14$ | $Q=10^4$ | | $1$ | $19$ | $Q=100$ | | $2$ | $18$ | $Q=40$,图形至少占网格总大小的 $25\%$ | | $3$ | $49$ | $Q=50$,得分见下文 | ### 【Subtask 3 的计分方法】 记你在所有调用中最大使用了 $q$ 次询问。 - 若 $q >50$,你得到 $0$ 分。 - 若 $34 \leq q \leq 50$,你得到 $40-30\times \frac{q-34}{17}$ 的分数。 - 若 $q \leq 33$,你得到满分。 ### 【提示】 请在你的函数前加上以下内容: ```cpp #include using namespace std; extern "C" bool inside_shape(int x,int y); ``` 同时,请在你的 `bool am_i_square(int N, int Q)` 前加上`extern "C" `。