首页 > 其他分享 >802. 区间和

802. 区间和

时间:2023-11-03 10:35:02浏览次数:35  
标签:scan int add 109 alls new 区间 802

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

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

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

输入格式

第一行包含两个整数 n� 和 m�。

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

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

输出格式

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

数据范围

−109≤x≤109−109≤�≤109,
1≤n,m≤1051≤�,�≤105,
−109≤l≤r≤109−109≤�≤�≤109,
−10000≤c≤10000−10000≤�≤10000

输入样例:

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

输出样例:

8
0
5
import java.util.*;
public class Main {
    static int N = 300010;//一个N +两个M 所以要开30万

    static List<Integer> alls = new ArrayList<>();//存放的是离散化后的list 实际上就是用来存所有的下标x,l,r;
    static List<Pair> query = new ArrayList<>(), adds = new ArrayList<Pair>();//用来存n次操作 和 m次查询
    static int a[] = new int[N], s[] = new int[N];//a是存放的数值数组  s是前缀和的数组
    public static void main(String[] args){
        Scanner scan = new Scanner(System.in);
        int n = scan.nextInt();//n次操作
        int m = scan.nextInt();//m次询问
         //输入n次操作,每次操作存入add集合中,然后将下标x存入alls集合中
        for(int i = 0 ; i < n ; i++){
            int x = scan.nextInt();
            int c = scan.nextInt();
            alls.add(x);
            adds.add(new Pair(x, c));
        }
        //输入m次询问,每次询问存入query集合中,因为l,r是求和的下标区间和,所以l,r都存入alls集合中。
         for(int i = 0 ; i < m ; i ++ ){
            int l = scan.nextInt();
            int r = scan.nextInt();
            query.add(new Pair(l,r));
            alls.add(l);
            alls.add(r);
        }
          
        // Java的离散化操作
        alls = new ArrayList<>(new HashSet<>(alls));//通过hashset去重
        Collections.sort(alls); //排序,现在alls集合中存的是x,l,r所有值
        //增强for循环 for(元素类型 变量名 : 数组或者集合) 缺点:无下标,简单。
        for(Pair item : adds){
            int index = find(item.first);//
            a[index] += item.second;//
        }

        for(int i = 1 ; i <= alls.size() ; i ++ ) s[i] = s[i-1] + a[i]; //这是前缀和公式代码

        for(Pair item : query){
            int l = find(item.first); // 
            int r = find(item.second); // 
            System.out.println(s[r] - s[l-1]); // 
        }


 
        
    }
    
    //二分查找(find函数中是使用了二分来查找x在alls中的下标+1,因为需要符合我们要用的前缀和公式,
    //要让下标不是从0输出,最低的下标是1,符合前缀和的从1开始,所以输出的值加1)
   static int find(int x) {//寻找第一个大于等于x的数 ||第一个小于等于x的数
        int l = 0, r = alls.size() - 1;
        while(l < r) {
            int mid = l + r + 1 >> 1;
            if(alls.get(mid) <= x)
                l = mid;
            else r = mid - 1;
        }
        return l + 1;
    }
}   
//这是一个Pair类,用来存操作的类
   class Pair{
        int first;
        int second;
        public Pair(int x,int c){
            this.first = x;
            this.second = c;
        }
    }


标签:scan,int,add,109,alls,new,区间,802
From: https://blog.51cto.com/u_16040716/8162045

相关文章

  • P1802-DP【橙】
    1.又是一道因为写了异常剪枝而调了好久的题,以后再也不写异常剪枝了,异常情况压根不该出现,所以针对出现的异常情况进行补救的异常剪枝是一种很容易出错的行为,做为两手准备也就罢了,但第一次写成的代码必须能在没有异常剪枝的情况下算出正确结果才行!2.还提出了一个专门针对记搜的编码......
  • NOIP[区间数据结构类问题]
    平面最近点对经典的分治问题,把所有的点按照\(x\)排序,然后分治处理两个子区间,然后枚举离中心少于已知最小值的点,判断能否出现更小值。intn,temp[250000];structnode{ intx,y;}a[500500];boolcmp(nodel,noder){ if(l.x==r.x)returnl.y<r.y; returnl.x<r.x;}doub......
  • Wi-Fi 6(802.11ax)概要介绍
    Wi-Fi6(802.11ax):下一代无线通信技术的巅峰无线通信技术一直是我们日常生活和工作中不可或缺的一部分,而Wi-Fi6(802.11ax)则代表着下一代无线通信技术的最新巅峰。它是Wi-Fi标准的最新演进,旨在提供更快的速度、更高的容量、更好的性能以及更可靠的连接,以满足不断增长的无线设备和应......
  • Wi-Fi 5(802.11ac)概要介绍
    Wi-Fi5(802.11ac)技术深刻改变了无线通信的格局,带来了更快的速度、更大的容量和更可靠的连接。在本文中,我将探讨Wi-Fi5技术的核心概念,如多用户多输入多输出(MU-MIMO)、波束成形(Beamforming)等,并提供实际示例来说明这些概念的工作原理。第一部分:Wi-Fi5的基础概念1.1Wi-Fi5的背景......
  • 二次函数在区间上的最大(小)值问题
    前言本篇博文适合高一学生和高三一轮学习使用。对于高一学生而言,对初中学习的二次函数\(f(x)\)\(=\)\(ax^2\)\(+\)\(bx\)\(+\)\(c\)\(\quad\)\((a\neq0)\)已经形成了思维定势,总认为其最大值或者最小值是\(f(x)\)\(=\)\(f(-\cfrac{b}{2a})\)\(=\)\(\cfrac{4ac-b^2}{4a}\),很少......
  • 802.11无线网络权威指南学习笔记
    以前在CSDN博客写的,后来不用CSDN,改用cnblogs,没想到在搜索资料时发现了以前被人转载的笔记,做个记录https://blog.csdn.net/machiner1/article/details/41726539......
  • ABC219 H 区间dp 费用提前计算
    ABC219H跟关路灯很像。很容易注意到我们拿走的只能是一个区间,观察n的范围发现区间dp是个好想法。朴素的想法是定义\(f_{i,j,k,0/1}\)为拿走i到j里面的所有数,走了k秒,现在在i/j的方案数。然后发现k太大了。咱当时的想法是希望优化复杂度,把k去掉结果发现不能保证正确性。......
  • 【洛谷 8649】 [蓝桥杯 2017 省 B] k 倍区间
    题目描述给定一个长度为 �N 的数列,�1,�2,⋯��A1​,A2​,⋯AN​,如果其中一段连续的子序列 ��,��+1,⋯��(�≤�)Ai​,Ai+1​,⋯Aj​(i≤j) 之和是 �K 的倍数,我们就称这个区间 [�,�][i,j] 是 �K 倍区间。你能求出数列中总共有多少个 �K 倍区间吗?输入格式第一行包含两个整数 �N 和 �K......
  • 习题专题-计算 某个闭区间 2出现的次数
    计算某个闭区间2出现的次数#include<stdio.h>intmain(){ inti=0; intL=0; intR=0; intcount=0; scanf("%d%d",&L,&R); for(i=L;i<=R;i++) { if(1<i&&i<9) { if(i%10==2) { count++; ......
  • 区间加等比数列
    https://www.luogu.com.cn/problem/U329489给出一个长度为n的数列接下来进行m次操作1lrkai=l~rA[i]+=k*a^(i-l)2lrkai=l~rsumA[i]*k*a^(i-l)最后输出一遍整个序列输出对998244353取模n,m<=1e5,5s操作分块+序列分块首先假设每B次操作......