题目详情
问题描述
给出一个n长的数列,再进行m次询问,每次询问询问两个区间[L1,R1],[L2,R2],
询问数列第L2到R2个数字每一个数在数列第L1到R1个数中有多少个数字不大于它。
输入格式
第一行两个整数n,m
第二行n个整数,表示数列。
接下来m行,每行四个整数L1,R1,L2,R2,意义如上
输出格式
m行,每行R2-L2+1个整数,第一个整数表示第L2个数在数列第L1到R1个数中不大于它的个数,第一个整数表示第L2+1个数在数列第L1到R1个数中不大于它的个数,以此类推
样例输入
5 3
5 2 3 4 1
1 2 3 4
2 3 1 5
1 5 2 3
样例输出
1 1
2 1 2 2 0
2 3
数据规模和约定
n,m<=1000,数列的数字非负且小于1000。
思路
由于本题是多行输入、多行输出,所以我选择了用函数调用的方式,一次输入对应调用一次函数来实现对应输出,个人认为这样不容易乱
具体实现代码中有注释
完整代码实现
import java.util.Scanner;
public class Main{
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int n = scanner.nextInt(); //数据序列一行n个整数
int []num = new int[n];
int m = scanner.nextInt(); //m行数据
int [][]arr = new int[m][4]; //L1 R1 L2 R2
for (int i=0;i<n;i++){ //输入n个数据
num[i] = scanner.nextInt();
}
for(int i=0;i<m;i++){ //循环输入m行
for (int j=0;j<4;j++){ //每行循环输入4个数字L1 R1 L2 R2
arr[i][j] = scanner.nextInt();
}
}
int row = 0;
while(row < m){ //控制循环输出m行
print(num,arr,row); //以调用函数次数 每次调用打印一行数据
System.out.println();
row++;
}
}
private static void print(int[] num, int[][] arr, int row) {
int point = arr[row][2] - 1; //L2 --作为下标在num数组中定位用来比较的数
for (int i = 0;i<arr[row][3] - arr[row][2] + 1;i++){ //控制一行输出的数字个数R2-L2+1
int count = 0;
for (int j = arr[row][0] - 1; j <= arr[row][1] - 1; j++) { //每个输出的整数比较的次数R1-L1
if(num[j] <= num[point]){
count++;
}
}
point++; //L2+1 ……
System.out.print(count+" ");
if(point >= num.length){ //
break;
}
}
}
}