NOIP2023模拟2联测23 负责

news/2024/7/24 10:19:55 标签: 题解, c++

题目大意

n n n个区间 [ l i , r i ] [l_i,r_i] [li,ri],每个区间有一个权值 w i w_i wi。把这 n n n个区间当成 n n n个点,如果两个区间之间有交(包括端点),那么就在这两个区间之间连边。于是,这些点就形成了一个区间图。

现在你希望删除一些区间,使得每个连通块的大小不超过 k k k。你需要输出删除区间的最小权值和。

1 ≤ k ≤ n ≤ 2500 , 1 ≤ l i ≤ r ≤ 1 0 9 , 1 ≤ w i ≤ 1 0 9 1\leq k\leq n\leq 2500,1\leq l_i\leq r\leq 10^9,1\leq w_i\leq 10^9 1kn2500,1lir109,1wi109


题解

因为删除区间比较麻烦,所以我们考虑将问题改成在这些区间中选择若干个区间,使得每个连通块的大小不超过 k k k,要求选择若干个区间的最大权值和。

先将区间以右端点为第一关键字,左端点为第二关键字从小到大排序。设 f i f_i fi表示当前已经处理了前 i i i个区间, i i i之前的连通块都满足连通块大小不超过 k k k,且在选择的区间中编号大于 i i i的区间和编号小于等于 i i i的区间没有交集的情况下的最大权值和。下面考虑转移。

我们可以用 f i f_i fi来更新 f j f_j fj j > i j>i j>i),即要从 i + 1 i+1 i+1 j j j之间选择一些区间来构成一个连通块(有可能构成多个连通块,但我们都把它看作一个,来保证可以用连通块大小不超过 k k k来判断是否合法,如果最优解中 i + 1 i+1 i+1 j j j之间要选多个连通块,则总会有另一个 i ′ i' i满足 i ′ + 1 i'+1 i+1 j j j之间只有一个连通块, f i f_i fi f j f_j fj的贡献就会被 f i ′ f_{i'} fi f j f_j fj的贡献所覆盖)。

因为区间是以右端点为第一关键字排序的,所以区间 i i i肯定是 i i i所在连通块中右端点最靠右的区间,那么 i + 1 i+1 i+1 j j j这些区间既然不和 i i i在同一个连通块,则 r i < l p r_i<l_p ri<lp i + 1 ≤ p ≤ j i+1\leq p\leq j i+1pj)。那么,我们从 i + 1 i+1 i+1 n n n枚举 j j j

  • 如果当前的 j j j不满足 r i < l j r_i<l_j ri<lj,则不能选择 j j j
  • 如果当前的 j j j满足 r i < l j r_i<l_j ri<lj,则可以选择,又因为连通块的大小不能超过 k k k,所以我们可以用一个堆来维护这些可以选择的区间,尽量选择权值更大的堆

那么, f n f_n fn即为选择若干个区间的最大权值和。设所有区间的权值为 s u m sum sum,则 s u m − f n sum-f_n sumfn即为最终的答案。

时间复杂度为 O ( n 2 log ⁡ n ) O(n^2\log n) O(n2logn)

code

#include<bits/stdc++.h>
using namespace std;
const int N=2500;
int n,k;
long long sum=0,f[N+5];
priority_queue<int>q;
struct node{
	int l,r,w;
}w[N+5];
bool cmp(node ax,node bx){
	if(ax.r!=bx.r) return ax.r<bx.r;
	return ax.l<bx.l;
}
int main()
{
	scanf("%d%d",&n,&k);
	for(int i=1;i<=n;i++){
		scanf("%d%d%d",&w[i].l,&w[i].r,&w[i].w);
		sum+=w[i].w;
	}
	sort(w+1,w+n+1,cmp);
	for(int i=0;i<=n;i++){
		long long tmp=0;
		for(int j=i+1;j<=n;j++){
			if(w[j].l>w[i].r){
				tmp+=w[j].w;
				q.push(-w[j].w);
				if(q.size()>k){
					tmp+=q.top();q.pop();
				}
			}
			f[j]=max(f[j],f[i]+tmp);
		}
		while(!q.empty()) q.pop();
	}
	printf("%lld",sum-f[n]);
	return 0;
}

http://www.niftyadmin.cn/n/5121741.html

相关文章

Oracle 数据库的锁排查方法

关键字 oracle lock 问题描述 Oracle 数据库上锁问题如何排查 解决问题思路 准备数据 create table lock_test(name varchar(10),age varchar(10));insert into lock_test values(ff,10); insert into lock_test values(yy,20); insert into lock_test values(ll,30);Orac…

以数据赋能,星辰天合推进智慧化校园建设

近日&#xff0c;上海市高等教育学会校园网络专业委员会 2023 年度学术年会在上海举办&#xff0c;本次会议以“数智赋能教育 生成美好未来”为主题&#xff0c;围绕 AI 与教育融合、高校数字化转型创新发展等内容进行了专业研讨。 XSKY星辰天合解决方案总监李瑞宇作了《应用融…

C++-openssl-aes-加密解密

hmac Hash-based Message Authentication Code MAC 定义&#xff1a; Message Authentication Code 一种确认完整性并进行认证的技术。 1.openssl基本版 加密解密 #include "openssl/rand.h" #include "openssl/md5.h" #include "openssl/hmac.h…

基于 Appium 的 Android UI 自动化测试!

自动化测试是研发人员进行质量保障的重要一环&#xff0c;良好的自动化测试机制能够让开发者及早发现编码中的逻辑缺陷&#xff0c;将风险前置。日常研发中&#xff0c;由于快速迭代的原因&#xff0c;我们经常需要在各个业务线上进行主流程回归测试&#xff0c;目前这种测试大…

开关柜无源无线测温有几种技术方式?

关柜无源无线测温装置目前市场上常用的有三种技术方式&#xff1a;表面声波无线测温、温差供电式无线测温、感应取电式无线测温 一、声表面波测温原理&#xff1a; 声表面波温度传感器由叉指换能器、反射栅及压电基板组成。声表面波传感器经天线接收到外部激励信号后&#xff…

C# 基于腾讯云人脸核身和百度云证件识别技术相结合的 API 实现

目录 腾讯云人脸核身技术 Craneoffice.net 采用的识别方式 1、活体人脸核身(权威库)&#xff1a; 2、活体人脸比对&#xff1a; 3、照片人脸核身(权威库)&#xff1a; 调用成本 百度云身份证识别 调用成本 相关结合点 核心代码 实现调用人脸核身API的示例 实现调用身…

I/O设备的概念和分类,I/O控制器

文章目录 1.什么是I/O设备2.按使用特性分类1.人机交互类外部设备2.存储设备3.网络通信设备 3.按传输速率分类1.低速设备:2.中速设备:3.高速设备: 4.按信息交换的单位分类1.块设备:2.字符设备: 5.I/O设备的机械部件6.I/O设备的电子部件&#xff08;I/O控制器&#xff09;1.接收和…

Java New对象分配内存流程

一、流程图 二、流程介绍 1、进行逃逸分析&#xff0c;判断是否能够分配到栈上&#xff1a; Y&#xff1a; 如果能分配到栈上&#xff0c;则进行分配。等方法出栈时&#xff0c;对象内存销毁&#xff0c;可有效减少GC的次数。 N&#xff1a;无法分配到栈上&#xff0c;则判断是…