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

LeeCode 3165 线段树

题意

传送门 LeeCode 3165 不包含相邻元素的子序列的最大和

题解

考虑不含相邻子序列的最大和,在不带修改的情况下容易想到,以最后一个元素是否被选取为状态进行DP。从线性递推的角度难以处理待修改的情况。

从分治的角度考虑,使用线段树维护区间内包含或不包含边界元素的信息,即可快速维护答案。总时间复杂度 O ( m log ⁡ n ) O(m\log n) O(mlogn)

#include <bits/stdc++.h>
using namespace std;
constexpr int MOD = 1e9 + 7;
constexpr long long INF = 1e15;
struct SegmentTree {struct Node {array<long long, 4> a;Node() : a{-INF, -INF, -INF, -INF} {}Node operator+(Node& rhs) {Node res;auto _max = [](auto& x, auto y) {x = max(x, y);};for (int i = 0; i < 4; ++i) {for (int j = 0; j < 4; ++j) {if(a[i] == -INF || rhs.a[j] == -INF) {continue;}int i1 = i / 2, i2 = i % 2;int j1 = j / 2, j2 = j % 2;if (i2 == j1 && i2 == 1) {continue;}int k1 = i1, k2 = j2;_max(res.a[k1 * 2 + k2], a[i] + rhs.a[j]);}}return res;}long long get() {long long res = -INF;for (auto x : a) {res = max(res, x);}return res;}};vector<Node> dat;SegmentTree(vector<int>& a) {int n = a.size();int k = 1;while (k < n) {k *= 2;}k *= 2;dat.resize(k);function<void(int, int, int)> init = [&](int p, int l, int r) {if (r - l == 1) {dat[p].a = {0, -INF, -INF, a[l]};return;}int m = (l + r) / 2;int chl = p * 2 + 1, chr = p * 2 + 2;init(chl, l, m);init(chr, m, r);dat[p] = dat[chl] + dat[chr];};init(0, 0, n);}void update(int a, int b, int x, int p, int l, int r) {if (a <= l && r <= b) {dat[p].a = {0, -INF, -INF, x};return;}if (r <= a || b <= l) {return;}int m = (l + r) / 2;int chl = p * 2 + 1, chr = p * 2 + 2;update(a, b, x, chl, l, m);update(a, b, x, chr, m, r);dat[p] = dat[chl] + dat[chr];}
};class Solution {public:int maximumSumSubsequence(vector<int>& nums, vector<vector<int>>& queries) {int n = nums.size();SegmentTree tr(nums);int m = queries.size();long long res = 0;for (int i = 0; i < m; ++i) {int j = queries[i][0], x = queries[i][1];tr.update(j, j + 1, x, 0, 0, n);res += tr.dat[0].get();res %= MOD;}return (res + MOD) % MOD;}
};
http://www.lryc.cn/news/354796.html

相关文章:

  • 修改元组元素
  • 【模版方法设计模式】
  • rust语言初识
  • 知识图谱数据预处理笔记
  • Unity面试八股文之基础篇
  • HTTPS能否避免流量劫持?如何实现HTTPS
  • 簡述Vue 2.0 响应式数据的原理
  • Kafka线上集群部署方案怎么做?no.6
  • vscode 的 AI 协助插件 Tabnine / Codeium
  • Flutter 中的 OutlineButton 小部件:全面指南
  • Kubernetes可视化界面之DashBoard
  • Docker学习(4):部署web项目
  • 驱动开发中引入私有数据的原因
  • 删除edge浏览器文本框储存记录值以及关闭自动填充
  • mysql事务 事务并发问题 隔离级别 以及原理
  • Android 性能为王时代SparseArray和HashMap一争高下
  • 学术图表的基本配色方法
  • 【学习笔记】Webpack5(Ⅱ)
  • oracle碎片整理
  • 民国漫画杂志《时代漫画》第15期.PDF
  • Alamofire常见GET/POST等请求方式的使用,响应直接为json
  • 三分钟一条AI小和尚视频 ,日引300+创业粉。单日变现四位数 全套工具
  • vue3中表格中通过判断某个字段来设置对应按钮和消息提示的disabled展示
  • 产品经理-交互说明撰写(八)
  • Rust:struct 与字节序列的相互转换
  • 在https的系统中挂载其他http系统的画面的解决方案
  • mysql存储比特位
  • Lua中table.sort()使用方式
  • 数组与指针声明小问题
  • 【Java】手把手学会数组的使用