Gym - 101612I- Intelligence in Perpendicularia (思路)

版权声明:沃斯里德小浩浩啊 https://blog.csdn.net/Healer66/article/details/82766716

链接:

https://odzkskevi.qnssl.com/76ee6a37a5e7b6e0a1da0f46372ab4da?v=1536788434

题意:

给出点,能练成密闭图形,问从外部看,看不到的长度共有多少。

思路:

所求=总长度—最外部矩形长度

(桑老师代码就是好看)

#include <iostream>
#include <cstdio>
#include <cstring>
#include <set>
using namespace std;
typedef long long ll;
const int maxn = 3e6+10;
int x[maxn],y[maxn];

int main()
{
    freopen("intel.in","r",stdin);
    freopen("intel.out","w",stdout);
    int n;
    scanf("%d",&n);
    int MAXX = -1e9,MINX = 1e9,MAXY = -1e9,MINY = 1e9;
    for(int i = 0; i<n; i++)
    {
        scanf("%d%d",&x[i],&y[i]);
        MAXX = max(MAXX, x[i]);
        MINX = min(MINX, x[i]);
        MAXY = max(MAXY, y[i]);
        MINY = min(MINY, y[i]);
    }
    ll sumlen = 0;
    for(int i = 1; i<n; i++)           //连接n-1条边
    {
        if(x[i]==x[i-1])
        {
            int mmax = max(y[i],y[i-1]);
            int mmin = min(y[i],y[i-1]);
            sumlen += (ll)mmax-mmin;
        }
        else
        {
            int mmax = max(x[i],x[i-1]);
            int mmin = min(x[i],x[i-1]);
            sumlen += (ll)mmax-mmin;
        }
    }
    if(x[0] == x[n-1])                     //最后一条边可能水平,也可能竖直
    {
        int mmax = max(y[0],y[n-1]);
        int mmin = min(y[0],y[n-1]);
        sumlen += (ll)mmax-mmin;
    }
    else if(y[0] == y[n-1])
    {
        int mmax = max(x[0],x[n-1]);
        int mmin = min(x[0],x[n-1]);
        sumlen += (ll)mmax-mmin;
    }
    printf("%lld\n",sumlen-(MAXX-MINX)*2-(MAXY-MINY)*2);
    return 0;
}

猜你喜欢

转载自blog.csdn.net/Healer66/article/details/82766716