2022-03-18:arr数组长度为n, magic数组长度为m
比如 arr = { 3, 1, 4, 5, 7 },如果完全不改变arr中的值,
那么收益就是累加和 = 3 + 1 + 4 + 5 + 7 = 20
magics[i] = {a,b,c} 表示arr[a~b]中的任何一个值都能改成c
并且每一种操作,都可以执行任意次,其中 0 <= a <= b < n
那么经过若干次的魔法操作,你当然可能得到arr的更大的累加和
返回arr尽可能大的累加和
n <= 10^7 m <= 10^6 arr中的值和c的范围 <= 10^12

答案2022-03-18:

线段树。

代码用golang编写。代码如下:

  1. package main
  2. import (
  3. "fmt"
  4. "sort"
  5. )
  6. func main() {
  7. arr := []int{3, 1, 4, 5, 7}
  8. magics := [][]int{{2, 5, 5}, {1, 3, 2}}
  9. ret := maxSum3(arr, magics)
  10. fmt.Println(ret)
  11. }
  12. // O(N) + O(M * logM) + O(M * logN) + O(N)
  13. func maxSum3(arr []int, magics [][]int) int {
  14. n := len(arr)
  15. st := NewSegmentTree3(n)
  16. sort.Slice(magics, func(i, j int) bool {
  17. a := magics[i]
  18. b := magics[j]
  19. return a[2] < b[2]
  20. })
  21. for _, magic := range magics {
  22. st.update0(magic[0]+1, magic[1]+1, magic[2], 1, n, 1)
  23. }
  24. ans := 0
  25. query := st.buildSingleQuery(n)
  26. for i := 0; i < n; i++ {
  27. ans += getMax(query[i], arr[i])
  28. }
  29. return ans
  30. }
  31. // 为方法三特别定制的线段树
  32. // 区间上维持最大值的线段树
  33. // 支持区间值更新
  34. // 为本道题定制了一个方法:
  35. // 假设全是单点查询,请统一返回所有单点的结果(一个结果数组,里面有所有单点记录)
  36. type SegmentTree3 struct {
  37. max []int
  38. change []int
  39. update []bool
  40. index int
  41. }
  42. func NewSegmentTree3(size int) *SegmentTree3 {
  43. ans := &SegmentTree3{}
  44. N := size + 1
  45. ans.max = make([]int, N<<2)
  46. ans.change = make([]int, N<<2)
  47. ans.update = make([]bool, N<<2)
  48. return ans
  49. }
  50. func (this *SegmentTree3) pushUp(rt int) {
  51. this.max[rt] = getMax(this.max[rt<<1], this.max[rt<<1|1])
  52. }
  53. func getMax(a, b int) int {
  54. if a > b {
  55. return a
  56. } else {
  57. return b
  58. }
  59. }
  60. func (this *SegmentTree3) pushDown(rt, ln, rn int) {
  61. if this.update[rt] {
  62. this.update[rt<<1] = true
  63. this.update[rt<<1|1] = true
  64. this.change[rt<<1] = this.change[rt]
  65. this.change[rt<<1|1] = this.change[rt]
  66. this.max[rt<<1] = this.change[rt]
  67. this.max[rt<<1|1] = this.change[rt]
  68. this.update[rt] = false
  69. }
  70. }
  71. func (this *SegmentTree3) update0(L, R, C, l, r, rt int) {
  72. if L <= l && r <= R {
  73. this.update[rt] = true
  74. this.change[rt] = C
  75. this.max[rt] = C
  76. return
  77. }
  78. mid := (l + r) >> 1
  79. this.pushDown(rt, mid-l+1, r-mid)
  80. if L <= mid {
  81. this.update0(L, R, C, l, mid, rt<<1)
  82. }
  83. if R > mid {
  84. this.update0(L, R, C, mid+1, r, rt<<1|1)
  85. }
  86. this.pushUp(rt)
  87. }
  88. func (this *SegmentTree3) buildSingleQuery(n int) []int {
  89. ans := make([]int, n+1)
  90. this.process(ans, 1, n, 1)
  91. return ans
  92. }
  93. func (this *SegmentTree3) process(ans []int, l, r, rt int) {
  94. if l == r {
  95. ans[this.index] = this.max[rt]
  96. this.index++
  97. } else {
  98. mid := (l + r) >> 1
  99. this.pushDown(rt, mid-l+1, r-mid)
  100. this.process(ans, l, mid, rt<<1)
  101. this.process(ans, mid+1, r, rt<<1|1)
  102. }
  103. }

执行结果如下:


左神java代码

2022-03-18:arr数组长度为n, magic数组长度为m 比如 arr = { 3, 1, 4, 5, 7 },如果完全不改变arr中的值, 那么收益就是累加和 = 3 + 1 + 4 +的更多相关文章

  1. GNU C的定义长度为0的数组

    在标准C和C++中,长度为0的数组是被禁止使用的.不过在GNU C中,存在一个非常奇怪的用法,那就是长度为0的数组,比如Array[0];很多人可能觉得不可思议,长度为0的数组是没有什么意义的,不过在 ...

  2. 不用循环,、es6创建一个长度为100的数组

    问题描述:在不使用循环的条件下,如何创建一个长度为100的数组,并且数组的每一个元素是该元素的下标? 结果为: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 1 ...

  3. 前端面试题:不使用loop循环,创建一个长度为100的数组,并且每个元素的值等于它的下标,,怎么实现好?

    昨天,看这道题,脑子锈住了,就是没有思路,没看明白是什么意思?⊙﹏⊙|∣今天早上起床,想到需要思考一下这个问题. 当然,我没想明白为什么要这样做?(创建一个长度为100的数组,并且每个元素的值等于它的 ...

  4. java—数组乘积输入: 一个长度为n的整数数组input 输出: 一个长度为n的数组result,满足result[i] = input数组中,除了input[i] 之外的所有数的乘积,不用考虑溢出例如 input {2, 3, 4, 5} output: {60, 40, 30, 24}

    /** * 小米关于小米笔试题 数组乘积输入: 一个长度为n的整数数组input 输出: 一个长度为n的数组result,满足result[i] = * input数组中,除了input[i] 之外的 ...

  5. 将数组分割为几个等长度的子数组(使用slice)

    先了解一下slice方法: slice() 1.定义:slice()可从已有数组中截取返回指定的元素,形成一个新的数组: 语法:arrayObject.slice(start,end): 参数 描述 ...

  6. 算法进阶面试题03——构造数组的MaxTree、最大子矩阵的大小、2017京东环形烽火台问题、介绍Morris遍历并实现前序/中序/后序

    接着第二课的内容和带点第三课的内容. (回顾)准备一个栈,从大到小排列,具体参考上一课.... 构造数组的MaxTree [题目] 定义二叉树如下: public class Node{ public ...

  7. 给定数组a[1,2,3],用a里面的元素来生成一个长度为5的数组,打印出其排列组合

    给定数组a[1,2,3],用a里面的元素来生成一个长度为5的数组,打印出其排列组合 ruby代码: def all_possible_arr arr, length = 5 ret = [] leng ...

  8. Day_12【集合】扩展案例1_利用集合的知识对长度为10的int数组进行去重,产生新数组,不能改变数组中原来数字的大小顺序

    分析以下需求,并用代码实现 1.定义一个长度为10的int数组,并存入10个int类型的数据,其中有一些数据是重复的 2.利用集合的知识对数组进行去重,产生新数组,不能改变数组中原来数字的大小顺序 3 ...

  9. Java中长度为0的数组与null的区别

    有如下两个变量定义,这两种定义有什么区别呢? 1. int[] zero = new int[0]; 2. int[] nil = null; zero是一个长度为0的数组,我们称之为“空数组”,空数 ...

  10. <转>浅析长度为0的数组

    前面在看Xen的源码时,遇到了一段代码,如下所示: 注意上面最后一行的代码,这里定义了一个长度为的数组,这种用法可以吗?为什么可以使用长度为0 的数组?长度为的数组到底怎么使用?……这篇文章主要针对该 ...

随机推荐

  1. react hooks(useState、useEffect、useRef详解)

    好巧不巧,工作了一年跳槽了,之前用的vue,现在用的react- 嗯!工作使人进步!现在开始学react吧! 切入正题- react hooks是React16.8.0之后出现的, 类组件存在的问题: ...

  2. pytorch模块介绍:torch.nn

    一.简介 nn全称为neural network,意思是神经网络,是torch中构建神经网络的模块. 二.子模块介绍 2.1 nn.functional 该模块包含构建神经网络需要的函数,包括卷积层. ...

  3. codec

    1.codec究竟是什么 音频解码芯片:Audio codec,又叫声卡:本质就是ADC和DAC 2.codec的作用 在移动设备中,codec的作用可以归结为4种,分别如下: playback:对P ...

  4. python内置函数map()

    map()函数 介绍 map()是python的一个内置函数,其作用是返回一个迭代器,该迭代器将function函数应用于可迭代对象的每个项,并产生结果. map函数的语法: map(function ...

  5. BaseMapperX

    package cn.iocoder.yudao.framework.mybatis.core.mapper; import cn.iocoder.yudao.framework.common.poj ...

  6. Docker下部署LNMP黄金架构

    一.部署lnmp 1.网络规划 172.16.10.0/24nginx:172.16.10.10mysql:172.16.10.20php:172.16.10.30网站访问主目录:/wwwrootng ...

  7. 前后端分离项目,配置问题导致后端session丢失问题

    今天遇到一个巨坑,后端写了获取验证码接口,以及验证验证码接口 获取验证码接口: /// <summary> /// 获取验证码 /// </summary> /// <r ...

  8. Gitee 码云与Git 交互

    一.进入码云官方网站,注册用户 官网地址:https://gitee.com/ 二.创建远程仓库 [1]点击右上角的 + 号进行创建

  9. 集成-AgileConfig基于.NetCore的一个轻量级配置中心

    微服务确实是行业的一个趋势,我自己也在把一些项目往微服务架构迁移.玩微服务架构配置中心是一个绕不过去的东西,有很多大牌的可以选,比如spring-cloud-config,apoll,disconf等 ...

  10. dart基础---->dart语法入门

    Dart is an open source, structured programming language for creating complex, browser-based web appl ...