#include<bits/stdc++.h> //类似于容斥原理的思想;
using namespace std;
long long l1,r1,l2,r2,l3,r3,l4,r4,ans;
const long long mod=1e9+7;
int main()
{
int t;
scanf("%d",&t);
while(t--){
ans=0;
scanf("%lld%lld%lld%lld%lld%lld%lld%lld",&l1,&r1,&l2,&r2,&l3,&r3,&l4,&r4);
ans=(ans+(r1-l1+1)%mod*(r2-l2+1)%mod)%mod;
ans=ans*((r3-l3+1)%mod)%mod;
ans=ans*((r4-l4+1)%mod)%mod;
if(min(r1,r2)-max(l1,l2)+1>0) ans=(ans+mod-(min(r1,r2)-max(l1,l2)+1)%mod*(r3-l3+1)%mod*(r4-l4+1)%mod)%mod;
if(min(r1,r4)-max(l1,l4)+1>0) ans=(ans+mod-(min(r1,r4)-max(l1,l4)+1)%mod*(r2-l2+1)%mod*(r3-l3+1)%mod)%mod;
if(min(r2,r3)-max(l2,l3)+1>0) ans=(ans+mod-(min(r2,r3)-max(l2,l3)+1)%mod*(r1-l1+1)%mod*(r4-l4+1)%mod)%mod;
if(min(r3,r4)-max(l3,l4)+1>0) ans=(ans+mod-(min(r3,r4)-max(l3,l4)+1)%mod*(r1-l1+1)%mod*(r2-l2+1)%mod)%mod;
if(min(min(r1,r2),r3)-max(max(l1,l2),l3)+1>0) ans=(ans+(min(min(r1,r2),r3)-max(max(l1,l2),l3)+1)%mod*(r4-l4+1)%mod)%mod;
if(min(min(r1,r3),r4)-max(max(l1,l3),l4)+1>0) ans=(ans+(min(min(r1,r3),r4)-max(max(l1,l3),l4)+1)%mod*(r2-l2+1)%mod)%mod;
if(min(min(r1,r2),r4)-max(max(l1,l2),l4)+1>0) ans=(ans+(min(min(r1,r2),r4)-max(max(l1,l2),l4)+1)%mod*(r3-l3+1)%mod)%mod;
if(min(min(r2,r3),r4)-max(max(l2,l3),l4)+1>0) ans=(ans+(min(min(r2,r3),r4)-max(max(l2,l3),l4)+1)%mod*(r1-l1+1)%mod)%mod;
if(min(r1,r2)-max(l1,l2)+1>0&&min(r3,r4)-max(l3,l4)+1>0) ans=(ans+(min(r1,r2)-max(l1,l2)+1)%mod*(min(r3,r4)-max(l3,l4)+1)%mod)%mod;
if(min(r3,r2)-max(l3,l2)+1>0&&min(r1,r4)-max(l1,l4)+1>0) ans=(ans+(min(r3,r2)-max(l3,l2)+1)%mod*(min(r4,r1)-max(l1,l4)+1)%mod)%mod;
if(min(min(r1,r2),min(r3,r4))-max(max(l1,l2),max(l3,l4))+1>0) ans=(ans-3*(min(min(r1,r2),min(r3,r4))-max(max(l1,l2),max(l3,l4))+1)%mod+mod)%mod;
printf("%lld\n",ans%mod);
}
return 0;
}
【第九届浪潮杯山东省大学生程序设计竞赛】F题 Four-tuples
最新推荐文章于 2025-12-19 15:31:04 发布
本文介绍了一个基于容斥原理的算法,用于解决四个区间交集的问题,并通过C++代码实现了该算法。该算法利用了模运算和区间长度计算来处理多个区间之间的交并补操作。
5385

被折叠的 条评论
为什么被折叠?



