AcWing 4550. 超级跳跳跳

news/2025/3/10 17:20:24/文章来源:https://www.cnblogs.com/wh2011/p/18696928

题目简化后就是 LIS 将原本的价值改成了 \(a_i\),我们设 \(f_i\) 表示对于前 \(i\) 个数,必定选 \(i\),那么 \(f_i=\max\limits_{a_i>a_k}\{f_k+a_i\}\)

// #define FILE_INPUT
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;#define rep(i, a, b) for (int i = a, END##i = b; i <= END##i; i++)
#define per(i, a, b) for (int i = a, END##i = b; i >= END##i; i--)void Init();
void Solve();signed main() {cin.sync_with_stdio(0);cin.tie(0), cout.tie(0);#ifdef FILE_INPUTfreopen("input.in", "r", stdin);#endifint T = 1;// cin >> T;while (T--) {Init();Solve();}return 0;
}using LL = long long;
using ULL = unsigned long long;const int Mod = 1e9 + 7;
const int Inf = 0x3f3f3f3f;
const LL InfLL = 0x3f3f3f3f3f3f3f3f;const int N = 1010;
int n, f[N], a[N];void Init() {
}void Solve() {while (cin >> n, n) {rep(i, 1, n) cin >> a[i];int ans = 0;rep(i, 1, n) {f[i] = a[i];rep(j, 1, i - 1) if (a[i] > a[j]) {f[i] = max(f[i], f[j] + a[i]);}ans = max(ans, f[i]);}cout << ans << "\n";}
}

上面的代码时间复杂度是 \(O(n^2)\) 的,对于 \(n=10^5\) 时明显过不去,我们可以利用线段树来进行优化,从而将时间复杂度变为 \(O(n\log_2n)\),当然,线段树也可以优化 LIS 问题(虽然没必要,用二分就行)。

将这一行优化成 \(\log_2n\)

rep(j, 1, i - 1) if (a[i] > a[j]) {f[i] = max(f[i], f[j] + a[i]);
}

代码:

// #define FILE_INPUT
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;#define rep(i, a, b) for (int i = a, END##i = b; i <= END##i; i++)
#define per(i, a, b) for (int i = a, END##i = b; i >= END##i; i--)void Init();
void Solve();signed main() {cin.sync_with_stdio(0);cin.tie(0), cout.tie(0);#ifdef FILE_INPUTfreopen("input.in", "r", stdin);#endifint T = 1;// cin >> T;while (T--) {Init();Solve();}return 0;
}using LL = long long;
using ULL = unsigned long long;const int Mod = 1e9 + 7;
const int Inf = 0x3f3f3f3f;
const LL InfLL = 0x3f3f3f3f3f3f3f3f;const int N = 1010;
int n, f[N], a[N], rk[N], tot;#define lc (p << 1)
#define rc (p << 1 | 1)
int tree[N << 2], tag[N << 2];
void pushdown(int p) {if (tag[p] != -1) {tree[lc] = max(tree[lc], tag[p]);tag[lc] = max(tag[lc], tag[p]);tree[rc] = max(tree[rc], tag[p]);tag[rc] = max(tag[rc], tag[p]);tag[p] = -1;}
}
void pushup(int p) {tree[p] = max(tree[lc], tree[rc]);
}
void update(int p, int L, int R, int l, int r, int d) {if (l <= L && R <= r) {tree[p] = max(tree[p], d);tag[p] = max(tag[p], d);return;}pushdown(p);int Mid = L + R >> 1;if (l <= Mid) update(lc, L, Mid, l, r, d);if (r > Mid) update(rc, Mid + 1, R, l, r, d);pushup(p);
}
int query(int p, int L, int R, int x) {if (L == x && R == x) return tree[p];pushdown(p);int Mid = L + R >> 1;if (x <= Mid) return query(lc, L, Mid, x);return query(rc, Mid + 1, R, x);
}void Init() {
}void Solve() {while (cin >> n, n) {tot = 0;memset(tree, 0, sizeof(tree));memset(tag, -1, sizeof(tag));rep(i, 1, n) {cin >> a[i];rk[++tot] = a[i];}sort(rk + 1, rk + tot + 1);tot = unique(rk + 1, rk + tot + 1) - rk - 1;int ans = 0;rep(i, 1, n) {int x = lower_bound(rk + 1, rk + tot + 1, a[i]) - rk;f[i] = query(1, 1, tot, x) + a[i];if (x + 1 <= tot) update(1, 1, tot, x + 1, tot, f[i]);ans = max(ans, f[i]);}cout << ans << "\n";}
}

