Acwing---802.区间和

news/2024/12/28 21:13:03/

区间和

  • 1.题目
  • 2.基本思想
  • 3.代码实现

1.题目

假定有一个无限长的数轴,数轴上每个坐标上的数都是 0。

现在,我们首先进行 n 次操作,每次操作将某一位置 x 上的数加 c。

接下来,进行 m次询问,每个询问包含两个整数 l 和 r,你需要求出在区间 [l,r] 之间的所有数的和。

输入格式
第一行包含两个整数 n和 m。

接下来 n 行,每行包含两个整数 x 和 c。

再接下来 m 行,每行包含两个整数 l 和 r。

输出格式
共 m 行,每行输出一个询问中所求的区间内数字和。

数据范围
− 1 0 9 ≤ x ≤ 1 0 9 , −10^9≤x≤10^9, 109x109,

1 ≤ n , m ≤ 1 0 5 , 1≤n,m≤10^5, 1n,m105,

− 1 0 9 ≤ l ≤ r ≤ 1 0 9 , −10^9≤l≤r≤10^9, 109lr109,

− 10000 ≤ c ≤ 10000 −10000≤c≤10000 10000c10000

输入样例:

3 3
1 2
3 6
7 5
1 3
4 6
7 8

输出样例:

8
0
5

2.基本思想

在这里插入图片描述

3.代码实现

 import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Scanner;public class Main {public static void main(String[] args) {Scanner sc = new Scanner(System.in);int n = sc.nextInt(), m = sc.nextInt();int N = 300010;//int[] a = new int[N], s = new int[N];//ArrayList<Integer> alls = new ArrayList<>();//将所有用到的数存到alls数组 可能有重复元素 需要 排序 + 去重List<Pairs> add = new ArrayList<>(); //用来存储n次 操作List<Pairs> query = new ArrayList<>();//用来存储m次 查询for (int i = 0; i < n; i++) {int x = sc.nextInt(), c = sc.nextInt();add.add(new Pairs(x, c));alls.add(x);}for (int i = 0; i < m; i++) {int l = sc.nextInt(), r = sc.nextInt();query.add(new Pairs(l, r));alls.add(l);alls.add(r);}Collections.sort(alls);//排序 int unique = unique(alls);//去重alls.subList(0, unique);//将去重后的List保存下来,截取到不重复的值for (Pairs item : add) {//对应位置加上 cint index = find(item.first, alls);a[index]+=item.second;}//求前缀和for (int i = 1; i <= alls.size(); i++) s[i] = s[i - 1] + a[i];for (Pairs item : query) {int l = find(item.first, alls), r = find(item.second, alls);System.out.println(s[r] - s[l - 1]);}}static int unique(List<Integer> list) {int j = 0;for (int i = 0; i < list.size(); i++) {if (i == 0 || list.get(i) != list.get(i - 1)) {list.set(j, list.get(i));j++;}}return j;}static int find(int x, List<Integer> list) {//二分查找int l = 0, r = list.size() - 1;while (l < r) {int mid = (l + r) >> 1;if (list.get(mid) >= x) r = mid;else l = mid + 1;}return l+1 ;//  +1 便于 之后前缀和计算}
}class Pairs {int first, second;public Pairs(int first, int second) {this.first = first;this.second = second;}
}

http://www.ppmy.cn/news/1340549.html

相关文章

Android悬浮窗实现步骤

最近想做一个悬浮窗秒表的功能&#xff0c;所以看下悬浮窗具体的实现步骤 1、初识WindowManager 实现悬浮窗主要用到的是WindowManager SystemService(Context.WINDOW_SERVICE) public interface WindowManager extends ViewManager {... }WindowManager是接口类&#xff0c…

【NLP冲吖~】一、朴素贝叶斯(Naive Bayes)

0、朴素贝叶斯法 朴素贝叶斯法是基于贝叶斯定理与特征条件独立假设的分类方法。对于给定的训练数据集&#xff0c;首先基于特征条件独立假设学习输入输出的联合概率分布&#xff0c;然后基于此模型&#xff0c;对给定的输入 x x x&#xff0c;利用贝叶斯定理求出后验概率最大的…

如何在Shopee平台上进行手机类目选品?

在Shopee平台上进行手机类目的选品是一个关键而复杂的任务。卖家需要经过一系列的策略和步骤&#xff0c;以确保选品的成功和销售业绩的提升。下面将介绍一些有效的策略&#xff0c;帮助卖家在Shopee平台上进行手机类目选品。 先给大家推荐一款shopee知虾数据运营工具知虾免费…

C# 引用同一个dll不同版本的程序集

因为项目需要所以必须在项目中引用不同版本的同一程序集 我要引用的文件是newtonsoft.json.dll 两个版本为12.0.0.0 和4.0.0.0 1.如果已经先引入了newtonsoft.json 12.0.0.0版本的程序集&#xff0c;如果直接引入另一个版本的程序集的话会提示不成功&#xff0c;所以先将另一个…

c++ 语法指针

指针 1.指针就是一个地址 2. 指针本身也是有地址的 3.取指针所指向的地址保存的值 用变量名取 4.取指针所指向地址保存的值 *变量名取&#xff08;解引用&#xff09; int main(int argc, const char * argv[]) {// insert code here...std::cout << "Hello, …

Leetcode—2670. 找出不同元素数目差数组【简单】

2024每日刷题&#xff08;一零七&#xff09; Leetcode—2670. 找出不同元素数目差数组 哈希表实现代码 class Solution { public:vector<int> distinctDifferenceArray(vector<int>& nums) {unordered_set<int> s;int n nums.size();vector<int&g…

openstack

在虚拟机上安装完openstack之后&#xff0c;根据你想提供的服务&#xff0c;再去安装一些组件(服务)&#xff0c;比如说 (Nova)&#xff1a;用于虚拟机的管理、调度和协调。 (Neutron)&#xff1a;用于管理虚拟网络和网络服务。 (Cinder)&#xff1a;提供块级存储服务&#…

vue 发布自己的npm组件

1、在项目任意位置创建index.ts文件 2、导入要到处的组件&#xff0c;使用vue提供的install 功能全局挂在&#xff1b; import GWButton from "/views/GWButton.vue"; import GWAbout from "/views/AboutView.vue";const components {GWButton,GWAbout, …