CF1080C Masha and two friends 题解(思维+模拟)

题目链接

题目大意

给你一个长度为(n imes m (1le n,mle1e9))的矩阵

((x,y))((x+y)\%2=1)则为白色,否则为黑色

首先将一个区间变为全白,再将一个区间变为全黑

求最后矩阵的白色和黑色点

题目思路

首先要明白两个矩阵的相交矩阵怎么求

a=max(x1,x3),b=max(y1,y3);
c=min(x2,x4),d=min(y2,y4);

白色的点其实就是本来的白色 + 第一次操作的初始矩阵黑色 - 第二次操作的初始矩阵白色 - 相交初始矩阵的

黑色

代码

#include<bits/stdc++.h>
#define debug printf("
 I am here
");
#define fi first
#define se second
typedef long long ll;
const int maxn=1e6+5,inf=0x3f3f3f3f,mod=1e9+7;
using namespace std;
ll n,m;
ll getwhite(ll x1,ll y1,ll x2,ll y2){
    // 返回这个区间本来有多少个白色
    ll sum=(y2-y1+1)*(x2-x1+1);
    if((x1+y1)%2==0){
        return (sum+1)/2;
    }else{
        return sum/2;
    }
}
int main(){
    int _; scanf("%d",&_);
    while(_--){
        scanf("%lld%lld",&n,&m);
        ll x1,y1,x2,y2,x3,y3,x4,y4;
        ll a,b,c,d;
        scanf("%lld%lld%lld%lld",&x1,&y1,&x2,&y2);
        scanf("%lld%lld%lld%lld",&x3,&y3,&x4,&y4);
        a=max(x1,x3),b=max(y1,y3);
        c=min(x2,x4),d=min(y2,y4);
        // 初始的白色点
        ll bai=(n*m+1)/2;
        bai+=(x2-x1+1)*(y2-y1+1)-getwhite(x1,y1,x2,y2);
        bai-=getwhite(x3,y3,x4,y4);
        if(c>=a&&d>=b){
            bai-=(d-b+1)*(c-a+1)-getwhite(a,b,c,d);
        }
        printf("%lld %lld
",bai,n*m-bai);
    }
    return 0;
}

卷也卷不过,躺又躺不平
原文地址:https://www.cnblogs.com/hunxuewangzi/p/14720036.html