http://codeforces.com/contest/1216/problem/C
多校做过类似的题,当时队友直接离散化然后dfs过了。
于是这题也直接离散化for循环覆盖就行了
注意由于露在外面的可能不是整点,所以所有坐标要*2,再去吧x+1,x,x-1,y+1,y,y-1丢进离散化数组
#include<bits/stdc++.h>
#define maxl 300010
using namespace std;
int n,m,ans,cntx,cnty,totx,toty;
int x[7],y[7];
int numx[200],numy[200];
int a[200][200];
char s[maxl];
inline void prework()
{
for(int i=1;i<=6;i++)
{
scanf("%d%d",&x[i],&y[i]);
x[i]*=2;y[i]*=2;
numx[++cntx]=x[i];
numx[++cntx]=x[i]-1;
numx[++cntx]=x[i]+1;
numy[++cnty]=y[i];
numy[++cnty]=y[i]-1;
numy[++cnty]=y[i]+1;
}
sort(numx+1,numx+1+cntx);
sort(numy+1,numy+1+cnty);
totx=unique(numx+1,numx+1+cntx)-numx-1;
toty=unique(numy+1,numy+1+cnty)-numy-1;
}
inline void mainwork()
{
int x1,x2,y1,y2;
x1=lower_bound(numx+1,numx+1+totx,x[3])-numx;
x2=lower_bound(numx+1,numx+1+totx,x[4])-numx;
y1=lower_bound(numy+1,numy+1+toty,y[3])-numy;
y2=lower_bound(numy+1,numy+1+toty,y[4])-numy;
for(int i=x1;i<=x2;i++)
for(int j=y1;j<=y2;j++)
a[i][j]=1;
x1=lower_bound(numx+1,numx+1+totx,x[5])-numx;
x2=lower_bound(numx+1,numx+1+totx,x[6])-numx;
y1=lower_bound(numy+1,numy+1+toty,y[5])-numy;
y2=lower_bound(numy+1,numy+1+toty,y[6])-numy;
for(int i=x1;i<=x2;i++)
for(int j=y1;j<=y2;j++)
a[i][j]=1;
ans=0;
x1=lower_bound(numx+1,numx+1+totx,x[1])-numx;
x2=lower_bound(numx+1,numx+1+totx,x[2])-numx;
y1=lower_bound(numy+1,numy+1+toty,y[1])-numy;
y2=lower_bound(numy+1,numy+1+toty,y[2])-numy;
for(int i=x1;i<=x2;i++)
for(int j=y1;j<=y2;j++)
if(a[i][j]==0)
ans=1;
}
inline void print()
{
if(ans>0)
puts("YES");
else
puts("NO");
}
int main()
{
int t=1;
//scanf("%d",&t);
for(int i=1;i<=t;i++)
{
prework();
mainwork();
print();
}
return 0;
}
本文介绍了一种使用离散化和深度优先搜索(DFS)解决多边形覆盖问题的方法。通过将坐标乘以2并进行离散化处理,有效地解决了由六个多边形顶点定义的区域覆盖问题。代码示例展示了如何预处理坐标,使用for循环覆盖指定区域,并判断是否完全覆盖。
354

被折叠的 条评论
为什么被折叠?



