CF1801C 做题笔记

news/发布时间2024/8/25 7:25:28

题目链接

一道需要挖掘一些性质的 dpt,居然独立想出来了。

本蒟蒻太菜了只会树状数组的做法,单调栈不会。

先考虑只管对答案有贡献的音乐,这当然是正确的,因为我们可以把对答案没有贡献的音乐放到最后。

对于每一首乐曲,我们也能对它进行一个简单的处理来模拟听的过程,维护一个值 $lst$,每次输入的数 $x$ 如果大于 $lst$,那么听了这个片段后答案就会加一,将 $x$ 存入数组中,否则忽略它。

假设每个音乐的好听程度为其中最美妙的片段。

处理后有一个可以感性理解的结论:无论当前听过的最好听的片段是什么,听了一首乐曲,能够使答案增加的一定是存入数组中的片段。

证明考虑反证,假设当前听过最好听的片段好听值为 $mx$,现在听乐曲 $i$,能够找到一个位置使得 $a_{i,j} \geq mx$ 且 $a_{i,j}$ 被忽略。这是显然不可能得一件事,因为如果 $a_{i,j}$ 被忽略,就说明前面有一个更好听的片段,而 $mx$ 应该先听到的是更好听的片段就忽略了 $a_{i,j}$。

再来想,有答案贡献的音乐放在一起,每个音乐的好听程度一定是递增的。

做法于是很显然了,先将所有音乐按照好听程度排序,设 $f_i$ 为考虑第 $1$ 个音乐到第 $i$ 个音乐,其中第 $i$ 个音乐必须选的最大答案,设 $mx_j$ 为第 $j$ 首乐曲的好听程度,那么大体结构就是枚举前一个听的乐曲 $j$,然后再算出听 $i$ 之后的答案,所有的取个 $\max$ 即可。

上述为 $O(n^2)$ 做法,很烂,会超时,貌似可以用单调栈优化,超时原因是没有用到 $\sum k_i \leq 200000$ 这个条件。

考虑对于每一个乐曲的转移改为枚举这个乐曲中的每一个没被忽略的片段,然后去找前面的某个乐曲 $j$,使得 $j$ 的好听程度 $<$ 这个片段的美妙值,然后就能从 $dp_j$ 转移过来,再听这个片段以及这个片段后面没有被忽略的。

很绕口,读不懂多读几遍,然后这是个单点修改求前缀最值可以用树状数组优化到 $O(n\log n)$。

代码:

#include <bits/stdc++.h>
#define int long long
#define For(i, a, b) for (int i = (a); i <= (b); i ++)
#define foR(i, a, b) for (int i = (a); i >= (b); i --)
using namespace std;
int n, x, cnt;
int c[200005], dp[200005], idx[200005];
vector <int> a[200005];
vector <int> v[200005];
void add (int x, int y) {for (; x <= 200000; x += x & -x) c[x] = max (c[x], y);}
int query (int x) {return (x == 0 ? 0 : max (query (x - (x & -x) ), c[x]) );}
void clear (int x) {for (; x <= 200000; x += x & -x) c[x] = 0;}
set <int> s;
void solve () {s.clear ();scanf ("%lld", &n);For (i, 1, n) {scanf ("%lld", &cnt);int last = 0;while (cnt --) {scanf ("%lld", &x);if (x > last) {a[i].push_back (x);last = x;}}s.insert (last);v[last].push_back (i);}cnt = 0;for (int i : s) for (int j : v[i]) idx[++ cnt] = j;int ans = 0;For (i, 1, n) {for (int j = 0; j < a[idx[i] ].size (); j ++)dp[i] = max (dp[i], query (a[idx[i] ][j] - 1) + (long long) (a[idx[i] ].size () ) - j);add (a[idx[i] ].back (), dp[i]);ans = max (ans, dp[i]);}cout << ans;For (i, 1, n) {clear (a[i].back () );v[a[i].back ()].clear ();a[i].clear ();dp[i] = 0;}
}
signed main () {int _ = 1;cin >> _;while (_ --) {solve ();cout << '\n';}return 0;
}

 

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

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

相关文章

django 结合rpc服务传输

1 概述 2 基础依赖 3 定义服务和消息 4 生成 gRPC 代码 5 创建服务和客户端服务 6 启动服务端和客户端 7 Django中集成gRPC 8 安全认证方面 9 健康检测 10 相关文档生成概述 gRPC(gRPC Remote Procedure Call)是一种高性能、跨语言的远程过程调用(RPC)框架,由Google开发并…

加密的手机号,如何模糊查询?

前言 前几天,知识星球中有位小伙伴,问了我一个问题:加密的手机号如何模糊查询? 我们都知道,在做系统设计时,考虑到系统的安全性,需要对用户的一些个人隐私信息,比如:登录密码、身份证号、银行卡号、手机号等,做加密处理,防止用户的个人信息被泄露。 很早之前,CSDN遭…

Unix domain socket 简介

原文: https://www.cnblogs.com/sparkdev/p/8359028.htmlUnix domain socket 又叫 IPC(inter-process communication 进程间通信) socket,用于实现同一主机上的进程间通信。socket 原本是为网络通讯设计的,但后来在 socket 的框架上发展出一种 IPC 机制,就是 UNIX domain so…

使用Github Action实现构建、发布到 nuget.org

使用Github Action实现构建、发布到 nuget.org GitHub Actions是GitHub提供的持续集成和持续部署(CI/CD)工具,它能够自动化构建、测试和部署你的项目。在这篇教程中,我们将探讨如何使用GitHub Actions来构建一个.NET项目,并将它发布到 NuGet.org。 配置 NuGet API 密钥首先…

