尧图网站建设 尧图网络
  • 首页
  • 关于我们
  • 服务项目
  • 案例展示
  • 建站流程
  • 资讯中心
  • 联系我们
首页/资讯中心/详情

20250921 模拟赛 T4 题解

20250921 模拟赛 T4 题解
📅 发布时间:2026/6/20 8:13:09

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;
}

相关新闻

  • 1.3 课前问题列表
  • warm-flow 监听器对象获取问题
  • Hexo Butterfly 5.4 分页问题 YAML 错误 解决方法总结

最新新闻

  • 从M68HC11E实战解析8位MCU架构:寄存器、外设与低功耗设计
  • 深入解析LPC408x/7x外设与电源管理:从原理到低功耗实战
  • 重庆黄金回收避坑2026|多数用户遇压价 无资质回收需谨慎 - 名奢变现站
  • 大师兄小论文剖析
  • MC68F375 TPU SIOP功能深度解析:从原理到工程实践
  • 源头GEO优化服务商推荐 :AI平台GEO优化原生服务商 靠谱 - 真知灼见33

日新闻

  • 信任的进化:技术实现详解——如何用JavaScript构建博弈论模拟器
  • Terrakube自定义工作流:如何集成OPA、Infracost等工具扩展IaC能力
  • grunt-concurrent快速入门:5分钟学会并行运行Grunt任务

周新闻

  • 3步解锁iOS设备:applera1n激活锁绕过完全指南
  • 39 2026 人工智能证书终极盘点,普通人选 AI 证书可以从这些方向入手
  • Redis 暴露公网有多危险?从端口检查到补救步骤

月新闻

  • 【总结】入门篇:50句话让你记住架构核心概念
  • WeChatMsg技术方案解析:实现Mac微信数据自主管理的完整解决方案
  • WeChatMsg:革新性微信数据备份方案,打造你的专属数字记忆库

关于尧图

  • 公司简介
  • 团队介绍
  • 企业文化
  • 荣誉资质

服务项目

  • 定制开发
  • 电商建站
  • UI 设计
  • 运维服务

快速链接

  • 案例展示
  • 建站流程
  • 常见问题
  • 资讯中心

联系方式

  • 📍北京市朝阳区互联网产业园 A 座 10 层
  • 📞400-888-8888
  • ✉️contact@rkmt.cn
  • 🕐周一至周日 9:00-21:00

© 2024 北京尧图网络科技有限公司 版权所有 | 京 ICP 备 XXXXXXXX 号