暴力遍历超时(70分):
import java.util.Scanner;
class Main {
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
int n=sc.nextInt();
int m=sc.nextInt();
int k=sc.nextInt();
int []start=new int[n];
int []need=new int[n];
int []search=new int[m];
for(int i=0;i<n;i++){
start[i]=sc.nextInt();
need[i]=sc.nextInt();
}
for(int i=0;i<m;i++){
search[i]=sc.nextInt()+k;
}
for(int i=0;i<m;i++){
long num=0;
for(int j=0;j<n;j++){
if((search[i]+need[j]-1)<(start[j]+need[j])){
if((search[i]+need[j]-1)>=start[j]){
num+=1;
}
}
}
System.out.println(num);
}
}
}
使用差分法100分:
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
int n=sc.nextInt();//出行计划项目总数
int m=sc.nextInt();//所有查询
int k=sc.nextInt();//检测所需时间
int size=1000086;//设定容量
int []num=new int[size];
for(int i=1;i<=n;i++){//遍历每一个计划项目
int start=sc.nextInt();//获取进入该场所的时间
int need=sc.nextInt();//获取进入该场所所需的检测时效
int left=start-need-k+1;//获取区间的左边界
int right=start-k;//获取区间的右边界
int left_new=Math.max(1,left);//左边界更新,从题目可得最小不会小于1,即:至少取1
if(right>0){
num[left_new]++;//左边界的位置上+1
num[right+1]--;//右边界的位置上-1
}
}
for(int i=1;i<size;i++){
num[i]+=num[i-1];//计算区间的前缀和,获得每个位置的累计值
}
for(int i=0;i<m;i++){
int q=sc.nextInt();//获取查询的数量
System.out.println(num[q]);//输出查询在区间上的累计值
}
}
}