首页 > 其他分享 >AcWing 802:区间和 ← 离散化

AcWing 802:区间和 ← 离散化

时间:2024-10-28 23:17:25浏览次数:7  
标签:le int back 离散 alls https 802 ri AcWing

【题目来源】
https://www.acwing.com/problem/content/804/

【题目描述】
假定有一个无限长的数轴,数轴上每个坐标上的数都是 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

【输入样例】
3 3
1 2
3 6
7 5
1 3
4 6
7 8

【输出样例】
8
0
5

【算法分析】
★ 离散化:https://blog.csdn.net/hnjzsyjyj/article/details/143275575
离散化是一种数据处理的技巧,本质上可以看成是一种“哈希”,其保证数据在哈希以后仍然保持原来的“全/偏序”关系。用来离散化的可以是大整数、浮点数、字符串等等。

★ 离散化的本质,是映射。原理是将间隔很大的元素,映射到相邻的位置上,从而减少对空间的需求,也减少计算量。

★ C++ 中 for(auto i:v) 的用法
https://blog.csdn.net/hnjzsyjyj/article/details/132118215

【算法代码】

#include <bits/stdc++.h>
using namespace std;

typedef pair<int,int> PII;
const int maxn=1e5+5;
int a[maxn],s[maxn];
int n,m;
vector<int> alls;
vector<PII> add,query;

int find(int x) { //discretization
    int le=0;
    int ri=alls.size()-1;
    while(le<ri) {
        int mid=(le+ri)>>1;
        if(alls[mid]>=x) ri=mid;
        else le=mid+1;
    }
    return ri+1;
}

int main() {
    cin>>n>>m;
    for(int i=0; i<n; i++) {
        int x,c;
        cin>>x>>c;
        alls.push_back(x);
        add.push_back({x,c});
    }

    for(int i=0; i<m; i++) {
        int le,ri;
        cin>>le>>ri;
        alls.push_back(le), alls.push_back(ri);
        query.push_back({le,ri});
    }

    //de-weight
    sort(alls.begin(),alls.end());
    alls.erase(unique(alls.begin(),alls.end()), alls.end());

    for(auto v:add) {
        int x=find(v.first);
        a[x]+=v.second;
    }

    for(int i=1; i<=alls.size(); i++) {
        s[i]=s[i-1]+a[i]; //prefix sum
    }

    for(auto v:query) {
        int le=find(v.first);
        int ri=find(v.second);
        cout<<s[ri]-s[le-1]<<endl;
    }

    return 0;
}

/*
in:
3 3
1 2
3 6
7 5
1 3
4 6
7 8

out:
8
0
5
*/





【参考文献】
https://www.acwing.com/blog/content/2579/
https://www.acwing.com/solution/content/2321/
https://www.acwing.com/problem/content/solution/804/1/
https://blog.csdn.net/hnjzsyjyj/article/details/143275575



 

标签:le,int,back,离散,alls,https,802,ri,AcWing
From: https://blog.csdn.net/hnjzsyjyj/article/details/143309807

相关文章

  • 一维离散化笔记
    一维离散化笔记通俗来说,一维离散化就是把在无限空间中的有限元素映射到一个线性排列的区间中举个实际的例子说明:存在一个近似无限的空间\([-10^9,10^9]\),我们需要对其中\(10^5\)个离散的元素进行操作显然不可能对这个近似无限的区间进行\(10^5\)次遍历所以需要把这\(10^5\)......
  • XS2186八通道,兼容IEEE802.3at/af以太网供电PSE控制器
    XS2186是一个八通道、供电设备(PSE)电源控制器,设计用于IEEE®802.3at/af兼容PSE。器件提供用电设备(PD)检测、分级、限流以及负载断开检测。器件支持全自动工作、软件编程和外挂eeprom。器件还支持最新二事件分级。采用单电源供电,能够为单个端口提供最高达30......
  • 技术干货 | 如何运用信而泰测试仪实现802.1 QAV协议测试
    一、802.1Qav协议概述:Qav协议的作用是确保传统的异步以太网数据流不会干扰到AVB的实时数据流。AVB交换机把收到的各种数据分类,分别进入不同的转发队列,并重新赋予优先级,其中实时音视频流数据拥有最高优先级。工作原理为了避免冲突需要两种调度算法,一种是基于可信因子的整形算法......
  • PFC离散元数值模拟仿真技术与应用
    随着计算能力的提高和算法的优化,离散元仿真技术得到了快速发展,并在学术界产生了大量研究成果。在PFC离散元计算中无需给定材料的宏观本构关系和对应的参数,这些传统的参数和力学特性在程序中可以自动得到。据调查,运用PFC离散元仿真技术工具近几年发表的论文主要集中在以下几个方......
  • Acwing 338 技术问题
    /*https://www.acwing.com/problem/content/340/给定两个整数a和b,求a和b之间的所有数字中0∼9的出现次数。例如,a=1024,b=1032,则a和b之间共有9个数如下:102410251026102710281029103010311032其中0出现10次,1出现10次,2出现7次,3出现3次等等......
  • acwing第二章算法模板
    17、单链表//head存储链表头,e[]存储节点的值,ne[]存储节点的next指针,idx表示当前用到了哪个节点inthead,e[N],ne[N],idx;//初始化voidinit(){    head=-1;    idx=0;}//在链表头插入一个数avoidinsert(inta){    e[idx]=a,ne[idx]=......
  • acwing第三章算法模板
    29、树与图的存储树是一种特殊的图,与图的存储方式相同。对于无向图中的边ab,存储两条有向边a->b,b->a。因此我们可以只考虑有向图的存储。(1)邻接矩阵:g[a][b]存储边a->b(2)邻接表://对于每个点k,开一个单链表,存储k所有可以走到的点。h[k]存储这个单链表的头结点int......
  • Leetcode 802. 找到最终的安全状态
    1.题目基本信息1.1.题目描述有一个有n个节点的有向图,节点按0到n–1编号。图由一个索引从0开始的2D整数数组graph表示,graph[i]是与节点i相邻的节点的整数数组,这意味着从节点i到graph[i]中的每个节点都有一条边。如果一个节点没有连出的有向边,则该节点是终......
  • 晶尊微电子MC802单片机:专为需要多IO接口的产品设计
    MC802单片机:触控未来,8位高性能与多IO接口的完美结合MC802(2TouchKey+4I/O)MC802是由厦门晶尊微电子科技有限公司(ICman)推出的一款高性能8位单片机,它集成了2个自校正容性触摸按键和4个I/O口,专为需要多IO接口的产品设计而优化。MC802适用于多种应用场景,如遥控器、风扇、灯光控......
  • Leetcode 1802. 有界数组中指定下标处的最大值
    1.题目基本信息1.1.题目描述给你三个正整数n、index和maxSum。你需要构造一个同时满足下述所有条件的数组nums(下标从0开始计数):nums.length==nnums[i]是正整数,其中0<=i<nabs(nums[i]–nums[i+1])<=1,其中0<=i<n-1nums中所有元素之和不超过max......