D - 1D Country(AtCoder Beginner Contest 371)

news/2025/1/15 20:38:19/

题目链接:

D - 1D Country (atcoder.jp)

题目描述:

数据范围:

输入输出:

题目分析:

典型的l, r 区间问题,即是前缀和问题,但是注意到数据范围, 数据范围1e-9 到 1e9 数据范围,要是从最小到最大直接for循环去模拟的话,时间复杂度太高了O(2e9),注意到极限总共才2e5个居民,要去想到映射,不在关心他们的位置,而去把下标转换为从1开始的,然后在询问l, r这段区间的时候二分去查到对应的l, r他们映射后的位置,然后用前缀和公式sum[映射后的r] - sum[映射后的l - 1]就是最后的答案,但是我用map去写的时候卡到了最后一个数据,但是用数组就过掉了,why?

最后一个数据没过的代码:

#include<bits/stdc++.h>
#define int long long using namespace std;const int N = 2e5 + 10;map<int, int>mp, ren, sum;
//map<int, int>ren;
int a[N];signed main() {int n, m;cin >> n;for(int i = 1; i <= n; i ++ ) {cin >> a[i];}for(int i = 1; i <= n; i ++ ) {int x;cin >> x;mp[a[i]] += x;}
//	sort(a + 1, a + n + 1);//a[0] = 0;
//	sum[a[1] - 1] = 0;sum[a[1]] = mp[a[1]];for(int i = 2; i <= n; i ++ ) {sum[a[i]] = sum[a[i - 1]] + mp[a[i]]; }
//	for(int i = 1; i <= n; i ++ ) {
//		cout << "a[i] = " << a[i] << " sum = " << sum[a[i]] << endl;
//	}cin >> m;// 二分的是位置 while(m -- ) {int l, r;cin >> l >> r;// 二分第一个大于等于l的位置int ll = 0, rr = n + 1;while(ll + 1 < rr) {int mid = ll + rr >> 1;if(a[mid] < l) ll = mid;else rr = mid;}int st = ll + 1;//	cout << "st = " << st << endl;// 二分最后一个小于等于r的位置 ll = 0, rr = n + 1;while(ll + 1 < rr) {int mid = ll + rr >> 1;if(a[mid] <= r)ll = mid;else rr = mid;}int en = ll;if(r > a[n]) {en = n;}if(l < a[1]) {st = 1;}
//		cout << "st - 1 = " << st - 1 << endl;
//		cout << "a[st - 1] = " << a[st - 1] << endl;
//		cout << "en = " << en << endl;
//		cout << "sumEnd = " << sum[a[en]] << endl;
//		cout << "sumStart = " << sum[a[st - 1]] << endl;if(st == 1) {cout << sum[a[en]] << endl;} else {cout << sum[a[en]] - sum[a[st - 1]] << endl;}}return 0;
}
/*
7
-10 -5 -3 -1 0 1 4
2 5 6 5 2 1 7
1
-10 -4*/

运行结果:

 

正确代码:

#include<bits/stdc++.h>
#define int long long using namespace std;const int N = 2e5 + 10;int a[N], sum[N];signed main() {int n, m;cin >> n;for(int i = 1; i <= n; i ++ ) {cin >> a[i];}for(int i = 1; i <= n; i ++ ) {int x;cin >> x;sum[i] = sum[i - 1] + x;}cin >> m;// 二分的是位置 while(m -- ) {int l, r;cin >> l >> r;// 二分第一个大于等于l的位置int ll = 0, rr = n + 1;while(ll + 1 < rr) {int mid = ll + rr >> 1;if(a[mid] < l) ll = mid;else rr = mid;}int st = ll + 1;//	cout << "st = " << st << endl;// 二分最后一个小于等于r的位置 ll = 0, rr = n + 1;while(ll + 1 < rr) {int mid = ll + rr >> 1;if(a[mid] <= r)ll = mid;else rr = mid;}int en = ll;cout << sum[en] - sum[st - 1] << endl;		}return 0;
}

运行结果:


http://www.ppmy.cn/news/1525661.html

相关文章

使用iperf3测试局域网服务器之间带宽

文章目录 一、下载安装1、windows2、centos 二、使用0、参数详解1、centos 一、下载安装 1、windows https://iperf.fr/iperf-download.php 拉到最下面选最新版&#xff1a; 2、centos yum install iperf3二、使用 0、参数详解 服务器或客户端&#xff1a; -p, --port #…

Python+Pytest框架,“api_key.py文件怎么编写“?

1、在"api_keyword"文件夹下新增"api_key.py" import allure import requests import json import jsonpath from deepdiff import DeepDifffrom config import *allure.title("测试用例执行") class ApiKey:allure.step(">>>:开…

HTTP 协议和 APACHE 服务

WEB 服务基础 Internet 因特网 因特网是 Internet 的中文译名 在 20 世纪 60 年代&#xff08;冷战时期&#xff09;&#xff0c;美国国防部高等研究计划署&#xff08;ARPA&#xff09;出于军事上的目的&#xff0c;建立了 ARPA 网络&#xff0c;该网络由四个分布在不同地方…

大数据新视界 --大数据大厂之Kafka消息队列实战:实现高吞吐量数据传输

&#x1f496;&#x1f496;&#x1f496;亲爱的朋友们&#xff0c;热烈欢迎你们来到 青云交的博客&#xff01;能与你们在此邂逅&#xff0c;我满心欢喜&#xff0c;深感无比荣幸。在这个瞬息万变的时代&#xff0c;我们每个人都在苦苦追寻一处能让心灵安然栖息的港湾。而 我的…

商务办公tips1:如何将网页转换为pdf

​ 场景需求&#xff1a; 商务轻办公人士获取网页内容&#xff0c;并且最好是pdf版本&#xff1f; 将网页转换为PDF的需求可能出现在多种场景中&#xff0c;以下是一些可能的情况&#xff1a; 学术研究&#xff1a;研究人员可能需要将某个学术网站的全文内容保存为PDF格式&a…

设计模式 20 状态模式

设计模式 20 创建型模式&#xff08;5&#xff09;&#xff1a;工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式结构型模式&#xff08;7&#xff09;&#xff1a;适配器模式、桥接模式、组合模式、装饰者模式、外观模式、享元模式、代理模式行为型模式&#xff…

使用 RabbitMQ 实现秒杀订单系统的异步消息处理

使用 RabbitMQ 实现秒杀订单系统的异步消息处理 在秒杀系统中&#xff0c;如何确保高并发环境下的订单处理稳定高效是个很大的挑战。为了解决这个问题&#xff0c;我们通常会引入消息队列&#xff0c;通过异步处理来削峰填谷。这篇文章将详细讲解如何使用 RabbitMQ 来设计一个…

Linux通过特定端口查看服务是否启动

Linux通过特定端口查看服务是否启动 你可以使用netstat或ss命令来检查特定端口上的服务。例如&#xff0c;使用ss -tuln | grep <端口号>来查看端口是否被占用。 netstat 你可以使用以下命令来查看特定端口上的服务&#xff1a; netstat -tuln | grep <端口号>…