A的空闲时间为[a1 ,b1 ]…[an ,bn ]。
B的空闲时间是[c1 +t,d1 +t]..[cn +t,dn +t],这里t为B的起床时间。这些时间包括了边界点。
B的起床时间为[l,r]的一个时刻。若一个起床时间能使两人聊天至少一次,那么这个时间就是合适的
输入描述:第一行数据四个整数:p,q,l,r(1≤p,q≤50,0≤l≤r≤1000)。接下来p行数据每一行有一对整数ai,bi,q行数据每一行有一对整数ci,di
输出描述:合适的起床时间个数
输入例子:
2 3 0 20
15 17
23 26
1 4
7 11
15 17
输出例子:20
public class Main {
public static void main(String[] args){
Scanner in= new Scanner(System.in);
int p=in.nextInt();//A的空闲时间段数
int q=in.nextInt();//B的空闲时间段数
int l=in.nextInt();//起床时间起点
int r=in.nextInt();//起床时间终点
int maxA=Integer.MIN_VALUE;
int maxB=Integer.MIN_VALUE;
int A[][]=new int[p][2];
int B[][]=new int[q][2];
for(int i=0;i<p;i++){
A[i][0]=in.nextInt();
A[i][1]=in.nextInt();
maxA=Math.max(maxA,A[i][1]);//找到A最后的空闲时间
}
for(int i=0;i<q;i++){
B[i][0]=in.nextInt();
B[i][1]=in.nextInt();
maxB=Math.max(maxB,B[i][1]);//找到B最后的空闲时间
}
in.close();
boolean a[]=new boolean[maxA+1];//A的空闲时间点
boolean b[]=new boolean[maxB+1];//B起床时间为0时的空闲时间点
for(int i=0;i<p;i++){
for(int j=A[i][0];j<=A[i][1];j++){
a[j]=true;
}
}
for(int i=0;i<q;i++){
for(int j=B[i][0];j<=B[i][1];j++){
b[j]=true;
}
}
int count=0;
/*滑动窗口
* 若b起床时间为1,a需要右移1;b起床时间为n,a需要右移n
* 因此a向右滑动窗口,b不动
*/
for(int k=l;k<=r;k++){
for(int i=0;i<=maxB&&k+i<=maxA;i++){//防越界
if(b[i]&&a[i+k]){//两个集合存在交点。
count++;
break;
}
}
}
System.out.println(count);
}
}