Codeforces 1080C 题解(思维+二维前缀和)
题面
题目大意:
有一个黑白的棋盘,现在将棋盘上的一个子矩形全部染成黑色,另一个子矩形全部染成白色
求染完色后黑,白格子的总数
分析
我们可以发现,对于一个(1,1)到(x,y)的矩形,若xy为偶数,则黑、白的个数都是 $ \frac{xy}{2} $
若xy为奇数,则黑格个数为\(\ [ \frac{xy}{2} \ ]\),白格个数为\(\ [ \frac{xy}{2} \ ]+1\)
因此用二维前缀和的方法就可以求出任意子矩形内的黑,白格子个数
long long get_white(long long x,long long y) {
	if((x*y)%2==0) return (x*y)/2;
	else {
		return (x*y)/2+1;
	}
}
long long get_black(long long x,long long y) {
	if((x*y)%2==0) return (x*y)/2;
	else {
		return (x*y)/2;
	}
}
long long get_rec_black(long long x1,long long y1,long long x2,long long y2) {
	return get_black(x2,y2)-get_black(x1-1,y2)-get_black(x2,y1-1)+get_black(x1-1,y1-1);
}
long long get_rec_white(long long x1,long long y1,long long x2,long long y2) {
	return get_white(x2,y2)-get_white(x1-1,y2)-get_white(x2,y1-1)+get_white(x1-1,y1-1);
}
然后考虑修改:
对于染黑的操作,设wsum,bsum分别表示整个棋盘里的白,黑格子个数,初始wsum,bsum都是原本棋盘里黑,白格子的个数
s表示染黑的矩形内部原来白色格子个数,则wsum=wsum-s,bsum=bsum+s
染白操作同理
wsum=get_white(n,m);
bsum=get_black(n,m);
s1=get_rec_black(x1,y1,x2,y2);
wsum+=s1;
bsum-=s1;
但这样会导致一个问题,若染黑和染白的矩形有公共部分,那么会出现错误
因此我们染黑时先不考虑公共部分(染白时直接染),把公共部分从答案里面减去
再分析公共部分对答案的影响
设公共部分面积为same
则bsum+=same,wsum-=same
这样我们就在\(O(1)\)时间内求出了答案
代码
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int t;
long long n,m;
long long x1,y1,x2,y2;
long long x3,y3,x4,y4;
long long wsum,bsum;
long long get_white(long long x,long long y) {
	if((x*y)%2==0) return (x*y)/2;
	else {
		return (x*y)/2+1;
	}
}
long long get_black(long long x,long long y) {
	if((x*y)%2==0) return (x*y)/2;
	else {
		return (x*y)/2;
	}
}
long long get_rec_black(long long x1,long long y1,long long x2,long long y2) {
	return get_black(x2,y2)-get_black(x1-1,y2)-get_black(x2,y1-1)+get_black(x1-1,y1-1);
}
long long get_rec_white(long long x1,long long y1,long long x2,long long y2) {
	return get_white(x2,y2)-get_white(x1-1,y2)-get_white(x2,y1-1)+get_white(x1-1,y1-1);
}
long long minx,miny,maxx,maxy;
int get_inter(long long x1,long long y1,long long x2,long long y2,long long x3,long long y3,long long x4,long long y4) {
	minx=max(x1,x3);
	miny=max(y1,y3);
	maxx=min(x2,x4);
	maxy=min(y2,y4);
	if(minx>maxx||miny>maxy) return -1;
	else return 1;
} 
int main() {
	long long s1,s2,same;
	scanf("%d",&t);
	while(t--) {
		scanf("%I64d %I64d",&n,&m);
//		swap(n,m);
		scanf("%I64d %I64d %I64d %I64d",&x1,&y1,&x2,&y2);
		scanf("%I64d %I64d %I64d %I64d",&x3,&y3,&x4,&y4);
		wsum=get_white(n,m);
		bsum=get_black(n,m);
		s1=get_rec_black(x1,y1,x2,y2);
		wsum+=s1;
		bsum-=s1;
		if(get_inter(x1,y1,x2,y2,x3,y3,x4,y4)==-1) {
			s2=get_rec_white(x3,y3,x4,y4);
			bsum+=s2;
			wsum-=s2;
		} else {
			s2=get_rec_white(x3,y3,x4,y4)-get_rec_white(minx,miny,maxx,maxy);
			bsum+=s2;
			wsum-=s2;
			bsum+=(maxy-miny+1)*(maxx-minx+1);
			wsum-=(maxy-miny+1)*(maxx-minx+1);
		}
		printf("%I64d %I64d\n",wsum,bsum);
	}
}
Codeforces 1080C 题解(思维+二维前缀和)的更多相关文章
- Codeforces 835C - Star sky - [二维前缀和]
		题目链接:http://codeforces.com/problemset/problem/835/C 题意: 在天空上划定一个直角坐标系,有 $n$ 颗星星,每颗星星都有坐标 $(x_i,y_i)$ ... 
