zoukankan      html  css  js  c++  java
  • CodeForces 1216C(假的计算几何+扫描线)

    传送门

    •题意

      给你三个矩形,依次编号为 1,2,3;

      判断 矩形1 是否被 矩形2 和 矩形3 完全覆盖;

      如果没有完全覆盖,输出 "YES",反之,输出 "NO";

    •题解

      我是用扫描线做的;

      首先,定义如下数据结构:

     1 struct Data
     2 {
     3     int x;
     4     int y1,y2;
     5     int f;
     6     int id;
     7     bool operator < (const Data& obj)const
     8     {
     9         return x < obj.x;
    10     }
    11 }line[10],white[2];

      先扫描竖直边;

      将这 3 个矩形的左右边分别存入上述数据结构中;

      并保存 矩形1 的左右边;

     1 int num=0;
     2 for(int i=1;i <= 3;++i)
     3 {
     4     int x1,y1;
     5     int x2,y2;
     6     scanf("%d%d%d%d",&x1,&y1,&x2,&y2);
     7         
     8     if(i == 1)
     9     {
    10         white[0]={x1,y1,y2,1,i};///f=1表示该边为当前矩形的左边,f=-1表示该边为当前矩形的右边
    11         white[1]={x2,y1,y2,-1,i};///保存矩阵1的两个竖直边
    12     }
    13     line[++num]={x1,y1,y2,1,i};///保存矩阵的竖直边
    14     line[++num]={x2,y1,y2,-1,i};
    15 }

      保存好边的信息后,按照 x 升序排列;

      接下来就是判断 矩形1 的竖直边是否被 矩形2,3 完全覆盖;

      但是,仅仅判断竖直边是否被完全覆盖是不够的,还需要扫描水平边;

      原因的话,可以模拟一下如下样例:

    0 0 4 4
    0 0 4 2
    0 3 4 4

      这样的话,就得需要保存矩形的上下边,并再次扫描一遍;

      只有当 矩形1 的竖直边和水平边都分别被 矩形2,3 完全覆盖时,才能说明 矩形1 被 矩形2,3 完全覆盖;

    •Code

      CodeForces1216C.cpp

    •Wa过的样例

    10 10 11 11
    10 10 11 11
    10 10 11 11

      此样例很明确的说明了 Code 中第 49~50 行的判断语句的放置位置以及如何确定判断条件;

      还有一个就是上述题解中的样例,明确的说明了为什么要扫描两次;

  • 相关阅读:
    4.8 C++ typeid操作符
    4.7 C++ dynamic_cast操作符
    tomcat中class和jar的加载顺序(转)
    java Files类和Paths类的用法 (转)
    搭建DUBBO项目解决DUBBO.XML标签报错的问题(转载)
    Maven异常:Could not find artifact
    在docker宿主机上查找指定容器内运行的所有进程的PID
    jmap、jstack、jps无法连接jvm解决办法
    linux中如何查看某一进程的启动时间
    Eureka与ZooKeeper 的比较(转)
  • 原文地址:https://www.cnblogs.com/violet-acmer/p/11566703.html
Copyright © 2011-2022 走看看