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 }

---恢复内容结束---

猜你喜欢

转载自www.cnblogs.com/PaulShi/p/10073406.html