AC代码
#include #define ll long longconst int maxn=1e6+10;using namespace std;inline ll paintw(ll x1,ll y1,ll x2,ll y2){ ll n=x2-x1+1; ll m=y2-y1+1; // 左下角是黑色,向下取整 if((x1+y1)&1) return n*m/2; // 左下角是白色,向上取整 else return (n*m+1)/2;}inline ll paintb(ll x1,ll y1,ll x2,ll y2){ ll n=x2-x1+1; ll m=y2-y1+1; return n*m-paintw(x1,y1,x2,y2);}int main(int argc, char const *argv[]){ int t; ll n,m; cin>>t; ll x1,x2,x3,x4; ll y1,y2,y3,y4; while(t--) { cin>>n>>m; cin>>x1>>y1>>x2>>y2; cin>>x3>>y3>>x4>>y4; // 求出第一块区域的黑色数量和第二块区域的白色数量 ll b1=paintb(x1,y1,x2,y2); ll w2=paintw(x3,y3,x4,y4); ll answ; // 左下角一定是白色,所以整个区域的白色数量向上取整 // 第一块的白色数量增加b1,第二块白色数量较少w2 answ=(n*m+1)/2+b1-w2; ll minx=min(x2,x4);ll maxx=max(x1,x3); ll miny=min(y2,y4);ll maxy=max(y1,y3); // 如果两区域有相交的部分,把该部分变成黑色 if(minx>=maxx&&miny>=maxy) answ-=paintb(maxx,maxy,minx,miny); cout< <<" "< <