CF1080C Masha and two friends

CF1080C Masha and two friends

题意

给出一个边长为 \(n\) 的黑白相间的棋盘,在两块矩形区域分别染上白色和黑色,问最后棋盘上黑色和白色格子的数量。

思路

这是 1500?外国人均模拟大佬(bushi。

考虑如何快速计算出一块矩形区域的白色和黑色格子数量。

容易发现当矩形面积为偶数时,白色和黑色格子的数量是一样多的,因为白色数量和黑色数量之差无论如何都不会超过 \(1\)

当面积为奇数时,若矩形左下角的方块为白色,则白色比黑色多 \(1\),反之黑色比白色多 \(1\)

考虑两矩形区域之间没有交集时如何计算面积。

假如给绿色区域染白,红色区域染黑,容易发现白色面积增加了白色区域的黑色格子数量,黑色面积增加了黑色区域的白色格子数量,然后再来考虑有交集时的数量。

容易发现按照原来的方法算格子数量的话,因为白色先染,黑色后染,所以白色会多算交集的黑色部分,黑色会少算交集的白色部分。

设两矩形左下角和右上角坐标分别为 \((x1,y1),(x2,y2),(X1,Y1),(X2,Y2)\),则交集矩形坐标可以简单地表示为 \((\max(x1,X1),\max(y1,Y1)),(\min(x2,X2),\min(y2,Y2))\)

代码

#include <bits/stdc++.h>
#define bc(x,y,xx,yy) (x>xx||y>yy?0:(xx-x+1)*(yy-y+1)%2==0?(xx-x+1)*(yy-y+1)/2:(x+y)%2==0?(xx-x+1)*(yy-y+1)/2:(xx-x+1)*(yy-y+1)/2+1)
#define wc(x,y,xx,yy) ((xx-x+1)*(yy-y+1)-bc(x,y,xx,yy))
using namespace std;
#define int long long
int T,n,m,x,y,_x,_y,X,Y,_X,_Y;
signed main() {
	cin>>T;
	while(T--){
		cin>>n>>m;
		cin>>x>>y>>_x>>_y;
		cin>>X>>Y>>_X>>_Y;
		cout<<wc(1,1,n,m)+bc(x,y,_x,_y)-wc(X,Y,_X,_Y)-bc(max(x,X),max(y,Y),min(_x,_X),min(_y,_Y))<<" ";
		cout<<bc(1,1,n,m)-bc(x,y,_x,_y)+wc(X,Y,_X,_Y)+bc(max(x,X),max(y,Y),min(_x,_X),min(_y,_Y))<<endl;
	}
	return 0; 
}
posted @ 2025-03-26 11:01  WuMin4  阅读(13)  评论(0)    收藏  举报