蓝桥杯:比较
问题描述
给出一个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
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner input=new Scanner(System.in);
int n=input.nextInt();
int m=input.nextInt();
int a[]=new int[n];//表示数列
for (int i=0;i<n;i++){
a[i]=input.nextInt();
}
int [][]b=setArray(m,input);//用二维数组存储代表区间的数据,一共m行,L1,R1,L2,R2
comparable(a, b);
}
public static void comparable(int a[],int b[][]){
for (int i=0;i<b.length;i++){
int l1=b[i][0];
int r1=b[i][1];
int l2=b[i][2];
int r2=b[i][3];
int k=0;//初始化
//创建一个数组存储R1~L1区间的数据
int []c=new int[r1-l1+1];
for (int j=l1-1;j<r1;j++){
c[k]=a[j];
k++;
}
k=0;//初始化
//创建一个数组存储R2~L2区间中的数据
int []d=new int[r2-l2+1];
for (int j=l2-1;j<r2;j++){
d[k]=a[j];
k++;
}
//每行R2-L2+1个整数,第一个整数表示第L2个数在数列第L1到R1个数中不大于它的个数
for (int l=0;l<r2-l2+1;l++){
int n=0;
int count=0;
while (n<c.length){
if (d[l]>=c[n]){//比较R2-L2区间中的每一个数是否都大于或等于R1~L1中的每个数
count++;//大于或等于就加一
}
n++;
}
System.out.print(count+" ");
}//至此,一个区间取完,在进行下一个区间
System.out.println("\r");//换行输出
}
}
//创建数组
public static int[][] setArray(int m,Scanner input){
int [][]b=new int[m][4];
for (int i=0;i<m;i++){
for (int j=0;j<4;j++){
b[i][j]=input.nextInt();
}
}
return b;
}
}