1. 程式人生 > >2018年山東省第九屆acm省賽F題,容斥原理

2018年山東省第九屆acm省賽F題,容斥原理

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll mod=1e9+7;
int main()
{
    ll n,l1,l2,l3,l4,r1,r2,r3,r4,tp1l,tp2l,tp1r,tp2r,ans;
    scanf("%lld\n",&n);
    while(n--&&scanf("%lld%lld%lld%lld%lld%lld%lld%lld",&l1,&r1,&l2,&r2,&l3,&r3,&l4,&r4)!=EOF)
    {
        ans=(r1-l1+1)*(r2-l2+1)%mod;
        ans=ans*(r3-l3+1)%mod;
        ans=ans*(r4-l4+1)%mod;
        //1==2
        tp1l=max(l1,l2);
        tp1r=min(r1,r2);
        if(tp1l<=tp1r)
            ans=((ans-(tp1r-tp1l+1)*(r3-l3+1)%mod*(r4-l4+1)%mod)%mod+mod)%mod;
        //2==3
        tp1l=max(l3,l2);
        tp1r=min(r3,r2);
        if(tp1l<=tp1r)
            ans=((ans-(tp1r-tp1l+1)*(r1-l1+1)%mod*(r4-l4+1)%mod)%mod+mod)%mod;
        //3==4
        tp1l=max(l3,l4);
        tp1r=min(r3,r4);
        if(tp1l<=tp1r)
            ans=((ans-(tp1r-tp1l+1)*(r1-l1+1)%mod*(r2-l2+1)%mod)%mod+mod)%mod;
        //4==1
        tp1l=max(l1,l4);
        tp1r=min(r1,r4);
        if(tp1l<=tp1r)
            ans=((ans-(tp1r-tp1l+1)*(r3-l3+1)%mod*(r2-l2+1)%mod)%mod+mod)%mod;
        //1==2 2==3
        tp1l=max(l1,max(l3,l2));
        tp1r=min(r1,min(r3,r2));
        if(tp1l<=tp1r)
            ans=(ans+(tp1r-tp1l+1)*(r4-l4+1)%mod)%mod;
        //1==2 3==4
        tp1l=max(l1,l2);
        tp1r=min(r1,r2);
        tp2l=max(l3,l4);
        tp2r=min(r3,r4);
        if(tp1l<=tp1r&&tp2l<=tp2r)
            ans=(ans+(tp1r-tp1l+1)*(tp2r-tp2l+1)%mod)%mod;
        //1==2 4==1
        tp1l=max(l1,max(l4,l2));
        tp1r=min(r1,min(r4,r2));
        if(tp1l<=tp1r)
            ans=(ans+(tp1r-tp1l+1)*(r3-l3+1)%mod)%mod;
        //2==3 3==4
        tp1l=max(l4,max(l3,l2));
        tp1r=min(r4,min(r3,r2));
        if(tp1l<=tp1r)
            ans=(ans+(tp1r-tp1l+1)*(r1-l1+1)%mod)%mod;
        //2==3 1==4
        tp1l=max(l3,l2);
        tp1r=min(r3,r2);
        tp2l=max(l1,l4);
        tp2r=min(r1,r4);
        if(tp1l<=tp1r&&tp2l<=tp2r)
            ans=(ans+(tp1r-tp1l+1)*(tp2r-tp2l+1)%mod)%mod;
        //3==4 4==1
        tp1l=max(l4,max(l3,l1));
        tp1r=min(r4,min(r3,r1));
        if(tp1l<=tp1r)
            ans=(ans+(tp1r-tp1l+1)*(r2-l2+1)%mod)%mod;
        //1==2==3==4
        tp1l=max(l4,max(max(l2,l3),l1));
        tp1r=min(r4,min(min(r2,r3),r1));
        if(tp1l<=tp1r)
            ans=((ans-(tp1r-tp1l+1)*3)%mod+mod)%mod;
        printf("%lld\n",ans);
    }
    return 0;
}


/***************************************************
User name: 楊凡
Result: Accepted
Take time: 0ms
Take Memory: 184KB
Submit time: 2018-05-07 23:14:40
****************************************************/