zoukankan      html  css  js  c++  java
  • Codeforces Round #524 (Div. 2)C 二维坐标系求俩矩形面积交

    题:https://codeforces.com/contest/1080/problem/C

    题意:给n*m的二维坐标系,每个位置(xi,yi)都表示一个方格,(1,1)的位置是白色,整个坐标系黑白相间分布。有俩个操作,第一个操作是选定一个矩阵用白色给覆盖,第二个操作选定一个矩阵用黑色覆盖,问最后的白色块和黑色块各是多少?

    分析:我们先分别独立地求这俩次操作,然后因为黑色覆盖在后,所以我们就把俩次操作可能相交的部分进行减去相应的贡献即可,也就是对面积交进行处理。

    #include<bits/stdc++.h>
    using namespace std;
    typedef long long ll;
    ll area(ll x1,ll y1,ll x2,ll y2){
        ll a=x2-x1+1,b=y2-y1+1;
        ll ans=a*b/2;
        if(a*b%2!=0&&((x1+y1)%2==0))
            ans++;
        return ans;
    }
    ll cross(ll x1,ll y1,ll x2,ll y2,ll x3,ll y3,ll x4,ll y4){
        ll lx=max(x1,x3);
        ll ly=max(y1,y3);
        ll rx=min(x2,x4);
        ll ry=min(y2,y4);
        if(lx>rx||ly>ry)
            return 0;
    
        ll a=rx-lx+1,b=ry-ly+1;
        ll ans=a*b/2;
        if(a*b%2!=0&&((lx+ly)%2==0))
            ans++;
        return a*b-ans;
    }
    
    int main()
    {
        int t;
        cin>>t;
        while(t--){
            ll n,m; 
            cin>>n>>m;
            ll x1,y1,x2,y2,x3,y3,x4,y4;
            cin>>x1>>y1>>x2>>y2>>x3>>y3>>x4>>y4;
            ///单独对第一次操作进行统计 
            ll sw=n*m/2;//w
            if((n*m)&1)
                sw++;
            sw+=(x2-x1+1)*(y2-y1+1)-area(x1,y1,x2,y2);///加上覆盖白后增加的S
            ///单独对第二次操作进行统计 
            ll fullblack=area(x3,y3,x4,y4);
            ///面积交的部分 
            ll Sjiao=cross(x1,y1,x2,y2,x3,y3,x4,y4);
            ///处理答案 
            ll ans=sw-fullblack-Sjiao;
            cout<<ans<<" "<<n*m-ans<<endl;
        }
        return 0;
    }
    View Code
  • 相关阅读:
    LoRa硬件调试-前导码
    LoRaWAN调试踩坑心得(二)
    LoRaWAN调试踩坑心得(一)
    LoRaWAN_stack移植笔记(七)_数据包的接收发送
    LoRaWAN协议(七)--完整数据流程
    Android Studio Error while executing: am start -n错误解决方案
    Spring系列(八)
    并发工具类简介
    CAS
    多线程基础(一)线程创建
  • 原文地址:https://www.cnblogs.com/starve/p/12014047.html
Copyright © 2011-2022 走看看