离散化思想——只处理有效数据的优化思想

news2025/1/12 23:16:15

离散化思想——只处理有效数据的优化思想

  • 什么是离散化
  • 离散化题目——校门外的树(超强版,1e9)
    • 题目描述
    • 输入格式
    • 输出格式
    • 样例
      • 样例输入
      • 样例输出
    • 提示
  • 思路分析
    • 朴素做法
    • 离散化!!
    • 代码分析
      • 数组
      • 循环

在这里插入图片描述

什么是离散化

离散化思想可以理解为“只处理有效数据”的一种思想,对于问题的模型进行结构重建基本参考坐标是离散化代码实现的常见方法。对于数值范围巨大而实际有效点较少的问题可以采用离散化转化为更容易实现的问题求解。

你可以想象一下,如果你有 N N N根很长的绳子,你把它们交叉着叠在一起(有重叠部分也有没有绳子的部分),已知每根绳子的头和尾,你想知道这些绳子的覆盖长度,那你只能慢慢的量。
例如下面的数据:

7
-506	870
1125	1311
870		874
1653	1723
0		236
236		999
1442	1722

有什么简单的方法吗?

当我们将它门转换到数轴上,题目马上变得简单:
在这里插入图片描述

这样我们就可以计算出每一段的长度,再将每一段的长都加起来即可,事实上就是转换成了下图:

在这里插入图片描述
这样,我们求绳子的覆盖长度就可以很快的利用数学得出结果!

离散化题目——校门外的树(超强版,1e9)

题目描述

校门外马路上本来从编号 0 0 0 L L L,每一编号的位置都有一棵树。有砍树者每次从编号 A A A B B B 处连续砍掉每一棵树,就连树苗也不放过(记 0 A B,含 A A A B B B);幸运的是还有植树者每次从编号 C C C D D D 中凡是空穴(树被砍且还没种上树苗或树苗又被砍掉)的地方都补种上树苗(记 1 C D,含 C C C D D D);问最终校门外留下的树苗多少棵?植树者种上又被砍掉的树苗有多少棵?

输入格式

第一行,两个正整数 L L L N N N,表示校园外原来有 L + 1 L + 1 L+1 棵树,并有 N N N 次砍树或种树的操作。

以下 N N N 行,每行三个整数,表示砍树或植树的标记和范围。

输出格式

共两行。第一行校门外留下的树苗数目,第二行种上又被拔掉的树苗数目。

样例

样例输入

10 3
0 2 6
1 1 8
0 5 7

样例输出

3
2

提示

对于 100 % 100 \% 100% 的数据, 1 ≤ L ≤ 1 0 9 1 \le L \le 10^9 1L109 1 ≤ N ≤ 100 1 \le N \le 100 1N100

思路分析

在程序中,如何解决这个问题呢(不含负数)?

朴素做法

开一个数组代表数轴,每次输入进来一个绳子是就讲绳子覆盖的地方标记为 1 1 1,其它为 0 0 0

然后从 0 0 0到总长度枚举,如果是 1 1 1,那么答案就增加 1 1 1

代码异常简单:

#include <iostream>
using namespace std;
int i,j,k,m,n,l,sum=0;
int a[1000000005],q,z;
int main() {
	cin>>l>>m;
	for(i=0; i<=l; i++)
		a[i]=0;
	for(i=1; i<=m; i++) {
		cin >>q >>z;
		for(j=q; j<=z; j++)
			a[j]=1;
	}
	for(i=0; i<=l; i++)
		sum+=a[i];
	cout <<l-sum+1;
	return 0;
}

但是当你看到题目数据时,这种做法就只能放弃,因为你根本不可能开那么大的数组,并且还会超时!
那么该怎么办?

离散化!!

这题明细是用离散化做的!!
现将每个数进行排序,然后再处理。

