11.9 模拟赛 T3

news/2025/11/9 17:54:17/文章来源:https://www.cnblogs.com/Water-M/p/19204556

题意:将 \(n\) 个线段分成恰好 \(m\) 组,每个线段需要且只能分进一组。求这 \(m\) 组线段合法的得分之和最大是多少。一组线段的得分定义为它们的交的长度(区间长度为右端点减左端点)。一个方案合法,当且仅当每组线段有交且长度大于 \(0\)。保证有解。
\(m \le n \le 200\)。线段端点取值 \([0, 10^5]\)

Hint

考虑线段两两不包含怎么做。

Answer:显然按照左端点(或右端点)排序,而且显然存在一种最优方案使得每组都选择一个区间。\(O(n^3)\) DP 即可。

Solution

如果有一条线段 \(A\) 包含于另一条线段 \(B\),那么 \(B\) 可以认为是不重要的。因为他如果和 \(A\) 分在同一组,对该组得分一定没有贡献。

但是我们也不能直接删掉 \(B\)。原因是,直接删掉所有有“孩子线段”的线段,可能剩下的不足以分成 \(m\) 组。

同时,我们又不能直接将 \(B\) 单独成段计入贡献。原因类似。

那我们考虑拿出所有的 \(B\)。发现这些 \(B\) 之间可能还存在包含关系,然后发现这就是一个子问题
那我们需要的是,对 \(B\) 计算出分成 \(i \in [0, m]\) 组的最大贡献,对剩下来的部分,也求出来分成 \(i \in [0, m]\) 的最大贡献。背包背起来就是答案。这个过程可以递归进行。

但是有一个细节。\(B\) 集中的某条线段可能和某一个 \(A\) 同一组。这时 \(B\) 集中就不需要选该条线段从而使答案更大。
所以 DP 的时候额外记录一下该部分有没有线段不选即可。

输出答案的时候自然不能允许存在不选的线段。

时间复杂度 \(O(n^3)\)

#include <bits/stdc++.h>
using namespace std;//#define filename "intervals" 
#define FileOperations() freopen(filename".in", "r", stdin), freopen(filename".out", "w", stdout)
//#define multi_cases 1#define inf 0x3f3f3f3f
#define Linf 0x3f3f3f3f3f3f3f3f
#define pii pair<int, int> 
#define ull unsigned long long
#define all(v) v.begin(), v.end()
#define upw(i, a, b) for(int i = (a); i <= (b); ++i)
#define dnw(i, a, b) for(int i = (a); i >= (b); --i)template<class T> bool vmax(T &a, T b) { return b > a ? a = b, true : false; }
template<class T> bool vmin(T &a, T b) { return b < a ? a = b, true : false; }
template<class T> void clear(T &x) { T().swap(x); }const int N = 205;int n, m, a[N], b[N];int check(int i, vector<int> p) {for(auto j : p) if(i != j) {if(a[i] <= a[j] && b[j] <= b[i]) return 1;}return 0;
}vector<vector<int> > solve(vector<int> &p) {if(p.empty()) return vector<vector<int> >(m+1, vector<int>(2));vector<int> c;for(auto it = p.begin(); it != p.end(); ) {if(check(*it, p)) c.push_back(*it), it = p.erase(it);else ++it;}auto g = solve(c);sort(all(p), [&] (int i, int j) { return a[i] < a[j]; });	//现在不存在区间互相包含了vector<vector<vector<int> > > f(p.size()+1, vector<vector<int> >(m+1, vector<int>(2, -inf)));f[0][0][0] = 0;	//去掉了0条线段upw(j, 1, m) {upw(i, 1, (int)p.size()) {int L = -inf, R = inf;dnw(i_, i-1, 0) {int y = p[i_];vmax(L, a[y]), vmin(R, b[y]);if(L >= R) break;vmax(f[i][j][0], f[i_][j-1][0] + (R - L));// cerr << "; " << i_ << '\n';}}}upw(i, 1, (int)p.size()) f[i][0][1] = 0;upw(j, 1, m) {// cerr << j << '\n';upw(i, 1, (int)p.size()) {vmax(f[i][j][1], max(f[i-1][j][1], f[i-1][j][0]));int L = -inf, R = inf;dnw(i_, i-1, 0) {int y = p[i_];vmax(L, a[y]), vmin(R, b[y]);if(L >= R) break;vmax(f[i][j][1], f[i_][j-1][1] + (R - L));}}}vector<vector<int> > h(m+1, vector<int>(2));upw(o, 0, 1) {upw(i, 0, m) upw(j, 0, i)vmax(h[i][o], f[(int)p.size()][j][o] + max(g[i-j][0], g[i-j][1]));}return h;
}void WaterM() {cin >> n >> m;upw(i, 1, n) cin >> a[i] >> b[i];vector<int> p;upw(i, 1, n) p.push_back(i);auto f = solve(p);cout << f[m][0] << '\n';
}signed main() {
#ifdef filenameFileOperations();
#endifsigned _ = 1;
#ifdef multi_casesscanf("%d", &_);
#endifwhile(_--) WaterM();return 0;
}

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

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

