当前位置: 首页 > news >正文

离散化区间和 java c++

文章目录

        • 题面
        • 解题思路
        • java
        • cpp

题面

题目链接:点击传送

假定有一个无限长的数轴,数轴上每个坐标上的数都是 0。
现在,我们首先进行 n 次操作,每次操作将某一位置 x 上的数加 c。
接下来,进行 m 次询问,每个询问包含两个整数 l 和 r,你需要求出在区间 [l,r] 之间的所有数的和。

解题思路
  1. 将所有 增加数值的下标 和 需要查询区间的两端下标 存起来
  2. 下标排序为增序
  3. 4和5 建立 下标-值 键值对
  4. 模拟增加过程,将 下标 对应的 键值 增加
  5. 查询模拟为增加 0 值
  6. 前缀和操作
  7. 查询,通过二分找到其对应下标前缀和相减得到结果
java
import java.util.*;public class Main {public static int N = 300100;public static int[] s = new int[N];public static void main(String[] args) {Scanner sc = new Scanner(System.in);int n =sc.nextInt(), m = sc.nextInt();int[][] query = new int[N/3][2];Map<Integer, Integer> mp = new TreeMap<>();for (int i = 1; i <= n; i ++ ) {int x = sc.nextInt(), y = sc.nextInt();mp.put(x, mp.getOrDefault(x, 0) + y);}for (int i = 1; i <= m; i ++ ) {int x = sc.nextInt(), y = sc.nextInt();query[i][0] = x;query[i][1] = y;mp.putIfAbsent(x, 0);mp.putIfAbsent(y, 0);}List<Integer> idx = new ArrayList<>(mp.keySet());for (int i = 0; i < idx.size(); i ++ ) s[i + 1] = s[i] + mp.get(idx.get(i));for (int i = 1; i <= m; i ++ ) {int l = find(idx, query[i][0]), r = find(idx, query[i][1]);System.out.println(s[r + 1] - s[l]);}}public static int find(List<Integer> idx, int x) {int l = 0, r = idx.size() - 1;while (l < r) {int mid = (l + r) >> 1;if (idx.get(mid) < x) l = mid + 1;else r = mid;}return r;}
}
cpp
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <string>
#include <vector>using namespace std;
using LL = long long;
using PII = pair<int, int>;const int N = 3e5 + 10;int n, m;
LL a[N], pref[N];vector<int> idx;
vector<PII> add, query;int find(int k){int l =0, r=idx.size()-1;while(l < r){int mid = (l + r) >> 1;if(idx[mid] < k) l = mid + 1;else r = mid;}return r + 1;
} int main(){cin >> n >> m;for(int i=0; i<n; i++) {int x, k;cin >> x >> k;add.push_back({x, k});idx.push_back(x);}for(int i=0; i<m; i++) {int l, r;cin >> l >> r;query.push_back({l, r});idx.push_back(l);idx.push_back(r);}sort(idx.begin(), idx.end());idx.erase(unique(idx.begin(), idx.end()), idx.end());for(auto& p : add) {int x = find(p.first);a[x] += p.second;}for(int i=1; i<=idx.size(); i++) pref[i] += pref[i-1] + a[i];for(auto& p : query) {int l = find(p.first), r=find(p.second);cout << pref[r] - pref[l-1] << endl;}return 0;
}
http://www.xdnf.cn/news/81055.html

相关文章:

  • Springboot整合MyBatisplus和快速入门
  • lspci的资料
  • crewai与langchain分析某公司股票是否可购买
  • prtobuf的原理
  • 2.Spring MVC与WebFlux响应式编程
  • UOS+N 卡 + CUDA 环境下 X86 架构 DeepSeek 基于 vLLM 部署与 Dify 平台搭建指南
  • Nature Communications 面向形状可编程磁性软材料的数据驱动设计方法—基于随机设计探索与神经网络的协同优化框架
  • 30分钟编写十大排序算法完成
  • 施磊老师基于muduo网络库的集群聊天服务器(四)
  • 含锡废水具有显著的回收价值
  • kvm下的ceph主机启动io请求统计
  • AOSP Android14 Launcher3——RecentsView最近任务数据加载
  • Hive学习
  • 【数字图像处理】立体视觉基础(1)
  • 禁止ubuntu自动更新
  • 基于nlohmann/json 实现 从C++对象转换成JSON数据格式
  • c++内存池
  • 调整IntelliJ IDEA中当前文件所在目录的显示位置
  • 可吸收聚合物:医疗科技与绿色未来的交汇点
  • 解决IntelliJ IDEA配置文件(application.properties)中文注释变成乱码的问题
  • linux驱动---视频播放采集架构介绍
  • 2025年数字媒体设计与文化交流国际会议 (DMACE 2025)
  • 【Python进阶】VSCode Python开发完全指南:从环境配置到高效调试
  • 【数据结构和算法】5. 堆栈和队列
  • Android Retrofit原理解析
  • map和set
  • 如何让 vscode jupyter 访问 terminal 的环境变量?
  • 【医学影像 AI】基于 AI 的远程筛查 ROP 效果评价
  • UML-网络媒体教学系统顺序图深度解析
  • Springboot+Vue实现邮箱验证功能(邮箱登录+忘记密码)