CF1030B 题解

· · 题解

先求出此图形四条边的函数解析式。

因为四边都是直线,所以解析式都是一次函数,按照求一次函数解析式的方法做就行了。

如图,设四边形的四个顶点分别为 ABCD,四条边的分别对应一次函数 AD=f(x)DC=g(x)CB=h(x)AB=i(x)

根据公式,斜率 k=\dfrac{y_{1}-y_{2}}{x_{1}-x_{2}},截距 b=y-kx 可得:

\begin{aligned} &f(x)=x+d\\ &g(x)=-x+2n-d\\ &h(x)=x-d\\ &i(x)=-x+d\\ \end{aligned}

如果一个点 P(x_{0},y_{0}) 要在这个四边形内部,那么:

\begin{cases} y_0\le f(x_0)\\ y_0\le g(x_0)\\ y_0\ge h(x_0)\\ y_0\ge i(x_0)\\ \end{cases}

稍微变换一下,可以得到:

\begin{cases} x_0 - y_0\le d\\ x_0 + y_0\le 2n-d\\ x_0 - y_0\ge -d\\ x_0 + y_0\ge d\\ \end{cases}

总之,只要这个点的坐标满足上述四个不等式,那么这个点就在四边形里。

Code

#include <bits/stdc++.h>
using namespace std;
int n, d, x, y, k;
int main() {
    cin >> n >> d >> k;
    while (k--) {
        cin >> x >> y;
        if (x + y >= d && 
            x + y <= 2 * n - d && 
            x - y >= -d && 
            x - y <= d) cout << "YES\n";
        else cout << "NO\n";
    }
    return 0;
}