Codeforces Round #524 (Div. 2) C. Masha and two friends(思维+计算几何?)
https://www.cnblogs.com/violet-acmer/p/10146350.html
题意:
有一块 n*m 的棋盘,初始,黑白块相间排列,且左下角为白块。
给出两个区间[ (x1,y1) , (x2,y2) ] 和 [ (x3,y3) , (x4,y4) ],第一个区间全部涂成白色,第二个区间全部涂成黑色,且颜色会覆盖。
求两块区间按照要求涂完后白块和黑快的个数?
题解:
我的想法如下:
先求出初始的黑块个数,然后,求出第一个区间减少的黑块个数,再求出第二个区间增加的黑块个数,求出黑块个数后,白块个数也就出来了。
具体求法:

如何求出初始黑块个数呢?
定义变量 totBlack 为黑块个数。
看图,你会发现第一列与第二列黑块的总和 ==8(n)
也就是说,前m列会有(m/2)*8个黑块,如果m为奇数,那么就会剩下最后一列不能配对,而最后一列的黑块的个数就是 n/2;
在经过观察,你会发现,黑块的坐标加和 x+y 为奇数,知道这个后,问题将变得异常简单。
首先[(x1,y1),(x2,y2)]区间1的所有黑块都会被涂成白块,求出此区间的黑块个数 totBlack1,totBlack -= totBlack1;
而[(x3,y3),(x4,y4)]区间2的所有白块会被涂成黑块,如果区间1和区间2不重合,问题会变得很简单,但,如果重合呢?
先不考虑重合的问题,单纯的求出区间2的白块个数 totBlack3,totBlack += totBlack3;
对于重合的部分,求出重合部分的黑块个数 totBlack4,totBlack += totBlack4;
因为,区间1会把重合部分的黑块变为白块,而区间2在查找白块的时候会忽略重合区间的黑块部分,而这部分正好是少加的。
具体细节看代码。
补充一点计算几何的小知识点,如何求出重合矩形?

此题中给的两个坐标正好是左下和右上,很友好,哈哈哈~~~~~~~
AC代码:
#include<iostream>
#include<cstdio>
using namespace std;
#define ll __int64 ll n,m;
struct Node
{
int x1,y1;
int x2,y2;
Node(int a=,int b=,int c=,int d=)
{
x1=a,y1=b;
x2=c,y2=d;
}
}rec[]; //i == 1 : 查找[(x1,y1),(x2,y2)]黑块个数
//i == 2 : 查找[(x3,y3),(x4,y4)]白块个数
//i == 3 : 查找重合区间的黑块个数
ll Find1(int i)
{
int totX=rec[i].x2-rec[i].x1+;
int totY=rec[i].y2-rec[i].y1+; ll res=;
if(totX >= )
res=1ll*totY*(totX>>);
if(totX&)//如果totX为奇数,那么之前两两配对后,会剩下最后一列没被统计
{
if(i&)//查找最后一列黑块个数
{
if(rec[i].x2&)//x2为奇,找y为偶的个数
res += (totY>>)+((totY&) && (rec[i].y1% == ) ? :);
else//x为偶数,找y为奇的个数
res += (totY>>)+((totY&) && (rec[i].y1&) ? :);
}
else//查找最后一列白块个数
{
if(rec[i].x2&)//x2为奇,找y为奇的个数
res += (totY>>)+((totY&) && (rec[i].y1&) ? :);
else//x为偶数,找y为偶的个数
res += (totY>>)+((totY&) && (rec[i].y1% == ) ? :);
}
}
return res;
}
ll Find2()
{
ll res=Find1();
int a=max(rec[].x1,rec[].x1),b=max(rec[].y1,rec[].y1);
int c=min(rec[].x2,rec[].x2),d=min(rec[].y2,rec[].y2);
if(a > c || b > d)
return res; rec[]=Node(a,b,c,d);
res += Find1();//查找重合部分黑块的个数
return res;
}
void Solve()
{
ll totBlack=;
if(m >= )
totBlack=n*(m>>);
totBlack += ((m&) ? (n>>):); totBlack -= Find1();//去掉第一个区间减少的黑块个数
totBlack += Find2();//加上第二个区间增加的黑块个数 printf("%I64d %I64d\n",n*m-totBlack,totBlack);
}
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
int a,b,c,d;
scanf("%I64d%I64d",&n,&m); scanf("%d%d%d%d",&a,&b,&c,&d);
rec[]=Node(a,b,c,d); scanf("%d%d%d%d",&a,&b,&c,&d);
rec[]=Node(a,b,c,d); Solve();
}
return ;
}
这道题,踩了范围的坑!!!!!
中间定义的一些变量是 int ,但是由于含有乘法操作,中间结果会溢出 int 范围,然后,改了好久好久~~~~~~

