1. 程式人生 > >CF1080C Masha and two friends (矩陣的重疊面積)

CF1080C Masha and two friends (矩陣的重疊面積)

---恢復內容開始---

CF1080C Masha and two friends (矩陣的重疊面積)

題目連結:CF1080C

有關在座標軸內矩陣的重疊覆蓋,格點計算都是毒瘤題,但見到了還是要A的

這類題目一般會有一些化繁為簡的技巧

這道題,是有關黑白格點的計算,我們可以利用容斥來做

首先我們記 B(x_1,y_1,x_2,y_2) 和 W(x_1,y_1,x_2,y_2) 分別為矩形 (x_1,y_1),(x_2,y_2)  內的黑色和白色格子數量。

經過推算我們可以得到,白色格子的增量為:B(x_1,y_1,x_2,y_2)-B((x_1,y_1,x_2,y_2)\cap(x_3,y_3,x_4,y_4))-W(x3,y3,x4,y4)

那麼我們要求黑色點數只要求總點數減去白色格子點數即可

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 int t;
 4 long long n,m,sx,sy,ex,ey,ans,xx,yy,Sx,Sy,Ex,Ey;
 5 int main()
 6 {
 7     scanf ("%d",&t);
 8     while (t--)
 9     {
10         scanf ("%d%d",&m,&n);
11         scanf ("%d%d%d%d
",&sx,&sy,&ex,&ey); 12 ans=n*m/2; 13 xx=ex-sx+1,yy=ey-sy+1; 14 ans-=xx*yy/2; 15 if ((sy+sx)%2&&yy%2&&xx%2) ans--; 16 scanf ("%d%d%d%d",&Sx,&Sy,&Ex,&Ey); 17 xx=Ex-Sx+1,yy=Ey-Sy+1; 18 ans+=xx*yy/2
; 19 if (!((Sy+Sx)%2)&&yy%2&&xx%2) ans++; 20 if ((Ex<sx||ex<Sx)||(Ey<sy||ey<Sy)) 21 printf ("%lld %lld\n",n*m-ans,ans); 22 else 23 { 24 int ssx=max (sx,Sx),ssy=max (sy,Sy); 25 int eex=min (ex,Ex),eey=min (ey,Ey); 26 xx=eex-ssx+1,yy=eey-ssy+1; 27 ans+=xx*yy/2; 28 if ((ssy+ssx)%2&&yy%2&&xx%2) ans++; 29 printf ("%lld %lld\n",n*m-ans,ans); 30 } 31 } 32 return 0; 33 }

 

---恢復內容結束---