20250921 模拟赛 T4 题解

news/2025/9/21 16:19:50/文章来源:https://www.cnblogs.com/Scarab/p/19103786

Description

https://zhengruioi.com/problem/3343?cid=1976

Solution

容易发现区间 LIS 满足四边形不等式,所以最终的答案关于划分段数是凸的。

\(d_i=f_i-f_{i-1}\)。那么由于 \(\sum d_i=n\)\(d_i\) 不增,所以 \(d_i\) 只有 \(O(\sqrt n)\) 种取值。

于是就只需要求出 \(g_k\) 表示 \(d_i\geq k\) 的最大的 \(i\),这个 \(g_k\) 也只有 \(O(\sqrt n)\) 种取值。

求单点的 \(g_k\) 的做法是设一个区间的贡献是 LIS 减 \(k\),然后再对一个 pair 进行 dp,这个 pair 的含义是 {最大权值,最大段数}。

对于所有的 \(g_k\) 考虑分治求,假设现在需要求出 \([l,r]\)\(g_k\) 值,先暴力求出 \(g_{mid}\) 的值 \(v\),如果 \(v=g_{l-1}\) 就说明 \([l,mid-1]\) 全是 \(v\),直接赋值,否则继续递归。对于右区间同理。

可以证明只需要求 \(O(\sqrt n)\) 次单点 \(g_k\) 的值。

时间复杂度:\(O(n\sqrt n\log n)\)

Code

#include <bits/stdc++.h>// #define int int64_tusing pii = std::pair<int, int>;const int kMaxN = 1.5e5 + 5;int cid, n;
int a[kMaxN], d[kMaxN], res[kMaxN];
int ct;template<class T> inline void chkmax(T &x, T y) { x = (x > y ? x : y); }
template<class T> inline void chkmin(T &x, T y) { x = (x < y ? x : y); }struct BIT {pii c[kMaxN];void clear() { std::fill_n(c + 1, n + 1, pii{-1e9, 0}); }void upd(int x, pii v) {for (; x <= n + 1; x += x & -x) chkmax(c[x], v);}pii qry(int x) {pii ret = {-1e9, 0};for (; x; x -= x & -x) chkmax(ret, c[x]);return ret;}
} bit;int get(int k) {static pii f[kMaxN];bit.clear();bit.upd(n + 1, {0, 0});++ct;pii mx = {0, 0};for (int i = 1; i <= n; ++i) {pii v1 = mx, v2 = bit.qry(a[i] - 1);v1.first += 1 - k, ++v1.second, ++v2.first;bit.upd(a[i], f[i] = std::max(v1, v2));chkmax(mx, f[i]);}return bit.qry(n + 1).second;
}void solve(int l, int r, int vl, int vr) {if (l > r) return;int mid = (l + r) >> 1, val = get(mid);d[mid] = val;if (val == vl) {for (int i = l; i < mid; ++i) d[i] = val;} else {solve(l, mid - 1, vl, val);}if (val == vr) {for (int i = mid + 1; i <= r; ++i) d[i] = val;} else {solve(mid + 1, r, val, vr);}
}void dickdreamer() {std::cin >> n;for (int i = 1; i <= n; ++i) std::cin >> a[i];d[0] = n, d[n + 1] = 0;// std::cerr << get(1) << '\n';ct = 0;solve(1, n, n, 0);for (int i = n; ~i; --i) {for (int j = d[i + 1] + 1; j <= d[i]; ++j)res[j] = res[j - 1] + i;}for (int i = 1; i <= n; ++i) std::cout << res[i] << " \n"[i == n];// for (int i = 0; i <= n + 1; ++i) std::cerr << d[i] << " \n"[i == n + 1];
}int32_t main() {freopen("lis.in", "r", stdin);freopen("lis.out", "w", stdout);std::ios::sync_with_stdio(0), std::cin.tie(0), std::cout.tie(0);int T = 1;std::cin >> cid >> T;while (T--) dickdreamer();// std::cerr << 1.0 * clock() / CLOCKS_PER_SEC << "s\n";return 0;
}

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

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

相关文章

1.3 课前问题列表

1.什么样的方法应该用static修饰?不用static修饰的方法往往具有什么特性?Student的getName应该用static修饰吗? 1.通常是工具类方法、单例模式中获取单例对象的方法等应该用static修饰 2.不用static修饰的方法特性:…

NOIP 模拟赛十一

贪心+打表+数据结构+DPA. 倒序贪心即可。点击查看#include <bits/stdc++.h> #define lep(i, a, b) for (int i = a; i <= b; ++i) #define rep(i, a, b) for (int i = a; i >= b; --i) #define il inline …

