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

[atcoder abc 371d]1D Country

题目描述

建议在 洛谷 查看。


l l l r r r 区间的和,我们可以使用前缀和或二分等算法解决。

由于坐标 x x x − 1 0 9 ∼ 1 0 9 -10^9 \sim 10^9 109109 之间,所以不能直接使用前缀和。

考虑使用二分,先将坐标从小到大排序。

计算从 l l l r r r 的区间,可以二分出 a a a 中比 l l l 大的值 x x x 和比 r r r 小的值 y y y

用前缀和计算 a a a 的前缀和,输出即可。

#include<bits/stdc++.h>
#define int long long
using namespace std;
int n, m;
struct node{int x, y;
}a[200010];
int b[200010];
//前缀和
long long sum[200010];
//排序
bool cmp(node p, node q){return p.x < q.x;
}
signed main(){scanf("%lld", &n);for(int i = 1; i <= n; ++ i){scanf("%lld", &a[i].x);}for(int i = 1; i <= n; ++ i){scanf("%lld", &a[i].y);}sort(a + 1, a + n + 1, cmp);for(int i = 1; i <= n; ++ i){b[i] = a[i].x;sum[i] = sum[i - 1] + a[i].y;}scanf("%lld", &m);while(m --){int x, y;输入 x, yif(y >= b[n]){y = b[n];}else if(y <= b[1]){x = b[1] - 1;}//二分int t1 = lower_bound(b + 1, b + n + 1, x) - b;int t2 = upper_bound(b + 1, b + n + 1, y) - b;t2 = min(t2, n);while(y < b[t2] && t2){-- t2;}while(x > b[t1] && t1 <= n){++ t1;}输出 sum[t2] - sum[t1 - 1]}return 0;
}

禁止抄袭!!!


http://www.mrgr.cn/news/27384.html

相关文章:

  • bat批量修改文件名
  • MES系统:智能工厂与数字化改造的关键引擎
  • 【devops】devops-git之github使用
  • Spring Boot与gRPC的完美融合:构建高效用户服务与订单服务通信
  • matlab fid = fopen(file_nav,‘rt‘);语句解释
  • 在Windows 10上安装Python 3并设置本地编程环境的方法
  • 【RabbitMQ 项目】服务端数据管理模块之交换机管理
  • Docker技术深度解析与实践应用
  • 如何设置word页码从指定页开始
  • 德之匠信息化阶段模型
  • CCS6 软件及仿真器驱动安装
  • python Open3D 验证安装崩溃
  • Linux文件系统(上)
  • 关系数据库,集合运算符,关系运算符
  • Luban策划开源工具
  • Python Web 应用的部署与运维
  • 20Kg载重30分钟续航多旋翼无人机技术详解
  • JAVA学习笔记01-变量的初始化
  • 第十一周:机器学习笔记
  • 人工智能诱导虚假记忆:MIT最新研究揭示AI与记忆的互动机制