版权声明:沃斯里德小浩浩啊 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;
}