Proxy 库解析(四)

test一切伟大的行动和思想,都有一个微不足道的开始。 There is a negligible beginning in all great action and thought.

warm-flow 监听器对象获取问题

初次使用warm-flow 实现了 Listener 接口,配置名字和路径也有写对,但监听器一直没启动,查看底层代码Listener listener = (Listener) FrameInvoker.getBean(clazz);在要执行监听器时,一直获取不到对象,很疑惑,打…

Hexo Butterfly 5.4 分页问题 YAML 错误 解决方法总结

Hexo Butterfly 5.4 分页问题 & YAML 错误 解决方法总结 本次问题核心是 “首页分页显示不全(仅 1、2…11)” 与 “hexo clean 报错 YAML 重复键”,最终通过配置文件修正 + 主题模板调整解决,具体步骤如下: 一…

FPGA硬件设计6 ZYNQ外围-HDMI、PCIE、SFP、SATA、FMC - 教程

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

js逆向:某Q音乐平台请求数据模拟生成

@目录1. 加密原理2. 参考代码内容仅供学习使用,不能用于商业活动,且不能在该网站高用户访问时频繁访问,以免对对应服务器造成影响。1. 加密原理 该音乐平台加密数据为如下图片这个:所加密的数据data和这篇文章里的…

第十一届中国大学生程序设计竞赛网络预选赛(CCPC Online 2025)

Preface最近因为队友要准备预推免,很久没有一起训练过了;我个人也是把大部分精力都放在科研方面,算是挺久没写代码了 同时因为这场撞了本校预推免的原因,导致学校很多队伍被迫重组,但好在我们队没受影响堪堪凑齐了…

完整教程:数据结构 栈和队列、树

完整教程:数据结构 栈和队列、树pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco&q…

深入解析:【ubuntu】ubuntu中找不到串口设备问题排查

深入解析:【ubuntu】ubuntu中找不到串口设备问题排查pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas&qu…

酵母双杂交技术:高通量筛选的突破与不可忽视的三大局限性

在后基因组时代,解析蛋白质相互作用网络已成为理解生命活动机制、挖掘疾病靶点的核心任务。酵母双杂交技术通过不断革新,已从 “一对一” 的简单互作验证,升级为 “组学水平” 的高通量筛选工具 —— 不仅能覆盖全基…

ubuntu20.04测试cuda

import torch# 1. 检查 PyTorch 版本 print("PyTorch 版本:", torch.__version__) # 应为 2.4.0# 2. 检查 CUDA 是否可用 print("CUDA 可用:", torch.cuda.is_available()) # 应为 True# 3. 检查…

Python lambda

Python lambda 漫思

Android Studio 配置国内源

腾讯:https://mirrors.cloud.tencent.com/AndroidSDK/ 阿里:https://mirrors.aliyun.com/android.googlesource.com/

PyCharm项目上传GitHub仓库(笔记) - 教程

PyCharm项目上传GitHub仓库(笔记) - 教程pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "…

从RAG出发

从RAG出发 1. RAG的概念和背景 1.1 什么是RAG RAG(Retrieval-Augmented Generation,检索增强生成)是一种将 信息检索 与 大语言模型生成 融合的技术架构。 其核心思想是:在模型生成前,通过检索外部知识库获取相关…

软件工程第二次作业——第一次个人编程作业

这个作业属于哪个课程 https://edu.cnblogs.com/campus/gdgy/Class12Grade23ComputerScience这个作业要求在哪里 https://edu.cnblogs.com/campus/gdgy/Class12Grade23ComputerScience/homework/13468这个作业的目标 实…

【树状数组】codeforce 1288 E. Messenger Simulator

View Post【树状数组】codeforce 1288 E. Messenger Simulator题目 https://codeforces.com/problemset/problem/1288/E 题解 用以下测试用例进行讲解: 4 2 3 2上述测试用例的执行过程如图所示:初始状态下,第 \(i\)…

exsi 6.7 打补丁

exsi 6.7 打补丁exsi 6.7 打补丁esxi 6.7 打补丁WARNING:All commands run on the ESXi shell are logged and may be included insupport bundles. Do not provide passwords directly on the command line.Most tool…

Ubuntu 24.04 安装 DaVinci Resolve

Ubuntu 24.04 安装 DaVinci Resolve Step1: 下载并安装 chmod +x DaVinci_Resolve_Studio_19.0_Linux.run sudo ./DaVinci_Resolve_Studio_19.0_Linux.run -i可能会遇到依赖的问题, 需要先安装以下的几个库, 再以跳过检…