额。。这个题刚开始是想将围棋课的时间标记为1,将编程课标记为2,然后根据结束时间来排个序,选取结束时间最短的那一个时间作为先上的课,然后其他就搜其他课开始时间与这个课结束时间差的最大值。然后呢WA在了第七组测试数据上了,想了一下,会不会是因为最短的结束时间相同的有好几个,两门课都有,如果只选a[0]的话,那样,就不能确定是时间是最大的了,因为a[0]所在的课中有可能有一个最晚的开始时间。。。然后事实证明,我的想法还是差一点。然后最后的思路是,将围棋课的最小结束时间记录下来,和编程的开始时间比,最后得到一个max。然后将编程课的最小时间记录下来,和围棋课的开始时间比,得到一个max,取最大的一个max就好了。
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
using namespace std;
#define maxn 200000+10
struct zb
{
long long bg,ed;
};
zb a[maxn],bb[maxn];
bool cmp(zb b,zb c)
{
if(b.ed!=c.ed)
return b.ed<c.ed;
}
int main()
{
int n;
scanf("%d",&n);
for(int i=0;i<n;i++)
cin>>a[i].bg>>a[i].ed;
int m;
scanf("%d",&m);
for(int i=0;i<m;i++)
cin>>bb[i].bg>>bb[i].ed;
sort(a,a+n,cmp);
long long k1=a[0].ed;
sort(bb,bb+m,cmp);
long long k2=bb[0].ed;
long long ans=0;
for(int i=0;i<m;i++)
{
long long temp=ans;
if(bb[i].bg>=k1)
temp=bb[i].bg-k1;
ans=max(temp,ans);
}
for(int i=0;i<n;i++)
{
long long temp=ans;
if(a[i].bg>=k2)
temp=a[i].bg-k2;
ans=max(temp,ans);
}
cout<<ans<<endl;
return 0;
}