题目链接:https://hpuoj.com/contest/23/problem/D/

题意:

给出四个点组成的矩形,在给出很多点,问有多少个点在矩形内(边上也算)

分析:

这题,唉,一言难尽。首先看到题,然后看到了四个点 (0,a),(a,0),(n,n−a),(n−a,n),然后就随便在纸上画了一下,我以为是这样的?

其实,它是这样的

因为错误的想法,我先考虑斜率,有考虑点到支线的距离,结果已知错错错

正解是求出四条直线的直线方程,然后把点带入直线,然后比较实际的y值与带入直线求出的y值即可。

#include <bits/stdc++.h>

using namespace std;
const int N = 1010;

typedef pair<int, int> P;
vector<P> v1, v2;

bool cmp(P p1, P p2)
{
    if(p1.first == p2.first)
        return p1.second > p2.second;
    return p1.first > p2.first;
}

 double ffabs(double num)   // 自己定义返回double类型的绝对值函数
 {
    if(num < 0)
        return -num;
    return num;
 }

int main()
{
    int n, a;
    while(scanf("%d %d", &n, &a) != EOF)
    {
        v1.clear();
        v2.clear();
        int m;
        int x, y;
        scanf("%d", &m);
        for(int i=0; i<m; i++)
        {
            scanf("%d %d", &x, &y);
            v1.push_back(P(x, y));
        }

        // double d1 = sqrt(pow(1.0 * (n-a), 2) + pow(1.0 * (n-a), 2));
        // double d2 = sqrt(pow(1.0 * a, 2) + pow(1.0 * a, 2));
        // printf("d1 = %lf  d2 = %lf\n", d1, d2);

        for(int i=0; i<m; i++)
        {
            // double dis1 = ffabs(1.0 * v1[i].first - v1[i].second - a) / sqrt(2.0);
            // double dis2 = ffabs(1.0 * v1[i].first + v1[i].second - 2*n + a) / sqrt(2.0);
            // double dis3 = ffabs(1.0 * v1[i].first - v1[i].second + a) / sqrt(2.0);
            // double dis4 = ffabs(1.0 * v1[i].first + v1[i].second - a) / sqrt(2.0);
            // if(dis1 + dis3 <= d2 && dis2 + dis4 <= d1)
            // {
            //     v2.push_back(v1[i]);
            // }

            if(v1[i].second >= v1[i].first - a && v1[i].second <= -v1[i].first + 2*n - a && v1[i].second <= v1[i].first + a && v1[i].second >= -v1[i].first + a)
            {
                v2.push_back(v1[i]);
            }

        }

        sort(v2.begin(), v2.end(), cmp);
        if(v2.empty())
            printf("-1\n");
        else
        {
            printf("%d\n", v2.size());
            int len = v2.size();
            for(int i=0; i<len; i++)
            {
                printf("%d %d\n", v2[i].first, v2[i].second);
            }
        }
        

    }


    return 0;
}