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

D - Many Segments 2(AtCoder Beginner Contest 377)

题目链接:

D - Many Segments 2 (atcoder.jp)

题目描述:

数据范围:

 

样例输入:

2 4
1 2
3 4

样例输出:

5

样例解释:

分析:

题目让找合法的区间,但是合法的话去要去枚举左右端点,时间复杂度O(n * n), 会TLE的。间接的去做会好点。

总的(m * (m + 1) / 2) 减去 不合法的区间 = 合法的区间。

不合法的区间就是包括任意一个读入的区间(l[i], r[i])。枚举1到m,作为不合法区间的左端点,假如这个i的后面区间里面,离i最近的右端点是r[i], 那么由这个左端点提供的不合法的区间个数就是 m - r[i] + 1。为什么求最近的呢?下图:

但是问题是,我怎么知道位置i右边区间里面最左边的r呢?

从后往前枚举,用hou数组去记录,那么找的时候就可以O(1)的时间复杂度去找到。

这里我用了fill填充了hou数组,第一个参数是数组起始地址,第二个参数是数组结束地址+1,(左闭右开) 第三个参数是填充的值。只要值为200010,就表示当前点的右边是没有区间的,那么就不存在违法区间。

代码:

#include<bits/stdc++.h>
#define int long long

using namespace std;

map<int, int>mp;
int hou[200010];


signed main() {
	int n, m;
	cin >> n >> m;
	int ret = m * (m + 1) / 2;
	int a[m + 10];
	memset(a, 0, sizeof a); 
	int cnt = 0;
	set<int>se;
	
	for(int i = 1; i <= n; i ++ ) {
		int l, r;
		cin >> l >> r;
		if(mp[l] == 0) {
			mp[l] = r;
		}
		mp[l] = min(mp[l], r);//知道当前最小的 
		se.insert(l);
	}
	fill(hou, hou + m + 10, 200010);
	
	//hou[i]表示的是 i后面区间 里面 r最靠左的。 
	for(int i = m ; i >= 1; i -- ) {
		if(mp[i]) {
			//取最小的 
			hou[i] = min(hou[i + 1], mp[i]);
		} else {//延续下去 
			hou[i] = hou[i + 1];
		}	
	}
	for(int i : se) {
		a[ ++ cnt] = i;
	}
	for(int i = 1; i <= m; i ++ ) {
		if(hou[i] !=  200010) {
			ret -= (m - hou[i] + 1);
		} 
	}
	cout << ret << endl;
	return 0;
}

运行结果:


http://www.kler.cn/news/368231.html

相关文章:

  • Vue3用户关注与粉丝列表展示
  • 汇编语言
  • 词向量——预训练词嵌入
  • itext自定义pdf
  • Linux - 文件描述符 | 文件系统 | 软硬链接
  • 【Docker】docker | 部署nginx
  • 【Flask】二、Flask 路由机制
  • 三种SPI机制的了解及使用
  • linux创建自定义服务部署项目
  • 如何使用Golang的gomail库实现邮件发送功能
  • 将CSDN博客转换为PDF的Python Web应用开发--Flask实战
  • logback日志导入使用
  • 基于docker-compose编排部署微服务快速开发框架
  • GPIO按键驱动分析与使用:input_dev层
  • 简单的udp程序
  • a50股指期货是什么意思?
  • 高效宿舍管理:Spring Boot实现的学生宿舍信息系统
  • 通过热成像技术在地球之外成长,在教室之外学习
  • linux系统安全:开源的反病毒工具ClamAV的安装配置使用和维护介绍
  • 鸿蒙NEXT开发-应用数据持久化之用户首选项(基于最新api12稳定版)
  • 设计模式4-工厂模式策略模式
  • vue3组件通信--自定义事件
  • Spring Boot Configuration和AutoConfiguration加载逻辑和加载顺序调整
  • MySQL 9从入门到性能优化-慢查询日志
  • 智能财务 | 数据与融合,激发企业财务数智化转型思考
  • 华为odC++一面-面经总结