相关文章

CSP2025游记

早上到考场发现那一层两个考场一共就看到两种校服。今年好像不是按姓名字典序排的 J组 挺水的 T1 简单切了 T2 简单切了 T3 想了一会,切了 T4 想了一会,以为自己切了 赛后发现没开滚动数组好像会爆空间($512 \times…

深入解析:从零构建鸿蒙高效数据恢复工具:完整实战教程与可运行Demo

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

2025年安徽合肥智能家居公司推荐榜

摘要 随着智能家居行业的快速发展,2025年国内智能家居设备市场预计将达到千亿规模,消费者对智能家居品牌的选择日益注重口碑、实力和可靠性。本文基于行业数据和用户评价,为您推荐2025年安徽合肥地区智能家居公司排…

2025年智能家居设备厂家综合实力排行榜TOP5

文章摘要 随着智能家居行业的快速发展,2025年国内智能家居设备市场呈现出蓬勃发展的态势。本文基于权威数据和技术指标,对当前智能家居厂家的综合实力进行排名分析,为行业投资者和采购商提供参考依据。文章包含详细…

教育辅助系统开发需求文档 - f

教育辅助系统开发需求文档 1. 项目概述 本项目旨在开发一个集学生电子档案管理、行为矫正跟踪、教学任务管理与家校互动于一体的教育辅助系统。系统需包含教师端、家长端、学生端及后台管理端。2. 功能模块详述 2.1 电…

2025年11月合肥智能家居源头厂家排行

摘要 2025年,智能家居行业持续高速发展,全球市场规模预计突破2000亿美元,中国作为主要生产国,安徽合肥地区凭借产业集群优势成为重要基地。本文基于行业数据、用户口碑和技术实力,为您推荐2025年11月合肥智能家居…

完整教程:超越CNN:GCN如何重塑图像处理

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

深入解析:数据结构 04 栈和队列

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

深入解析:软件编程课程:课程目录介绍 总纲

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

Linux下wcout输出中文:迄今为止讲得最清楚的

#include <cstdint> #include <string> #include <iostream> #include <locale> #include <codecvt> using namespace std;wstring utf8_to_wchar(const string& str);int main() {…

CCPC哈尔滨站-J. 幻想乡的裁判长

statement 给一个长为 \(n\) 的字符串 \(s\),字符集为 \(\{\text{o, v, w}\}\),请输出最长的回文子串,这个子串中一个 \(\text{w}\) 可以看成两个 \(\text{v}\)。 给个例子:\(\text{wwovvvv}\) 是合法的。 数据范围…

C语言中的整型提升

整型提升 什么是整型提升?为什么要使用整型提升?整型提升是如何进行的? 1.整型提升 在c语言中,一些表达式在求值的过程中,操作数可能需要转换为其他类型,这种转换,我们程序员是看不见的,称其为隐式类型转换,而…

牛客网测试题

题目Java解题 public class test05 {public static void main(String[] args) {Scanner scanner = new Scanner(System.in);while(scanner.hasNextLine()){String s = scanner.nextLine();char[] chars = s.toCharArra…

完整教程:Hive 知识点梳理

完整教程:Hive 知识点梳理2025-11-09 17:23 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; …

OZI-Project代码注入漏洞分析与修复方案

本文详细分析OZI-Project/ozi-publish中发现的代码注入漏洞CVE-2025-47271,涵盖漏洞影响范围、修复版本、CVSS评分及缓解措施,帮助开发者理解并防范类似安全风险。OZI-Project/ozi-publish 代码注入漏洞 CVE-2025-4…

创建第一个pygame游戏窗口

创建了一个pygame游戏窗口,并且通过循环不断的监听和响应用户事件 如果用户按下了按键就print一句话;如果是点了退出按钮就关闭窗口 import pygamepygame.init() size = (600, 400) screen = pygame.display.set_mod…

常量的二元图景:C 语言的刚性契约与 Python 的柔性表达

常量的二元图景:C 语言的刚性契约与 Python 的柔性表达 引言:被混淆的 “不变性”—— 从字面量与常量的认知错位说起 在程序设计基础教学里,“常量” 是最容易被 “简化到失真” 的概念。为了让初学者快速上手,很…

用 Swift 解析验证码(结合 Tesseract OCR)

环境准备 1.1 安装 SwiftmacOS 自带 Swift,如需更新,可使用: 更多内容访问ttocr.com或联系1436423940 xcode-select --install 然后检查 Swift 版本: swift --version Linux 用户可以从 Swift 官方网站 下载对应版…

Swift 进行验证码识别:集成 Tesseract OCR

环境准备 1.1 安装 Tesseract OCR在 macOS 上可以使用 Homebrew 进行安装: brew install tesseract 更多内容访问ttocr.com或联系1436423940 安装完成后,检查 Tesseract 是否安装成功: tesseract --version 1.2 创建…

【Linux环境编程】2. Linux核心指令(上)

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …