首页 > 其他分享 >leetcode 3165. 不包含相邻元素的子序列的最大和

leetcode 3165. 不包含相邻元素的子序列的最大和

时间:2024-05-28 22:44:02浏览次数:13  
标签:cout val int vector 序列 3165 leetcode define

思路

题目中不相邻子序列和的最大值是满足加和性质的,考虑使用线段树,这里我用了4颗线段树,sum[o][l][r]中l=0和l=1分别表示当前区间是否选取左端点作为子序列的一部分,r=0和r=1分别表示当前区间是否选取右端点作为子序列的一部分。接下来就是线段树单点更新。

  1 #define IO std::ios::sync_with_stdio(0),cin.tie(0),cout.tie(0)
  2 #define bug(x) cout<<#x<<" is "<<x<<endl
  3 #include <bits/stdc++.h>
  4 #define iter ::iterator
  5 using namespace  std;
  6 typedef long long ll;
  7 typedef pair<int,int>P;
  8 #define pb push_back
  9 #define mk make_pair
 10 #define se second
 11 #define fi first
 12 #define rs o*2+1
 13 #define ls o*2
 14 const int N=1e5+5;
 15 const int mod=1e9+7;
 16 ll sum[N*4][2][2];
 17 vector<int>a;
 18 void up(int o,int l,int r,int pos,int val){
 19     if(l==r){
 20         //printf("o=%d  l=%d  val=%d\n",o,l,val);
 21         if(val<=0)sum[o][1][0]=0;
 22         else sum[o][1][0]=val;
 23         return;
 24     }
 25     int m=(l+r)/2;
 26     if(pos<=m)up(ls,l,m,pos,val);
 27     else up(rs,m+1,r,pos,val);
 28     
 29 
 30     if(l==m&&r==m+1){
 31         sum[o][0][0]=0;
 32         sum[o][0][1]=sum[rs][1][0];
 33         sum[o][1][0]=sum[ls][1][0];
 34         sum[o][1][1]=0;
 35     }
 36     else if(l==m){
 37         sum[o][0][0]=max(sum[rs][0][0],sum[rs][1][0]);
 38         sum[o][0][1]=max(sum[rs][0][1],sum[rs][1][1]);
 39         sum[o][1][0]=sum[ls][1][0]+sum[rs][0][0];
 40         sum[o][1][1]=sum[ls][1][0]+sum[rs][0][1];
 41     }
 42     else if(r==m+1){
 43         sum[o][0][0]=max(sum[ls][0][0],sum[ls][0][1]);
 44         sum[o][0][1]=sum[ls][0][0]+sum[rs][1][0];
 45         sum[o][1][0]=max(sum[ls][1][0],sum[ls][1][1]);
 46         sum[o][1][1]=sum[ls][1][0]+sum[rs][1][0];
 47     }
 48     else{
 49         ll res=sum[ls][0][0]+sum[rs][0][0];
 50 
 51 
 52 
 53         sum[o][0][0]=res;
 54         res=sum[ls][0][1]+sum[rs][0][0];
 55         sum[o][0][0]=max(sum[o][0][0],res);
 56         res=sum[ls][0][0]+sum[rs][1][0];
 57         sum[o][0][0]=max(sum[o][0][0],res);
 58 
 59 
 60         res=sum[ls][1][0]+sum[rs][0][0];
 61         sum[o][1][0]=res;
 62         res=sum[ls][1][0]+sum[rs][1][0];
 63         sum[o][1][0]=max(sum[o][1][0],res);
 64         res=sum[ls][1][1]+sum[rs][0][0];
 65         sum[o][1][0]=max(sum[o][1][0],res);
 66 
 67 
 68         res=sum[ls][0][0]+sum[rs][0][1];
 69         sum[o][0][1]=res;
 70 
 71         res=sum[ls][0][0]+sum[rs][1][1];
 72         sum[o][0][1]=max(sum[o][0][1],res);
 73 
 74         res=sum[ls][0][1]+sum[rs][0][1];
 75         sum[o][0][1]=max(sum[o][0][1],res);
 76 
 77 
 78 
 79         res=sum[ls][1][0]+sum[rs][0][1];
 80         sum[o][1][1]=res;
 81 
 82         res=sum[ls][1][0]+sum[rs][1][1];
 83         sum[o][1][1]=max(sum[o][1][1],res);
 84 
 85         res=sum[ls][1][1]+sum[rs][0][1];
 86         sum[o][1][1]=max(sum[o][1][1],res);
 87     }
 88 }
 89 class Solution {
 90 public:
 91     int maximumSumSubsequence(vector<int>& nums, vector<vector<int>>& queries) {
 92         a=nums;
 93         int n=nums.size();
 94         for(int i=1;i<=n;i++){
 95             sum[i][0][0]=0;
 96             sum[i][0][1]=0;
 97             sum[i][1][0]=0;
 98             sum[i][1][1]=0;
 99         }
100         for(int i=0;i<n;i++){
101             int x=nums[i];
102             up(1,1,n,i+1,x);
103         }
104         //printf("\n\n");
105         ll ans=0;
106         int cnt=0;
107         for(auto v:queries){
108             cnt++;
109             int x=v[0];
110             int y=v[1];
111             up(1,1,n,x+1,y);
112             ll res=0;
113             res=max(res,sum[1][0][0]);
114             res=max(res,sum[1][0][1]);
115             res=max(res,sum[1][1][0]);
116             res=max(res,sum[1][1][1]);
117             //bug(res);
118             ans=(ans+res)%mod;
119             // for(int i=1;i<=n;i++){
120             //     printf("i=%d \n",i);
121             //     printf("sum[i]=%d\n",sum[i][0][0]);
122             //     printf("sum[i]=%d\n",sum[i][0][1]);
123             //     printf("sum[i]=%d\n",sum[i][1][0]);
124             //     printf("sum[i]=%d\n",sum[i][1][1]);
125             // }
126             //if(cnt==1)break;
127         }
128 
129         
130         return ans;
131     }
132 };
133 
134 int main(){
135 
136 
137     Solution A;
138 
139     // vector<int>nums={3,5,9};
140 
141     // vector<vector<int>>queries={{1,-2},{0,-3}};
142 
143     vector<int>nums={4,0,-1,-2,3,1,-1};
144 
145     vector<vector<int>>queries={{3,1},{0,-2},{1,-1},{0,-2},{5,4},{6,-3},{6,-2},{2,-1}};
146 
147     cout<<A.maximumSumSubsequence(nums,queries);
148 
149 
150 }

 

   