我是不会告诉你我是为了凸显时间快才用离散化的 😃

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

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

相关文章

Windows安装Mysql-5.7(解压包方式)

1、下载Mysql的安装包下载地址:https://downloads.mysql.com/archives/community/ 注意:官网的下载速度可能很慢,有任务时间要求的须尽快下载,或者使用其他可靠的下载源2、选择对应的版本注意:选择完MySQL的版本后,可以看到下载列表中有两个可以选择,下载名字不带 Debug …

无耳科技 Solon v3.0.7 发布(2025农历新年版)

新一代,面向全场景的 Java 企业级应用开发框架。从零开始构建(非 java-ee 架构),有灵活的接口规范与开放生态。采用对商业应用友好的 Apache 2.0 开源协议。Solon 框架! Solon 框架由杭州无耳科技有限公司(下属 Noear 团队)开发并开源。是新一代,面向全场景的 Java 企业…

橡胶 2025年

大周期 C浪结束后 拔起的第一波:节后16900附近计划做到橡胶

【洛谷P1126】机器人搬重物

是搜索play的第四弹! 机器人搬重物 题目描述 机器人移动学会(RMI)现在正尝试用机器人搬运物品。机器人的形状是一个直径 \(1.6\) 米的球。在试验阶段,机器人被用于在一个储藏室中搬运货物。储藏室是一个 \(N\times M\) 的网格,有些格子为不可移动的障碍。机器人的中心总是…

数据库安全管理中的权限控制:保护数据资产的关键措施

title: 数据库安全管理中的权限控制:保护数据资产的关键措施 date: 2025/2/2 updated: 2025/2/2 author: cmdragon excerpt: 在信息化迅速发展的今天,数据库作为关键的数据存储和管理中心,已经成为了企业营运和决策的核心所在。然而,伴随着数据规模的不断扩大和数据价值的…

动手学大模型应用开发,第3天:大模型开发流程及架构

一、大模型开发整体流程 1. 何为大模型开发 我们将开发以大语言模型为功能核心、通过大语言模型的强大理解能力和生成能力、结合特殊的数据或业务逻辑来提供独特功能的应用称为大模型开发。开发大模型相关应用,其技术核心点虽然在大语言模型上,但一般通过调用 API 或开源模型…

Omnissa Horizon 8 2412 (8.14) 发布 - 虚拟桌面基础架构 (VDI) 和应用软件

Omnissa Horizon 8 2412 (8.14) 发布 - 虚拟桌面基础架构 (VDI) 和应用软件Omnissa Horizon 8 2412 (8.14) - 虚拟桌面基础架构 (VDI) 和应用软件 之前称为 VMware Horizon, 通过高效、安全的虚拟桌面交付增强您的工作空间 请访问原文链接:https://sysin.org/blog/omnissa-hor…

VMware Tanzu Kubernetes Grid Integrated Edition (TKGI) 1.21 - 运营商 Kubernetes 解决方案

VMware Tanzu Kubernetes Grid Integrated Edition (TKGI) 1.21 - 运营商 Kubernetes 解决方案VMware Tanzu Kubernetes Grid Integrated Edition (TKGI) 1.21 - 运营商 Kubernetes 解决方案 Kubernetes-based container solution with advanced networking, a private contain…

关于 高精度性能计数器的频率 和 cpu 频率 不一致问题

/* rdtsc指令, 该指令返回CPU自启动以来的时钟周期数;该时钟周期数,即处理器的时间戳。在CPU通电启动后,首先会重置EDX和EAX,在每个时钟周期上升或下降沿到来时,会自动累计周期数,并被记录到EDX和EAX寄存器中,EDX是高位,EAX是低位。rdtsc指令就是从该寄存器中进行获取的…

《操作系统真象还原》第十一章 TSS与用户进程

本文介绍了TSS(Task State Segment)的概念及其在操作系统中的应用。TSS是用于存储任务状态的数据结构,每个任务都有自己的TSS,包含任务切换时需要保存和恢复的信息。Intel建议为每个任务关联一个TSS,CPU通过TR寄存器指向当前任务的TSS,实现任务切换。现代操作系统采用基于…

【渗透测试】Vulnhub GROTESQUE 1.0.1

渗透环境 攻击机: IP: 192.168.10.18(Kali) 靶机: IP:192.168.10.9 靶机下载地址:https://www.vulnhub.com/entry/grotesque-101,658/ 涉及知识点:WordPress扫描(WPScan)、WrodPress反弹shell、Keypass文件解密进行渗透 一、 获取端口信息 nmap或者arp-scan都能…