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
  • 相关阅读:
    PSP
    【探路者】Final发布
    【探路者】final贡献分配
    【探路者】第六周立会报告6(总第39次)
    【探路者】第六周立会报告5(总第38次)
    【探路者】第六周立会报告4(总第37次)
    "Hello World!"团队负责人领跑衫感言
    PSP总结报告
    软件工程第十二次作业——例行报告
    Final阶段中间产物
  • 原文地址:https://www.cnblogs.com/starve/p/12014047.html
Copyright © 2011-2022 走看看