#include <bits/stdc++.h>
using namespace std;
const int N=300;
priority_queue <int,vector<int>,greater<int> >q;
int l,m,kk,ans,a[N],b[N],w[N],p[N];
map<int,int> t;
int main() {
	cin >>l >>m;
	for (int i=1; i<=m; i++) {
		cin >>a[i] >>b[i];
		q.push(a[i]);
		q.push(b[i]);
	}
	p[++kk]=q.top();
	q.pop();
	for (int i=2; i<=2*m; i++) {
		if (p[kk-1]!=q.top())
			p[++kk]=q.top();
		p[kk];
		t[q.top()]=kk;
		q.pop();
	}
	for (int i=1; i<=m; i++) {
		int x=t[a[i]];
		int y=t[b[i]];
		for (int j=x; j<y; j++) {
			w[j]=1;
		}
	}
	int s=0,e=0;
	for (int i=1; i<=2*m; i++) {
		if (w[i]==1) {
			if (s==0) {
				s=i;
				e=i;
			} else
				e++;
		}
		if (w[i]==0) {
			if (e>0) {
				
				ans+=p[e+1]-p[s]+1;
				e=0;
				s=0;
			}
		}
	}
	cout <<l-ans+1;
	return 0;
}

代码分析

数组

  • q q q这个优先队列用来排序
  • a a a数组和 b b b数组用来存储输入的数。
  • w w w表示当前段有没有被砍
  • p p p为排完序的数组
  • t t t这个 m a p map map类型的东东用来快速找到当前数所对应的位置

循环

  • 第一个:输入,并将数值存进优先队列
  • 第二个:将排序后的数值存入 p p p数组, t t t数组记录当前数在有序数列中的位置
  • 第三个:标记当前段有没有被覆盖
  • 第四个:累加被覆盖的每一段的数值

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/897340.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C语言之浮点数_数据存储篇(2)

目录 浮点数 什么是浮点数呢&#xff1f; 为什么叫浮点数&#xff1f; 浮点数家族 浮点数表示的范围&#xff1f; 浮点数存储的例子 浮点数的存储方式 写成规定形式是怎样的&#xff1f; 那SME在内存中如何分配的呢&#xff1f; 为什么要这样存储&#xff1f; 浮点…

44、TCP报文(二)

接上节内容&#xff0c;本节我们继续TCP报文首部字段含义的学习。上节为止我们学习到“数据偏移”和“保留”字段。接下来我们学习后面的一些字段&#xff08;暂不包含“检验和”的计算方法和选项字段&#xff09;。 TCP首部结构&#xff08;续&#xff09; “数据偏移”和“保…

人工智能在车牌识别中的应用与影响

引言&#xff1a;车牌识别技术是基于人工智能的一种重要应用&#xff0c;通过对监控视频中的车辆图像进行处理和分析&#xff0c;可以快速、准确地识别车牌号码。这项技术的广泛应用可以帮助交通管理、停车场管理&#xff0c;甚至追踪犯罪嫌疑人的车辆。本文将详细探讨车牌识别…

从LeakCanary看ViewModel生命周期监控

前面两篇文章中已经了解了LeakCanary中Service和Fragment生命周期监控的实现&#xff0c;那么ViewModel生命周期监控又是怎么实现的呢&#xff1f; 同样的&#xff0c;要了解ViewModel生命周期监控&#xff0c;我们首先应该清楚在代码结构中ViewModel是如何存储获取的&#xf…

【零基础自用】理解python为什么要用虚拟环境

不知道学过MATLAB或者R的小伙伴刚刚接触python的时候会不会被各种python版本&#xff0c;包版本&#xff0c;虚拟环境之类的搞的头晕眼花。 问题一 包版本 先来假设&#xff0c;我们自己开发了一个包MyPackage 1.0&#xff0c;里面包含一个模块叫PreTrained&#xff0c;然后去…

Python爬虫(十三)_案例:使用XPath的爬虫

本篇是使用XPath的案例 案例&#xff1a;使用XPath的爬虫 现在我们用XPath来做一个简单的爬虫&#xff0c;我们尝试爬取某个贴吧里的所有帖子且将该帖子里每个楼层发布的图片下载到本地。 #-*- coding:utf-8 -*- #tieba_xpath.py"""作用&#xff1a;本案例使用…

【AGC】Publishing api怎么上传绿色认证审核材料

【问题描述】 华为应用市场会对绿色应用标上特有的绿色标识&#xff0c;代表其通过华为终端开放实验室DevEco云测平台的兼容性、稳定性、安全、功耗和性能的检测和认证&#xff0c;是应用高品质的象征。想要自己的应用认证为绿色应用就需要在发布应用时提供绿色认证审核材料&a…

Go语言基础之基本数据类型

Go语言中有丰富的数据类型&#xff0c;除了基本的整型、浮点型、布尔型、字符串外&#xff0c;还有数组、切片、结构体、函数、map、通道&#xff08;channel&#xff09;等。Go 语言的基本类型和其他语言大同小异。 基本数据类型 整型 整型分为以下两个大类&#xff1a; 按…

