Leetcode 3165. 不包含相邻元素的子序列的最大和
复制代码
 1 const int mod = 1e9+7;
 2 struct SegNode {
 3     SegNode() {
 4         v00 = v01 = v10 = v11 = 0;
 5     }
 6     void set(long long v) {
 7         v00 = v01 = v10 = 0;
 8         v11 = max(v, 0LL);
 9     }
10     long long best() {
11         return v11;
12     }
13     
14     long long v00, v01, v10, v11;
15 };
16 
17 class SegTree {
18 public:
19     SegTree(int n): n(n), tree(n * 4 + 1) {}
20     void init(const vector<int>& nums) {
21         internal_init(nums, 1, 1, n);
22     }
23     void update(int x, int v) {
24         internal_update(1, 1, n, x + 1, v);
25     }
26     long long query() {
27         return tree[1].best();
28     }
29 
30 private:
31     void internal_init(const vector<int>& nums, int x, int l, int r) {
32         if (l == r) {
33             tree[x].set(nums[l - 1]);
34             return;
35         }
36         int mid = (l + r) / 2;
37         internal_init(nums, x * 2, l, mid);
38         internal_init(nums, x * 2 + 1, mid + 1, r);
39         pushup(x);
40     }
41     void internal_update(int x, int l, int r, int pos, int v) {
42         if (l > pos || r < pos) {
43             return;
44         }
45         if (l == r) {
46             tree[x].set(v);
47             return;
48         }
49         int mid = (l + r) / 2;
50         internal_update(x * 2, l, mid, pos, v);
51         internal_update(x * 2 + 1, mid + 1, r, pos, v);
52         pushup(x);
53     }
54     void pushup(int x) {
55         int l = x * 2, r = x * 2 + 1;
56         tree[x].v00 = max(tree[l].v00 + tree[r].v10, tree[l].v01 + tree[r].v00);
57         tree[x].v01 = max(tree[l].v00 + tree[r].v11, tree[l].v01 + tree[r].v01);
58         tree[x].v10 = max(tree[l].v10 + tree[r].v10, tree[l].v11 + tree[r].v00);
59         tree[x].v11 = max(tree[l].v10 + tree[r].v11, tree[l].v11 + tree[r].v01);
60     }
61 
62 private:
63     int n;
64     vector<SegNode> tree;
65 };
66 
67 class Solution {
68 public:
69     int maximumSumSubsequence(vector<int>& nums, vector<vector<int>>& queries) {
70         int n = nums.size();
71         SegTree tree(n);
72         tree.init(nums);
73         
74         int ans = 0;
75         for (const auto& q: queries) {
76             tree.update(q[0], q[1]);
77             ans = ((long long)ans + tree.query()) % mod;
78         }
79         return ans;
80     }
81 };
复制代码

 

posted on   greenofyu  阅读(4)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 因为Apifox不支持离线,我果断选择了Apipost!
· 通过 API 将Deepseek响应流式内容输出到前端
点击右上角即可分享
微信分享提示