(双指针) O(n)
分别枚举H,W区间,i,j往前不后退。
看注释应该就是思路
C++ 代码
#include <bits/stdc++.h>
using namespace std;
const int N = 2e3+10;
int n;
typedef pair<int,int> PLL;
PLL H[N],W[N];
long long res;
int main()
{
cin>>n;
for(int i=1;i<=n;i++){
int a,b;
cin>>a>>b;
H[i] = {a,b};
}
for(int i=1;i<=n;i++){
int a,b;
cin>>a>>b;
W[i] = {a,b};
}
for(int i=1,j=1;i<=n;i++)//枚举H区间
{
while(j<=n)//枚举W区间
{
int x1 = H[i].first,y1 = H[i].second;
int x2 = W[j].first,y2 = W[j].second;
if(y2<x1)j++;//如果W区间小于H区间 j++
else if(y1<x2)break;//如果H区间小于W区间 退出while使i++
else
{
int yy = min(y1,y2),xx=max(x1,x2);
res +=yy-xx;//加上交集
if(y1>y2){
j++;
continue;//H为大的区间保留让j++,以防下一个区间继续有交集
}
break;//W为大的区间保留退出while使i++,以防下一个区间继续有交集
}
}
}
cout<<res<<endl;
}