echarts 关于折线统计图常用的属性设置--超详细(附加源码)

文章目录 折线统计图设置x轴字体大小及字体颜色设置y轴字体大小及字体颜色设置背景颜色及设置折线颜色设置折线效果图显示阴影折线图位置及标签位置设置鼠标悬浮折线弹出窗口显示对应的数据设置自动横向滚动 总结 大家好&#xff01;近期我会分享几篇关于echarts方面的技术点&a…

easy-es 使用

1、pom中引入依赖 <dependency><groupId>org.elasticsearch.client</groupId><artifactId>elasticsearch-rest-high-level-client</artifactId><version>7.14.0</version></dependency><dependency><groupId>org.…

CentOS ens160 显示disconnected

使用nmcli device查看网卡状态&#xff0c;显示如图&#xff1a; 检查宿主机系统VMware DHCP Sevice和VMware NAT Sevice服务是否正常运行。 右键点击我的电脑管理按钮&#xff0c;打开计算机管理点击服务

C语言实例_异或校验算法

一、异或校验算法 异或校验算法&#xff08;XOR校验&#xff09;是一种简单的校验算法&#xff0c;用于检测数据在传输或存储过程中是否发生了错误。通过将数据中的所有比特位相异或&#xff0c;生成一个校验码&#xff0c;然后将该校验码与接收到的数据进行比较&#xff0c;以…

如何大幅提高遥感影像分辨率(Python+MATLAB)

前言: 算法:NSCT算法(非下采样变换) 数据:Landsat8 OLI 遥感图像数据 编程平台:MATLAB+Python 论文参考:毛克.一种快速的全色和多光谱图像融合算法[J].测绘科学,2016,41(01):151-153+98.DOI:10.16251/j.cnki.1009-2307.2016.01.028. 左图:未进行融合的多光谱真彩色合…

ChatGPT逐句逐句地解释代码并分析复杂度的提示词prompt

前提安装chrome 插件 AI Prompt Genius&#xff0c; 请参考 3 个 ChatGPT 插件您需要立即下载 你是首席软件工程师。请解释这段代码&#xff1a;{{code}} 添加注释并重写代码&#xff0c;用注释解释每一行代码的作用。最后分析复杂度。快捷键 / 选择 Explain Code 输入代码提…

内网隧道代理技术(十七)之 NPS的使用

NPS的介绍和使用 NPS介绍 nps是一款轻量级、高性能、功能强大的内网穿透代理服务器。目前支持tcp、udp流量转发,可支持任何tcp、udp上层协议(访问内网网站、本地支付接口调试、ssh访问、远程桌面,内网dns解析等等……),此外还支持内网http代理、内网socks5代理、p2p等,…

RFID技术助力汽车零配件装配产线,提升效率与准确性

随着科技的不断发展&#xff0c;越来越多的自动化设备被应用到汽车零配件装配产线中。其中&#xff0c;射频识别&#xff08;Radio Frequency Identification&#xff0c;简称RFID&#xff09;技术凭借其独特的优势&#xff0c;已经成为了这一领域的重要技术之一。本文将介绍RF…

Cpp基础Ⅰ之编译、链接

1 C是如何工作的 工具&#xff1a;Visual Studio 1.1 预处理语句 在.cpp源文件中&#xff0c;所有#字符开头的语句为预处理语句 例如在下面的 Hello World 程序中 #include<iostream>int main() {std::cout <"Hello World!"<std::endl;std::cin.get…

宝塔部署Java+Vue前后端分离项目经验总结

前言 之前部署服务器都是在Linux环境下自己一点一点安装软件&#xff0c;听说用宝塔傻瓜式部署更快&#xff0c;这次浅浅尝试了一把。 确实简单&#xff01; 1、 买服务器 咋买服务器略&#xff0c;记得服务器装系统就装 Cent OS 7系列即可&#xff0c;我装的7.6。 2、创建…

私密数据采集:隧道爬虫IP技术的保密性能力探究

作为一名专业的爬虫程序员&#xff0c;今天要和大家分享一个关键的技术&#xff0c;它能够为私密数据采集提供保密性能力——隧道爬虫IP技术。如果你在进行敏感数据采集任务时需要保护数据的私密性&#xff0c;那么这项技术将是你的守护神。 在进行私密数据采集任务时&#xff…