当前位置: 代码迷 >> 综合 >> 【 Codeforces Round #524 (Div. 2) C. Masha and two friends】前缀和+容斥
  详细解决方案

【 Codeforces Round #524 (Div. 2) C. Masha and two friends】前缀和+容斥

热度:29   发布时间:2023-12-29 02:24:44.0

C. Masha and two friends

题意

给你一个n*m的棋盘,最初(1,1)上为白色,而且每个相邻的块颜色都不同。
之后有两次操作,
第一次操作给出x1,y2,x2,y2
将(x1,y1,x2,y2)这个矩形涂为白色
第二次操作给出x3,y3,x4,y4
将(x3,y3,x4,y4)这个矩形涂为黑色
后涂得会覆盖之前的颜色。问最终的棋盘上黑色和白色的个数

做法

其实做法就是暴力的算,我的做法是写两个函数
第一个函数是cal(x,y)
用来计算原来的棋盘上,(1,1,x,y)这个矩形中黑色白色点的个数,返回值是pair<long long ,long long>类型的,
第二个函数是cal2(x,y)
用来计算原来的棋盘上,(x1,y1,x2,y2)这个矩形中黑色白色点的个数,返回值是pair<long long ,long long>类型的,这个是基于容斥用cal去计算的

之后就暴力算就可以。但是要注意的是计算相交的时候,我们将两个举行的x,y全都放进一个数组进行排序,之后取出中间的两个x,y,就是相交的那个矩形,这点很重要,不然要进行很多处理。

代码

#include<iostream>
#include<stdio.h>
#include<algorithm>
using namespace std;
typedef long long ll;
typedef pair <ll, ll> pll;
pll cal(ll x,ll y)//白黑
{
    return pll(x*y-(x*y)/2,(x*y)/2);
}
ll x[5],y[5];
pll cal2(ll x1,ll y1,ll x2,ll y2)
{
    pll ans=cal(x2,y2);pll ans1=cal(x2,y1-1);ans.first-=ans1.first;ans.second-=ans1.second;ans1=cal(x1-1,y2);ans.first-=ans1.first;ans.second-=ans1.second;ans1=cal(x1-1,y1-1);ans.first+=ans1.first;ans.second+=ans1.second;return ans;
}int main()
{
    int t;scanf("%d",&t);while(t--){
    ll n,m;scanf("%lld%lld",&n,&m);ll x_1,y_1,x_2,y_2;ll x_3,y_3,x_4,y_4;pll ans=cal(n,m);scanf("%lld%lld%lld%lld",&x[0],&y[0],&x[1],&y[1]);scanf("%lld%lld%lld%lld",&x[2],&y[2],&x[3],&y[3]);if (max(x[0],x[1])<min(x[2],x[3]) || min(x[0],x[1])>max(x[2],x[3]) || max(y[0],y[1])<min(y[2],y[3]) || min(y[0],y[1])>max(y[2],y[3])){
    ll tmp1=(x[1]-x[0]+1)*(y[1]-y[0]+1);ll tmp2=(x[3]-x[2]+1)*(y[3]-y[2]+1);pll ans1=cal2(x[0],y[0],x[1],y[1]);ans.first-=ans1.first;ans.second-=ans1.second;ans1=cal2(x[2],y[2],x[3],y[3]);ans.first-=ans1.first;ans.second-=ans1.second;ans.first+=tmp1;ans.second+=tmp2;printf("%lld %lld\n",ans.first,ans.second);}else{
    ll tmp1=(x[1]-x[0]+1)*(y[1]-y[0]+1);ll tmp2=(x[3]-x[2]+1)*(y[3]-y[2]+1);pll ans1=cal2(x[0],y[0],x[1],y[1]);ans.first-=ans1.first;ans.second-=ans1.second;ans1=cal2(x[2],y[2],x[3],y[3]);ans.first-=ans1.first;ans.second-=ans1.second;ans.first+=tmp1;ans.second+=tmp2;sort(x,x+4);sort(y,y+4);ans1=cal2(x[1],y[1],x[2],y[2]);ans.first+=ans1.first;ans.second+=ans1.second;ll tmp3=(x[2]-x[1]+1)*(y[2]-y[1]+1);ans.first-=tmp3;printf("%lld %lld\n",ans.first,ans.second);}}return 0;
}
  相关解决方案