• 差分数组|AcWing 797. 差分| AcWing 798. 差分矩阵


    797. 差分

    差分理论:

    1. package main
    2. import (
    3. "bufio"
    4. "fmt"
    5. "os"
    6. "strconv"
    7. "strings"
    8. )
    9. var scanner *bufio.Scanner
    10. func insert(l int, r int, c int, b []int) {
    11. b[l] += c
    12. b[r+1] -= c
    13. }
    14. func main() {
    15. //假设数组从1开始赋值
    16. var n, m int
    17. var a, b []int
    18. scanner = bufio.NewScanner(os.Stdin)
    19. //用例一行有十万个数据 bufio.NewScanner的底层buf数组最大缓存限制为64K,要重新分配内存
    20. bs := make([]byte, 2000*1024)
    21. scanner.Buffer(bs, len(bs))
    22. //读取一行
    23. scanner.Scan()
    24. line := strings.Split(scanner.Text(), " ")
    25. n, _ = strconv.Atoi(line[0])
    26. m, _ = strconv.Atoi(line[1])
    27. //赋值n+2为了构造差分数组不越界
    28. a = make([]int, n+2)
    29. b = make([]int, n+2)
    30. //读取一行
    31. scanner.Scan()
    32. line = strings.Split(scanner.Text(), " ")
    33. for i, s := range line {
    34. x, _ := strconv.Atoi(s)
    35. a[i+1] = x
    36. }
    37. //相当于构造b[i]=a[i]-a[i-1],即构建差分数组
    38. for i := 1; i <= n; i++ {
    39. // insert(i, i, a[i], b) 这个有点难理解,按照下面那个好理解些, 已经是理解了,可以带入几个值就知道了。注意a数组和b数组的定义。
    40. b[i] = a[i] - a[i-1]
    41. }
    42. for i := 0; i < m; i++ {
    43. scanner.Scan()
    44. line := strings.Split(scanner.Text(), " ")
    45. l, _ := strconv.Atoi(line[0])
    46. r, _ := strconv.Atoi(line[1])
    47. c, _ := strconv.Atoi(line[2])
    48. insert(l, r, c, b)
    49. }
    50. for i := 1; i <= n; i++ {
    51. a[i] = a[i-1] + b[i]
    52. }
    53. for i := 1; i <= n; i++ {
    54. fmt.Printf("%d ", a[i])
    55. }
    56. }
    57. // 第一次构建差分数组,用insert那个,是这样的
    58. 牢记:
    59. a[i]是b[i]的前缀和
    60. b[i]是a[i]的查分数组
    61. 什么意思呢?
    62. 就是说 a[i] = b[1] + b[2]+...+b[i]
    63. 如何构造的呢?正常是令b[1] = a[1], b[2] = a[2] - a[1], b[3] = a[3] - a[2], b[n] = a[n] - a[n-1]
    64. b[1] += a[1] = a[1]
    65. b[2] -= a[1] = -a[1]
    66. b[2] += a[2] = -a[1] + a[2]
    67. b[3] -= a[2] = -a[2]
    68. b[3] += a[3] = -a[2] + a[3] = a[3] - a[2] # 这里
    69. ....
    70. ....
    71. b[n] = a[n] - a[n-1]
    72. // 我们想要的查分数组b是下面这样的
    73. b[1] = a[1]
    74. b[2] = a[2] - a[1]
    75. b[3] = a[3] - a[2] # 这里
    76. b[n] = a[n] - a[n-1]
    77. a[n] = b[1] + b[2] + ... + b[n]

    798. 差分矩阵

     

     

     

    1. package main
    2. import (
    3. "bufio"
    4. "fmt"
    5. "os"
    6. "strconv"
    7. "strings"
    8. )
    9. const n = 1005
    10. var a, b [n][n]int
    11. func main() {
    12. var n, m, q, x1, x2, y1, y2, c int
    13. fmt.Scan(&n, &m, &q)
    14. scanner := bufio.NewScanner(os.Stdin)
    15. bs := make([]byte, 2000*1024)
    16. scanner.Buffer(bs,len(bs))
    17. for i := 1; i<=n; i++ {
    18. scanner.Scan()
    19. temp := strings.Split(scanner.Text()," ")
    20. for j := 1; j <= m; j ++ {
    21. a[i][j], _ = strconv.Atoi(temp[j-1])
    22. insert(i,j,i,j,a[i][j])
    23. }
    24. }
    25. for i := 1; i<= q; i++{
    26. scanner.Scan()
    27. temp := strings.Split(scanner.Text()," ")
    28. x1,_ = strconv.Atoi(temp[0])
    29. y1,_ = strconv.Atoi(temp[1])
    30. x2,_ = strconv.Atoi(temp[2])
    31. y2,_ = strconv.Atoi(temp[3])
    32. c,_ = strconv.Atoi(temp[4])
    33. insert(x1,y1,x2,y2,c)
    34. }
    35. for i := 1; i<= n; i++{
    36. res := make([]string, m)
    37. for j := 1; j<=m; j++ {
    38. b[i][j] += b[i-1][j] + b[i][j-1] - b[i-1][j-1]
    39. res[j-1] = strconv.Itoa(b[i][j])
    40. }
    41. fmt.Println(strings.Join(res," "))
    42. }
    43. }
    44. func insert(x1,y1,x2,y2,c int) {
    45. b[x1][y1] += c
    46. b[x1][y2+1] -= c
    47. b[x2+1][y1] -= c
    48. b[x2+1][y2+1] += c
    49. }

     

     

  • 相关阅读:
    CRM 自动化如何改善销售和客户服务?
    Web自动化测试 —— PageObject设计模式!
    Spring Cloud Alibaba Sentinel 简单使用
    DFS——迷宫
    商人宝:选择服装店收银系统源码需要注意的三个关键点
    【C++】多态学习
    【Python 实战基础】Pandas如何从字符串中解析某一数据,并统计多于一次的该数据
    X Metaverse Pro Cloud Mining Starts a New Level of Mining
    绿色科技和可持续发展技术
    【Android知识笔记】热修复专题
  • 原文地址:https://blog.csdn.net/weixin_42161901/article/details/127856873