首页 > 编程语言 >基础算法:离散化实现

基础算法:离散化实现

时间:2023-09-28 21:44:54浏览次数:28  
标签:10 int 基础 back mid 离散 算法 alls include

1、离散化

值域大而数值稀疏的题目,通常先将需要操作的数映射到一个数组中,再做后续操作,可以大大减少时间复杂度。

以AcWing.802为例,是一个典型的前缀和问题,但问题在于,若仅仅使用前缀和算法,时间复杂度会很高,因此需要先做离散化映射。

题目要求如下:

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

#include <iostream>
#include <map>
#include <vector>
#include <algorithm>
using namespace std;

const int N = 3e5 + 10;
typedef pair<int, int> PII;

vector<PII> add;
multimap<int, int> query;

vector<int> alls;

int a[N], s[N];

//找到alls对应的x, l, r元素的首个下标,二分查找
int find(int x) {
    int l = 0, r = alls.size() - 1;
    
    while (l < r) {
        int mid = (l + r) >> 1;
        if (alls[mid] >= x) r = mid;
        else l = mid + 1;
    }
    
    return l;
}

int main() {
    int n, m;
    cin >> n >> m;
    
    int x, c;
    while (n--) {
        cin >> x >> c;
        add.push_back(make_pair(x, c));
        alls.push_back(x);
    }

    int l, r;
    while (m--) {
        cin >> l >> r;
        query.insert({ l, r });
        alls.push_back(l);
        alls.push_back(r);
    }

    //alls排序、去重
    sort(alls.begin(), alls.end());
    alls.erase(unique(alls.begin(), alls.end()), alls.end());

    //生成前缀和
    for (auto _a : add) {
        int idx = find(_a.first);
        a[idx + 1] += _a.second;
    }
    for (int i = 1; i <= alls.size(); i++) {
        s[i] = s[i - 1] + a[i];
    }

    for (auto _q : query) {
        int _r = find(_q.second) + 1;
        int _l = find(_q.first) + 1;
        cout << s[_r] - s[_l - 1] << endl;
    }

    return 0;
}

 

标签:10,int,基础,back,mid,离散,算法,alls,include
From: https://www.cnblogs.com/karinto/p/17736534.html

相关文章

  • Python 中的字符串基础与应用
    在Python中,字符串可以用单引号或双引号括起来。'hello'与"hello"是相同的。您可以使用print()函数显示字符串文字:示例:print("Hello")print('Hello')将字符串分配给变量是通过变量名后跟等号和字符串完成的:示例a="Hello"print(a)多行字符串您可以使用三个引号将多......
  • [算法分析与设计] 1. 全源最短路近似
    全源最短路(APSP)近似。有两种近似stretch\(k\).\(\delta(u,v)\leqd(u,v)\leqk\cdot\delta(u,v)\).surplus\(t\).\(\delta(u,v)\leqd(u,v)\leq\delta(u,v)+t\).其中,\(\delta(u,v)\)表示\(u,v\)间真实的最短路长度。先来考虑无权图上的surplus......
  • CSS 基础 4 - CSS 常用单位
    CSS基础4-CSS常用单位px:基础单位em:相对当前父容器的系数,可以累乘rem:相对根<html>的系数,方便计算vw/vh:viewportwidth/height,整个浏览器的大小,取值范围1-100如100vh,占满高度,如果出现滚动条,是因为body预设的padding和margin如30%宽度的侧边栏:height:100vh;......
  • 10分钟巩固多线程基础
    10分钟巩固多线程基础前言多线程是并发编程的基础,本篇文章就来聊聊多线程我们先聊聊概念,比如进程与线程,串行、并行与并发再去聊聊线程的状态、优先级、同步、通信、终止等知识进程与线程什么是进程?操作系统将资源分配给进程,使用进程进行调度,但进程遇到阻塞任务时,为了提升CP......
  • CSS 基础 3 - 定位 Postion 属性
    CSS基础3-定位Postion属性staticposition属性的默认值,元素随HTML流移动top/left/right/bottom属性无效relative和static类似,元素随HTML流移动。区别:比static多了top/left/right/bottom(设定偏移量)【父相子绝】【可以作为父元素,让内部的absolute元素根......
  • 巩固系统韧性三个基础策略
    众所周知我所在的团队常年解决线上问题,我也以为我们会在解决一个个具体问题的道路上无聊走到黑。但是最近出现的各种疑难杂症似乎让我们的工作有了一点乐趣,甚至有了更高级的意义。这些疑难杂症包括但不限于因为网络故障导致邮件发送失败因为数据库磁盘满导致数据出现了读写不......
  • 2023-2024-1 20231302 《计算机基础与程序设计》第一周学习总结
    作业信息这个作业属于计算机基础与程序设计https://edu.cnblogs.com/campus/besti/2023-2024-1-CFAP/作业要求https://www.cnblogs.com/rocedu/p/9577842.html#WEEK01作业目标快速浏览一遍教材计算机科学概论,课本每章提出至少一个自己不懂的或最想解决的问题并在期......
  • 学期2023-2024-1 学号20231309 《计算机基础与程序设计》第一周学习总结
    学期2023-2024-1学号20231309《计算机基础与程序设计》第一周学习总结作业信息这个作业属于哪个课程2022-2023-1-计算机基础与程序设计这个作业要求在哪里2023-202341计算机基础与程序设计第一周作业这个作业的目标作业正文学期2023-2024-1学号20231309《......
  • 机床控制更换刀具小算法
    很简单的一个小算法,大家看图分析分析下就懂了,感觉已经写的很清楚了,就不多说了。 主要的是上面的顺逆换刀判断,下面是我写的应用程序,可以参考下(可能描述的不太清楚,勉强看看吧,哈哈!!也是很简单的) 三菱SFC逆时针换刀程序:三菱SFC顺时针换刀程序:  本文章为原创作品,各路大佬......
  • 零基础Python经验体验代码检查工具
    作者:yd_257945187原文链接:<https://bbs.huaweicloud.com/blogs/411648>1 开发小白自述年初,我开始从java语言转战Python语言的开发,对于零基础python经验的人来说,要开发出高质量且安全性能高的Python代码最好的方式莫过于使用代码检查工具辅助了。它们不仅能使工作更加简单、还能够......