标签:cout,val,int,vector,序列,3165,leetcode,define
From: https://www.cnblogs.com/ccsu-kid/p/18219135

相关文章

  • LeetCode/NowCoder-栈和队列OJ练习
    孜孜不倦:孜孜:勤勉,不懈怠。指工作或学习勤奋不知疲倦。......
  • 【LeetCode算法】第88题:合并两个有序数组
    目录一、题目描述二、初次解答三、官方解法四、总结一、题目描述二、初次解答1.思路:首次想到的解法:定义一个m+n长度的辅助数组,从头遍历这两个数组,谁小就放进辅助数组中并且对应往后走,最后使用memcpy函数将辅助数组内容拷贝到nums1中。这种解法容易想到,但是空间复杂......
  • 【LeetCode算法】第83题:删除排序链表中的重复元素
    目录一、题目描述二、初次解答三、官方解法四、总结一、题目描述二、初次解答1.思路:双指针法,只需遍历一遍。使用low指向前面的元素,high用于查找low后面与low不同内容的节点。将具有不同内容的节点链接在low后面,实现重复元素的删除。2.代码:/***Definitionfor......
  • 7-52 求简单交错序列前N项和
    本题要求编写程序,计算序列1-1/4+1/7-1/10+...的前N项之和。输入格式:输入在一行中给出一个正整数N。输出格式:在一行中按照“sum=S”的格式输出部分和的值S,精确到小数点后三位。题目保证计算结果不超过双精度范围。输入样例:10输出样例:sum=0.819#inc......
  • 7-51 求奇数分之一序列前N项和
    本题要求编写程序,计算序列1+1/3+1/5+...的前N项之和。输入格式:输入在一行中给出一个正整数N。输出格式:在一行中按照“sum=S”的格式输出部分和的值S,精确到小数点后6位。题目保证计算结果不超过双精度范围。输入样例:23输出样例:sum=2.549541#include<......
  • 代码随想录算法训练Day20|LeetCode654-最大二叉树、LeetCode617-合并二叉树、LeetCode
    最大二叉树题目描述力扣654-最大二叉树给定一个不重复的整数数组nums。最大二叉树可以用下面的算法从nums递归地构建:创建一个根节点,其值为nums中的最大值。递归地在最大值左边的子数组前缀上构建左子树。递归地在最大值右边的子数组后缀上构建右子树。......
  • 数据容器(序列)的切片 学会啦
    1.序列内容连续、有序,可使用下标索引的数据容器。(列表、元组、字符串都可以称为序列)2.切片从一个序列中取出一个子序列。3.语法:序列[起始下标:结束下标:步长]4.从序列中,从指定位置开始,依次取出元素,到指定位置结束,得到一个新序列:·起始下标表示从何开始,可以留空(表示从头......
  • 序列化与反序列化(GO)
    GO序列化与反序列化定义序列化:把对象转化为可传输的字节序列的过程称为序列化反序列化:把字节序列还原为对象的过程称为反序列化。--作为开发者,序列化和反序列化一直是我们老生常谈的问题,也是非常琐碎但是重要的知识点。对于序列化与反序列化,我这里强烈推荐一篇博客,你可以从中......
  • LeetCode-2877. 从表中创建 DataFrame
    2877.从表中创建DataFrame编写一个解决方案,基于名为student_data的二维列表创建一个DataFrame。这个二维列表包含一些学生的ID和年龄信息。DataFrame应该有两列,student_id和age,并且与原始二维列表的顺序相同。返回结果格式如下示例所示。示例1:输入:student_data:[......
  • .NET8序列化与反序列化
    序列化与反序列化JSON简介JSON(JavaScriptObjectNotation)是一种轻量级的数据交换格式,采用类的形式来描述数据之间的关联关系。JSON是一个序列化的对象或数组。JSON中仅有六个构造字符([、]、{、}、:、,),以及无意义的空白符(换行、空间等)JSON中的数据类型:对象(使用{})、数组(使用[])、......