pmp团队建设的塔克曼阶梯理论的五个阶段

塔克曼阶梯理论是由Bruce Tuckman在1965年提出的,用于描述团队如何成长、面对挑战、解决问题、发展团队工作方法,并优化性能的过程。这个理论后来在1977年被Tuckman和Mary Ann Jensen进一步完善,增加了第五个阶段。以下是Tuckman的五个阶段及其特征:形成 (Forming):成员们正…

《信息安全系统设计与实现》第六周学习笔记

一、课程内容第十一章学习 EXT2文件数据结构 1、通过mkfs创建虚拟磁盘 mke2fs [-b blksize -N ninodes] device nblocks 虚拟磁盘布局:2、操作系统内核中的文件系统函数 3、系统调用 4、I/O库函数 5、用户命令 6、sh脚本 低级别的文件操作中的常用函数: 打开和关闭文件: ope…

振弦采集仪应用水坝安全监测的方案

振弦采集仪应用水坝安全监测的方案 随着工业化和城市化的快速发展,水资源的开发和利用越来越广泛。由于水坝在水利工程中起着至关重要的作用,因此对水坝进行安全监测变得越来越必要。为了实现对水坝的安全监测,振弦采集仪可以作为一种有效的工具进行应用。本文将探讨振弦采集…

离开了浪浪山,简直不要太爽

今年年初的时候,《中国奇谭》火了,与其说是《中国奇谭》火了,还不如说是这个动漫和普通打工人太有共鸣了,动漫里面的小猪妖是很多普通打工人的写照,毕业进入了父母亲戚以为很不错的工作,领着一份不多不少的工资,每天要处理各种工作上的事情,事情比较多的时候,还需要经…

Julia基础知识

在本章中,我们将学习并行计算所需的Julia基本部分:变量 函数 数组在Julia中使用jupyter笔记本,运行单元格可以使用shift + enter,也可以使用运行按钮。 运行第一个单元格可以看到,显示了最后一行的值,我们可以用分号抑制输出,尝试执行第二个单元格,可以发现没有输出。 …

Qto_ProjectionElementBaseQuantities

Qto_ProjectionElementBaseQuantities 投影图元基本数量:投影图元的所有引用的定义通用的基本数量。NameTypeDescriptionArea Q_AREAFlche悬臂、壁架或其他杆的区域,是壁架等的观察表面,或天花板结构等的基础区域。Area立面视图(对于墙投影)或底层视图(对于楼板投影)所查…

IntelliJ IDEA Maven 项目的依赖分析

在一个 maven 的项目中,我们需要知道我们的项目中使用的包可能有哪些冲突。 这个在 IntelliJ IDEA 中提供了贴心的查看。 选择 Maven 项目中的分析依赖。随后,IntelliJ IDEA 将会打开一个依赖分析的标签页。 在这个标签页中,我们可以看到我们项目中导入的依赖有哪些冲突,并…

光刻机与芯片制造技术杂谈

光刻机与芯片制造技术杂谈 单价1.2亿美元的光刻机 在中国与美国的贸易冲突中,半导体领域是其中的一个重点,它是《中国制造2025》路线图中第一个要解决的高科技领域,也是中国制造业目前的薄弱之处,在半导体设计、制造到封装三个环节中,半导体制造是国内急需突破的领域,但它…

Cesium中的坐标转换

Cesium中的坐标转换 1 Cesium中相关坐标系 1.1 WGS84坐标系 ​ cesium假设wgs84坐标系构成地球球体是xy平面的正圆,z轴稍微小一点扁椭球 ​ x轴垂直纸面向上,wgs84坐标系定义的x,y平面圆是正圆,半径是6378137,xz或者yz的圆是椭圆,z轴的半径是:6356752.3142451793 ​ WGS…

元素类型

元素类型 块元素:有display:block/display:list-item属性 特点: 1.默认情况下会独占一行,为矩形区域 2.可以定义自己的宽度和高度3.一边作为其他元素的容器 div p ul ol li dt dl dd h1-h6 行内元素:有display:inline元素 1.横着排2.不能定义宽高3.只有个别行…

MarkDown常用语法-231012

标题 # 一级标题 ## 二级标题 ### 三级标题 …… 字体样式斜体 粗体 粗斜体 清除线引用小于号表示引用图片超链接 博客园链接 列表 有序列表有序列表1 有序列表2无序列表无序列表1 无序列表2 ……代码

基于亚奈奎斯特采样和SOMP算法的平板脉冲响应空间插值matlab仿真

1.算法运行效果图预览 2.算法运行软件版本 matlab2022a3.算法理论概述平板脉冲响应(Pulse Response)是通信和雷达等领域中的重要参数,它描述了信号在空间中传播的特性。在现实应用中,获取完整的脉冲响应通常是耗时且昂贵的。基于亚奈奎斯特采样和SOMP算法的平板脉冲响应空…

Spring Cloud 2023 新特性 同步网关

网关不支持传统 Servlet 容器 Spring Cloud Gateway 需要运行在提供的 Netty 运行时。它不能在传统的 Servlet 容器中工作,也不能在构建为 WAR 时工作。WebFlux 使用了异步非阻塞的编程模型,相较于传统的 MVC Servlet 需要理解和适应新的编程范式和响应式编程概念,因此学习曲…

Arrays、Lambda

Array.sort() 对对象进行排序Lambda
推荐文章