1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84
| #include<cstdio> #include<algorithm> #include<bitset> #define fo(i,a,b) for(int i=a;i<=b;i++) using namespace std;
typedef long long LL;
const int maxn=250005, maxk=1e4+5, maxp=505; const int inf=2147483647;
int xp,yp,kx,ky,n,k,X[maxk],Y[maxk],ex1[maxk],ex2[maxk],ey1[maxk],ey2[maxk]; bitset<maxp> mp[maxp],fp[maxp];
bitset<maxp> zero; bool bz[maxp][maxp]; int main() { scanf("%d %d %d",&xp,&yp,&n); fo(i,1,n) { int x,y; scanf("%d %d",&x,&y); mp[x][y]=1; } scanf("%d",&k); kx=ky=inf; fo(i,1,k) { scanf("%d %d",&X[i],&Y[i]); kx=min(kx,X[i]), ky=min(ky,Y[i]); } fo(i,1,k) X[i]-=kx, Y[i]-=ky; kx=ky=0; fo(i,1,k) { kx=max(kx,X[i]), ky=max(ky,Y[i]); if (X[i]>xp || Y[i]>yp) {printf("0\n"); return 0;} } fo(i,1,k) { ex1[i]=X[i], ey1[i]=Y[i]; int t=(i%k)+1; ex2[i]=X[t], ey2[i]=Y[t]; if (ex1[i]>ex2[i]) swap(ex1[i],ex2[i]), swap(ey1[i],ey2[i]); if (ex1[i]==ex2[i] && ey1[i]>ey2[i]) swap(ey1[i],ey2[i]); } fo(i,1,k) if (ex1[i]!=ex2[i]) { int ad=(ey1[i]<ey2[i]) ?1 :-1; int y=ey1[i]; fo(x,ex1[i],ex2[i]) { if (ad==1) { while ((LL)(y-ey1[i])*(ex2[i]-x)<(LL)(ey2[i]-y)*(x-ex1[i])) y+=ad; } else { while (x>ex1[i] && (LL)((y+ad)-ey1[i])*(ex2[i]-x)>=(LL)(ey2[i]-(y+ad))*(x-ex1[i])) y+=ad; } if ((LL)(y-ey1[i])*(ex2[i]-x)==(LL)(ey2[i]-y)*(x-ex1[i])) bz[x][y]=1; if (x<ex2[i] && y<=ky) fp[x][y]=(fp[x][y]) ?0 :1 ; } } fo(i,0,kx) fo(j,1,ky) fp[i][j]=fp[i][j]^fp[i][j-1]; fo(i,0,kx) fo(j,0,ky) if (bz[i][j]) fp[i][j]=1; fo(i,1,k) if (ex1[i]==ex2[i]) fo(j,ey1[i],ey2[i]) fp[ex1[i]][j]=1; int ans=0; fo(x,0,xp-kx) fo(y,0,yp-ky) { bitset<maxp> ans1=zero; fo(i,0,kx) ans1|=mp[x+i]&(fp[i]<<y); ans+=(!ans1.any()); } printf("%d\n",ans); }
|