【区间和(Java实现)】

#求区间和(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(
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值