虽然也很水,但这道还是比前两道难多了...


题目大意:给你三个位于同一平面直角坐标系的矩形,询问你后两个是否完全覆盖了前一个

首先,最直观的想法应该是,把第一个矩形内部每个整数点检查一下,看看是否位于其他两个矩形的内部

但是一看数据范围,哇,$10^6$,点最多就有${10}^{12}$个,直接爆炸,好走不送

我们只能换思路了。。。

考虑两个矩形超出那个矩形的部分没有任何用处,直接砍掉

这样我们就只用考虑这个矩阵内部了

可以看出,覆盖也可以说是矩形切掉了位置与盖在上面的矩形相同的且相当于上面的矩形大小的一块,但这样做还是太过麻烦,因为有时会变成下图这样:

倘若这个矩形没有彻底覆盖大矩形的一条边(这个表达其实有问题,但大家应该能够理解),那么这个矩形的覆盖是对覆盖整个大矩形是没有贡献的,因为剪裁后不能使得大矩形的长短缩小

所以我们只需要将大矩形切掉能彻底覆盖大矩形一条边的矩形即可,。

这个是实现应该很简单,毕竟直接缩小大矩形长短即可,最后判断大矩形是否被切没了就能判断是否能被覆盖了

P.S. 记得判断小矩形是否被切完了,切完就不要执行操作了(感谢 @YiShen 提供hack数据)

代码如下:

#include<cstdio>

inline int read(){
int r=0,f=1;
char c=getchar();
while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}
while(c>='0'&&c<='9')r=(r<<1)+(r<<3)+c-'0',c=getchar();
return r*f;
} int x[2],y[2],b_x[2],b_y[2]; inline int min(int a,int b){
return a<b?a:b;
} inline int max(int a,int b){
return a>b?a:b;
} int main(){
x[0]=read(),y[0]=read();
x[1]=read(),y[1]=read();
for(int i=1;i<=2;i++){
b_x[0]=max(read(),x[0]),b_y[0]=max(read(),y[0]);//超出大矩形,砍掉
b_x[1]=min(read(),x[1]),b_y[1]=min(read(),y[1]);//超出大矩形,砍掉
for(int j=0;j<=1;j++)//先看左边和下面,再看右边和上面
if(b_x[j]==x[j]&&b_y[j]==y[j]){//倘若连顶点都没覆盖,更别说整条边了
if(b_x[j^1]==x[j^1])y[j]=b_y[j^1];//看看该边是否被覆盖,若是,将大矩形切去这一段
if(b_y[j^1]==y[j^1])x[j]=b_x[j^1];//看看该边是否被覆盖,若是,将大矩形切去这一段
}
}
if(x[0]==x[1]&&y[0]==y[1])printf("NO");
else printf("YES");
return 0;
}

倘若无法理解此处的异或运算(其实就是相对的两个顶点(左下和右上)),建议手模或者调试走一遍

题解 CF1216C 【White Sheet】的更多相关文章

  1. [CF1216C] White Sheet - 离散化,模拟

    虽然分类讨论应该是比较推崇的解法,但是我就是喜欢暴力 #include <bits/stdc++.h> using namespace std; #define int long long ...

  2. Codeforces Round #587 (Div. 3) C. White Sheet

    链接: https://codeforces.com/contest/1216/problem/C 题意: There is a white sheet of paper lying on a rec ...

  3. White Sheet

    C - White Sheet 思路:先看代码,分成了四个条件.第一个和第二个表示的都是当白矩形存在某个黑矩形内部的情况. 另外就是:白矩形位于两个黑矩形的并集区域. 即可分为两种情况,一种是白矩形位 ...

  4. Codeforces Round #587 C. White Sheet(思维+计算几何)

    传送门 •题意 先给一个白矩阵,再两个黑矩阵 如果两个黑矩阵能把白矩阵包含,则输出NO 否则输出YES •思路 计算几何题还是思维题呢? 想起了上初中高中做几何求面积的题 这个就类似于那样 包含的话分 ...

  5. CodeForces 1200D White Lines

    cf题面 Time limit 1500 ms Memory limit 262144 kB 解题思路 官方题解 1200D - White Lines Let's consider a single ...

  6. USACO 6.2 Shaping Regions

    Shaping Regions N opaque rectangles (1 <= N <= 1000) of various colors are placed on a white s ...

  7. Codeforces Round #587

    题目链接:Round #587 题目答案:官方Editorial.My Solution A. Prefixes 题意:给一字符串,只含有'a'或'b',需要改变某些位置('a'变'b'或'b'变'a ...

  8. C#中如何给Excel添加水印

    我们知道Microsoft Excel并没有内置的功能直接给Excel表添加水印,但是其实我们可以用其他变通的方式来解决此问题,如通过添加页眉图片或艺术字的方法来模仿水印的外观.所以在这篇文章中,我将 ...

  9. ural 1147. Shaping Regions

    1147. Shaping Regions Time limit: 0.5 secondMemory limit: 64 MB N opaque rectangles (1 ≤ N ≤ 1000) o ...

随机推荐

  1. freemark 异常

    现象: 前几天跟前端联调,freemark报异常如下: For "#if" condition: Expected a boolean, but this has evaluate ...

  2. Python2和Python3共存问题

    前提条件:先准备一个新电脑 1.下载Python2和Python3的安装包,直接官网下载:https://www.python.org/download 2.配置环境变量,可以手动配置,也可以安装的时 ...

  3. nginx只允许域名访问,禁止ip访问 禁止其他域名访问

    背景:为什么要禁止ip访问页面呢?这样做是为了避免其他人把未备案的域名解析到自己的服务器IP,而导致服务器被断网,我们可以通过禁止使用ip访问的方法,防止此类事情的发生. 解决方法:这里介绍修改配置文 ...

  4. vim 替换所有字符串

    将dev 替换 为 prod: :%s/dev/prod/g

  5. Windows系统CPU和内存状态实时查询(Java)

    一.背景 需要查询Windows服务器的CPU和内存状态. Linux系统查询CPU和内存状态很简单,一个top命令搞定,Windows就稍微麻烦一些了. 经过资料查找,发现jdk目前不能直接查询系统 ...

  6. ubuntu二进制包安装openresty

    date: 2019-08-01 17:59:59 author: headsen chen # 导入我们的 GPG 密钥: wget -qO - https://openresty.org/pack ...

  7. 无法调用到appcode下的类

    解决方法: 右键 appp_code下的类, 点击 “属性”, 里面 [生成操作] 一项 由内容 改为 编译 即可

  8. flutter 路由动画

    import 'package:flutter/material.dart'; import 'package:flutter_app/pages/FirstPage.dart'; void main ...

  9. Springboot项目mysql日期存储不匹配问题和在idea本地可以运行起来,但打包jar后运行报找不到mysql驱动的解决方案

    修改pop.xml中scope的值,如果是具体版本号,修改为如下即可解决 <dependency> <groupId>mysql</groupId> <art ...

  10. 【转载】 Tensorflow中padding的两种类型SAME和VALID

    原文地址: https://blog.csdn.net/jasonzzj/article/details/53930074 -------------------------------------- ...