栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

【刷题】基础算法——离散化:区间和

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

【刷题】基础算法——离散化:区间和


对x和查询的l、r进行离散化,对于离散化后的数据进行前缀和。

#include 
#include 
#include 
using namespace std;

int n, m;
int a[300005], s[300005];

vector> add;
vector> query;
vector axis;

int find(int x) {
    int l = 0, r = axis.size() - 1;
    while(l < r) {
        int mid = l + r >> 1;
        if (axis[mid] >= x) r = mid;
        else l = mid + 1;
    }
    return r + 1;
}

int main() {
    scanf("%d%d", &n, &m);
    int x, c;
    for (int i = 1; i <= n; i ++ ) {
        scanf("%d%d", &x, &c);
        add.push_back({x, c});
        axis.push_back(x);
    }
    
    int l, r;
    for (int i = 1; i <= m; i ++ ) {
        scanf("%d%d", &l, &r);
        axis.push_back(l);
        axis.push_back(r);
        query.push_back({l, r});
    }
    sort(axis.begin(), axis.end());
    axis.erase(unique(axis.begin(), axis.end()), axis.end());
    
    for (auto item : add) {
        int x = find(item.first);
        a[x] += item.second;
    }
    
    for (int i = 1; i <= axis.size(); i ++ ) {
        s[i] += s[i - 1] + a[i];
    }
    
    for (auto q : query) {
        int l = find(q.first), r = find(q.second);
        printf("%dn", s[r] - s[l - 1]);
    }
    
    return 0;
}
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/718073.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号