一直在wa在text2数据,后来发现,越界了,改成 res=1ll*totY*(totX>>1)才过的
顶着明天Linux考试要挂科的风险再次码了好久好久代码。。。。
考前磨磨枪吧,万一过了呢!!!!!!!
代码有毒,上瘾,哈哈哈,可我就是喜欢啊
Codeforces Round #524 (Div. 2) C. Masha and two friends(思维+计算几何?)的更多相关文章
- Codeforces Round #524 (Div. 2) C. Masha and two friends(矩形相交)
C. Masha and two friends time limit per test 1 second memory limit per test 256 megabytes input stan ...
- Codeforces Round #524 (Div. 2) C. Masha and two friends
C. Masha and two friends 题目链接:https://codeforc.es/contest/1080/problem/C 题意: 给出一个黑白相间的n*m的矩阵,现在先对一个子 ...
- Codeforces Round #524 (Div. 2) C. Masha and two friends 几何:判断矩形是否相交以及相交矩形坐标
题意 :给出一个初始的黑白相间的棋盘 有两个人 第一个人先用白色染一块矩形区域 第二个人再用黑色染一块矩形区域 问最后黑白格子各有多少个 思路:这题的关键在于求相交的矩形区间 给出一个矩形的左下和 ...
- Codeforces Round #524 (Div. 2) C. Masha and two friends 思路
题目:题目链接 思路:直接计数显然是不好处理的,但分情况讨论只要不写错这题是一定可以出的,但这样基本做完这个题就没时间做其他题了,但当时我就这么蠢的这样做了,比赛一个半小时的时候突然发现一个似乎可行的 ...
- Codeforces Round #524 (Div. 2)(前三题题解)
这场比赛手速场+数学场,像我这样读题都读不大懂的蒟蒻表示呵呵呵. 第四题搞了半天,大概想出来了,但来不及(中途家里网炸了)查错,于是我交了两次丢了100分.幸亏这次没有掉rating. 比赛传送门:h ...
- Codeforces Round #556 (Div. 2) - C. Prefix Sum Primes(思维)
Problem Codeforces Round #556 (Div. 2) - D. Three Religions Time Limit: 1000 mSec Problem Descripti ...
- Codeforces Round #524 (Div. 2) Masha and two friends矩形
题目 题意: 给一个n*m块大的黑白相间的矩形,在这个举行中操作,要先把第一个矩形(左下角坐标(x1,y2),右上角坐标(x2,y2)) 全部涂成白色,再把第二个矩形(左下角坐标(x3,y3), ...
- Codeforces Round #524 (Div. 2) F. Katya and Segments Sets(主席树)
https://codeforces.com/contest/1080/problem/F 题意 有k个区间,区间的种类有n种,有m个询问(n,m<=1e5,k<=3e5),每次询问a,b ...
- Codeforces Round #524 (Div. 2) E. Sonya and Matrix Beauty(字符串哈希,马拉车)
https://codeforces.com/contest/1080/problem/E 题意 有一个n*m(<=250)的字符矩阵,对于每个子矩阵的每一行可以任意交换字符的顺序,使得每一行每 ...
随机推荐
- python设计模式第八天【装饰器模式】
1.定义 使用包装的释放扩展类的功能,但是不使用继承 2.使用场景 3.代码实现 #!/usr/bin/env python #! _*_ coding:UTF-8 _*_ def MyDecorat ...
- Druid数据库连接池
一.Druid连接池的创建 package cn.zhouzhou; import java.io.IOException; import java.io.InputStream; import ja ...
- Memcached 分布式集群
首先解释一下我的标题,用到了 分布式 和 集群两个单词,为什么是集群?解决[相同业务]问题的服务器多个以上就称为集群.这里memcached就是做相同任务的(提供缓存服务)为什么是分布式?虽然针对的是 ...
- Vue-router的API详解
前面的话 本文将详细介绍Vue-router的API router-link <router-link> 组件支持用户在具有路由功能的应用中点击导航. 通过 to 属性指定目标地址,默认渲 ...
- spawn
转载:http://motioo.blog.163.com/blog/static/117718291200954102830215/ 并行计算使用的节点数在开始运行程序时进行指定. 学习了FFT之后 ...
- THEKEY
追溯历史,有据可查的身份证明是中国隋唐时期的“鱼符”,只为达官贵人证明身份等级,后演变为“龟符”.“牙牌”.“腰牌”等,直至近现代时期才出现真正意义的身份证,增加了个人信息描述.由于过去的生产力水平较 ...
- CentOS 部署.net core 2.0 项目
上传项目到服务器 安装Nginx(反向代理服务器),配置文件 https://www.cnblogs.com/xiaonangua/p/9176137.html 安装supervisor https: ...
- xshell使用rz/sz完成文件上传下载
yum -y install lrzsz 安装lrzsz 使用rz完成文件上传 使用sz完成文件下载
- 洛谷P2084 进制转换
题目背景 无 题目描述 今天小明学会了进制转换,比如(10101)2 ,那么它的十进制表示的式子就是 : 1*2^4+0*2^3+1*2^2+0*2^1+1*2^0, 那么请你编程实现,将一个M进制的 ...
- Educational Codeforces Round 61 (Rated for Div. 2)
A. Regular Bracket Sequence 题意:给出四种括号的数量 (( )) () )( 问是否可以组成合法的序列(只能排序不能插在另外一个的中间) 思路: 条件一:一个或 n个) ...