鄙人不才,此中鄙陋甚多,望海涵!!!
法1: :贪心求最大相交区间和
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
const int M=4010;
struct R
{
int l,r;
bool operator <(const R &W)const
{
return l<W.l;
}
}range[M];
int main()
{
int n;
cin>>n;
for(int i=1;i<=2*n;i++)
{
int x,y;
scanf("%d%d",&x,&y);
range[i]={x,y};
}
int sum=0;
sort(range+1,range+2*n+1);
int l=range[1].l,r=range[1].r;
for(int i=2;i<=2*n;i++)
{
if(r>=range[i].l)
{
sum+=r-range[i].l;
if(r>=range[i].r) sum-=r-range[i].r;
else r=range[i].r;
}
else r=range[i].r;
}
cout<< sum <<endl;
return 0;
}
法2: :模拟,由于数据范围较小,我们可以直接遍历O(n方)
的复杂度,问题不大
#include<iostream>
#include<algorithm>
#include<algorithm>
using namespace std;
const int N=2010;
struct range
{
int l,r;
}ra[N],rb[N];
int main()
{
int n;
cin>>n;
for(int i=0;i<n;i++)
{
int l,r;
scanf("%d%d",&l,&r);
ra[i]={l,r};
}
for(int i=0;i<n;i++)
{
int l,r;
scanf("%d%d",&l,&r);
rb[i]={l,r};
}
int sum=0;
for(int i=0;i<n;i++)
{
int l=ra[i].l,r=ra[i].r;
for(int j=0;j<n;j++)
{
int x=rb[j].l,y=rb[j].r;
if(l>=x && l<=y)
{
if(r>=y) sum+=y-l;
else sum+=r-l;
}
else if(l<=x && r>=x)
{
if(r>=y) sum+=y-x;
else sum+=r-x;
}
}
}
cout<< sum <<endl;
return 0;
}
持续更新中。。。。
我爱你 超总
orz