- Codeforces 838A - Binary Blocks(二维前缀和+容斥)
		838A - Binary Blocks 思路:求一下前缀和,然后就能很快算出每一小正方块中1的个数了,0的个数等于k*k减去1的个数,两个的最小值就是要加进答案的值. 代码: #include< ... 
- CDOJ 1256 二维前缀和处理
		昊昊喜欢运动 他NN 天内会参加MM 种运动(每种运动用一个[1,m][1,m] 的整数表示) 舍友有QQ 个问题 问昊昊第ll 天到第rr 天参加了多少种不同的运动 Input 输入两个数NN , ... 
- 【题解】洛谷P2822 [NOIP2016TG ]组合数问题 (二维前缀和+组合数)
		洛谷P2822:https://www.luogu.org/problemnew/show/P2822 思路 由于n和m都多达2000 所以暴力肯定是会WA的 因为整个组合数是不会变的 所以我们想到存 ... 
- Codeforces 1262E Arson In Berland Forest(二维前缀和+二维差分+二分)
		题意是需要求最大的扩散时间,最后输出的是一开始的火源点,那么我们比较容易想到的是二分找最大值,但是我们在这满足这样的点的时候可以发现,在当前扩散时间k下,以这个点为中心的(2k+1)2的正方形块内必 ... 
- C - Monitor CodeForces - 846D (二维前缀和 + 二分)
		Recently Luba bought a monitor. Monitor is a rectangular matrix of size n × m. But then she started ... 
- COGS1752 [BOI2007]摩基亚Mokia(CDQ分治 + 二维前缀和 + 线段树)
		题目这么说的: 摩尔瓦多的移动电话公司摩基亚(Mokia)设计出了一种新的用户定位系统.和其他的定位系统一样,它能够迅速回答任何形如“用户C的位置在哪?”的问题,精确到毫米.但其真正高科技之处在于,它 ... 
- poj-3739. Special Squares(二维前缀和)
		题目链接: I. Special Squares There are some points and lines parellel to x-axis or y-axis on the plane. ... 
- Good Bye 2015 C. New Year and Domino 二维前缀
		C. New Year and Domino They say "years are like dominoes, tumbling one after the other". ... 
随机推荐
- Docker设置容器开机自启动
			设置如下: docker update --restart=always 镜像ID 例如:docker update --restart=always e39a959d7bff. 参考:https:/ ... 
- 记录cobbler报错
			出现下面这个错误解决方法 httpd does not appear to be running and proxying cobbler, or SELinux is in the way. Ori ... 
- [php代码审计] php四种标记
			php手册中的介绍: 可以在 PHP 中使用四对不同的开始和结束标记.其中两种,<?php ?> 和 <script language="php"> < ... 
- 【leetcode】1079. Letter Tile Possibilities
			题目如下: You have a set of tiles, where each tile has one letter tiles[i]printed on it. Return the num ... 
- 怎么测试php代码
			没有任何一名程序员可以一气呵成.完美无缺的在不用调试的情况下完成一个功能或模块.调试实际分很多种情况. 暴力调试 这种方式简单粗暴,一般PHP程序员都会用,那就是浏览器调试,在编辑器内写完代码后随后打 ... 
- Oracle中start with...connect by/start with…connect by prior子句的用法
			connect by 是结构化查询中用到的,其基本语法是:select … from tablenamestart with 条件1connect by 条件2where 条件3;例:select * ... 
- [CSP-S模拟测试]:天才绅士少女助手克里斯蒂娜(数学+树状数组)
			题目描述 红莉栖想要弄清楚楼下天王寺大叔的显像管电视对“电话微波炉(暂定)”的影响. 选取显像管的任意一个平面,一开始平面内有个$n$电子,初始速度分别为$v_i$,定义飘升系数为$$\sum \li ... 
- php匿名函数和闭包的理解
			PHP匿名函数和闭包使用的句法与普通函数相同,但匿名函和闭包数其实是伪装成函数的对象. 匿名函数:就是没有名称的函数.匿名函数可以赋值给变量,对象传递.不过匿名函数仍是函数,因此可以调用,还可以传入参 ... 
- CSS页面乱码 GB2312、UTF-8格式问题解决方案
			如同左图所现,出现了页面乱码问题本来应该是显示gb3212字符的"关闭"文字了.. 解决方案一: 在所调用的CSS页面的第一行添加下边的这一句代码, 注意:一定要是在CSS的头 ... 
- Sending form data
			https://developer.mozilla.org/en-US/docs/Learn/HTML/Forms/Sending_and_retrieving_form_data This arti ... 
