#求区间和(Java实现)题目:
假定有一个无限长的数轴,数轴上每个坐标上的数都是 0。
现在,我们首先进行 n 次操作,每次操作将某一位置 x 上的数加 c。
接下来,进行 m 次询问,每个询问包含两个整数 l 和 r,你需要求出在区间 [l,r] 之间的所有数的和。
输入格式
第一行包含两个整数 n 和 m。
接下来 n 行,每行包含两个整数 x 和 c。
再接下来 m 行,每行包含两个整数 l 和 r。
输出格式
共 m 行,每行输出一个询问中所求的区间内数字和。
数据范围
−10^ 9≤ x ≤ 10^ 9,
1≤n,m≤10^5,
−10^ 9≤ l ≤ r ≤ 10^ 9,
−10000≤c≤10000
##解题思维:
此题要运用离散化思维,将x,l,r各下标离散化,因为其本来的数轴是无限长的,不可能设置那么长的一个数组来存储所有数据,但n,m都是大于1小于10^ 5的,所以下标个数最多有3*10^5,可以用一个数组alls存储所有离散化后的坐标。
所以此题总共可以分为五个步骤:
1.输入数据n,m,确定操作和询问的次数
2.输入x,c并添加到数组add中;输入l,r并添加到数组query中;同时把x,l,r存入数组alls离散化
3.将alls数组进行排序(因为要进行二分查找,排序后才有单调性)和去重(alls数组存放的数是数轴上的下标)
4.利用find()函数二分查找离散化后的x对应的下标,并遍历add数组执行操作一
5.再查找离散化后的l,r对应的下标,再遍历query数组通过前缀和计算出l到r之间的数的和,执行查询二
###具体实现代码如下:
package lisanhua;
import java.util.*;
public class qujianhe {
final static int N = 300010;
static int n, m;
static int[] a = new int[N];
static int[] s = new int[N];
static Scanner sc = new Scanner(System.in);
public static void main(String[] args) {
n = sc.nextInt();
m = sc.nextInt(