当前位置: 首页 > news >正文

【c++题解】经典题目:带修改的 LIS 问题——CF650D Zip-line

CF650D Zip-line

题意

带修改的 LIS 问题:给你一个长为 nnn 的序列,mmm 个询问,每次询问把位置 xxx 的值修改为 yyy 后的 LIS,询问间相互独立。

题解

在这里插入图片描述
代码:

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;inline void chkmax(int &x, int y) {if (y > x) x = y;
}
inline void chkmin(int &x, int y) {if (y < x) x = y;
}const int N = 8e5 + 10;int n, m, a[N];
int btot, b[N];vector<pair<int, int>> qq[N];
int lans, vis[N], ans[N], F[N], G[N];int f[N], g[N], is[N];struct BIT {int len, mx[N];void init(int _l) {len = _l;for (int i = 0; i <= len; ++i) mx[i] = 0;}void chkmx(int x, int v) {for (; x <= len; x += x & -x) chkmax(mx[x], v);}int qry(int x) {int res = 0;for (; x; x -= x & -x) chkmax(res, mx[x]);return res;}
} t;void init() {t.init(btot);for (int i = 1; i <= n; ++i) f[i] = t.qry(a[i] - 1) + 1, t.chkmx(a[i], f[i]);t.init(btot);for (int i = n; i >= 1; --i)g[i] = t.qry(btot - a[i]) + 1, t.chkmx(btot - a[i] + 1, g[i]);for (int i = 1; i <= n; ++i) chkmax(lans, f[i] + g[i] - 1);for (int i = 1; i <= n; ++i)if (f[i] + g[i] - 1 == lans) ++vis[f[i]];for (int i = 1; i <= n; ++i)if (f[i] + g[i] - 1 == lans && vis[f[i]] == 1) is[i] = 1;
}int main() {ios::sync_with_stdio(false), cin.tie(nullptr);cin >> n >> m;for (int i = 1; i <= n; ++i) cin >> a[i], b[++btot] = a[i];for (int i = 1, x, v; i <= m; ++i) {cin >> x >> v, qq[x].push_back(make_pair(v, i));b[++btot] = v;}sort(b + 1, b + btot + 1);btot = unique(b + 1, b + btot + 1) - b - 1;auto Get = [&](int x) -> int {return lower_bound(b + 1, b + btot + 1, x) - b;};for (int i = 1; i <= n; ++i) a[i] = Get(a[i]);for (int i = 1; i <= n; ++i)for (pair<int, int> &it : qq[i])it.first = Get(it.first);init();for (int i = 1; i <= n; ++i) {for (pair<int, int> it : qq[i])if (is[i]) ans[it.second] = lans - 1;else ans[it.second] = lans;}t.init(btot);for (int i = 1; i <= n; ++i) {for (pair<int, int> it : qq[i])F[it.second] = t.qry(it.first - 1) + 1;t.chkmx(a[i], f[i]);}t.init(btot);for (int i = n; i >= 1; --i) {for (pair<int, int> it : qq[i]) G[it.second] = t.qry(btot - it.first) + 1;t.chkmx(btot - a[i] + 1, g[i]);}for (int i = 1; i <= m; ++i) cout << max(ans[i], F[i] + G[i] - 1) << '\n';return 0;
}
http://www.dtcms.com/a/356712.html

相关文章:

  • 【修复软件】【缺少dll、ocx】加载失败报错无法运行注册老软件崩溃解决修复任何软件等通用方法
  • 中文PDF解析工具测评与选型指南
  • MemoryVLA:让机器人拥有“记忆“的视觉-语言-动作模型
  • 第2.1节:AI大模型之GPT系列(GPT-3、GPT-4、GPT-5)
  • 深入解析Qt节点编辑器框架:高级特性与性能优化(四)
  • 性能测试-jmeter7-元件提取器
  • 达梦数据库-归档日志(一)
  • 达梦数据库-数据文件 (二)
  • 【ShiMetaPi M4-R1】上手:RK3568B2 |开源鸿蒙(OpenHarmony) 开发板上手指南
  • dm8_静默安装简单快速
  • 第一百零二章:AI的“未来电影制片厂CEO”:多模态系统落地项目实战(完整 AI 视频创作平台)
  • mongoDB学习(docker)
  • MYSQL速通(2/5)
  • 【开题答辩全过程】以 基于Spring Boot的网上家庭烹饪学习系统的设计与实现为例,包含答辩的问题和答案
  • 软考-系统架构设计师 办公自动化系统(OAS)详细讲解
  • LeetCode 完全背包 279. 完全平方数
  • 小程序版碰一碰发视频:源码搭建与定制化开发的源头技术解析
  • Java开发MongoDB常见面试题及答案
  • [TG开发]与Reids集成
  • five86: 2靶场渗透
  • LangChain实战(二):环境搭建与Hello World(国内开源模型版)
  • 互联网大厂Java面试:从基础到微服务云原生的深度解析
  • web3简介
  • 克隆态驱动给用户态使用流程
  • Git 8 ,git 分支开发( 切换分支开发,并设置远程仓库默认分支 )
  • 衡石SENSE 6.0技术解析:Workflow到Agent模式如何重塑计算框架
  • 04数据库约束实战:从入门到精通
  • TI-92 Plus计算器:常规计算功能介绍
  • CAN总线(Controller Area Network Bus)控制器局域网总线(二)
  • 动态UI的秘诀:React中的条件渲染