zoukankan      html  css  js  c++  java
  • 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*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*m-ans,ans);
    30         }
    31     }
    32     return 0;
    33 }
  • 相关阅读:
    ny 58 最少步数 (BFS)
    Oracle 参数文件
    Oracle 密码文件
    Oracle 表空间与数据文件
    Oracle 回滚(ROLLBACK)和撤销(UNDO)
    Oracle 控制文件(CONTROLFILE)
    Oracle 联机重做日志文件(ONLINE LOG FILE)
    Oracle 常用目录结构(10g)
    Oracle 归档日志
    instance_name,db_name,oracle_sid之间的关系
  • 原文地址:https://www.cnblogs.com/PaulShi/p/10073406.html
Copyright © 2011-2022 走看看