• 离散化


    离散化

    +++

    区间和

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

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

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

    输入格式

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

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

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

    输出格式

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

    数据范围

    −1e9≤x≤1e9,
    1≤n,m≤1e5,
    −1e9≤l≤r≤1e9,
    −10000≤c≤10000

    输入样例:

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

    输出样例:

    8
    0
    5
    

    离散化即将值域大的数据映射到值域小的连续的集合中来操作。

    我们可以首先把要离散化的数据存放在vector中,然后经过排序去重的操作后,通过二分匹配数据对应的下标将其映射到1~n上,然后进行操作。

    AC CODE
    #include <iostream>
    #include <vector>
    #include <algorithm>
    
    using namespace std;
    
    typedef pair<int, int> PII;
    
    const int N = 300010;
    
    int n, m;
    int s[N], a[N];
    vector<int> alls;
    vector<PII> add, query;
    
    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 r + 1;
    }
    
    int main()
    {
        scanf("%d%d", &n, &m);
        
        while (n -- )
        {
            int x, c;
            scanf("%d%d", &x, &c);
            
            alls.push_back(x);
            add.push_back({x, c});
        }
        
        while (m -- )
        {
            int l, r;
            scanf("%d%d", &l, &r);
            
            alls.push_back(l);
            alls.push_back(r);
            query.push_back({l, r});
        }
        
        //去重
        sort(alls.begin(), alls.end());
        alls.erase(unique(alls.begin(), alls.end()), alls.end());
        
        for (auto x : add)
        {
            int t = find(x.first);
            
            a[t] += x.second;
        }
        
        for (int i = 1; i <= alls.size(); i ++ ) s[i] = s[i - 1] + a[i];
        
        for (auto x : query)
        {
            int l = find(x.first), r = find(x.second);
            
            printf("%d
    ", s[r] - s[l - 1]);
        }
        
        return 0;
    }
    
  • 相关阅读:
    Linux下校验下载文件的完整性(MD5,SHA1,PGP)
    十六进制字节 & 十六进制转二进制
    session & cookie
    php与mysql的链接到底用mysql 还是mysqli,pdo
    php连接数据库时候的字符集设置
    Prepared statements(mysqli & pdo)
    shell脚本中执行mysql命令
    centos系统字符编码问题
    实用crontab命令
    shell获取用户输入
  • 原文地址:https://www.cnblogs.com/scl0725/p/13926806.html
Copyright © 2020-2023  润新知