首页 > 其他分享 >差分和前缀和——蓝桥杯备赛

差分和前缀和——蓝桥杯备赛

时间:2024-04-07 15:33:33浏览次数:25  
标签:杯备赛 示例 差分 蓝桥 summ ls 区间 input 维护费用

一、大学里的树木要打药

问题描述
教室外有 N 棵树,根据不同的位置和树种,学校要对其上不同的药。

因为树的排列成线性,且非常长,我们可以将它们看作一条直线给他们编号。

树的编号从 0∼N−1且N<1e6 。

对于树的药是成区间分布,比如 3∼5 号的树靠近下水道,所以他们要用驱蚊虫的药,20∼26 号的树,他们排水不好,容易涝所以要给他们用点促进根系的药 ⋯诸如此类。

每种不同的药要花不同的钱。

现在已知共有 M 个这样的区间,并且给你每个区间花的钱,问最后这些树木要花多少药费。

输入描述
每组输入的第一行有两个整数 N和 M。N 代表马路的共计多少棵树,M 代表区间的数目,N 和 M 之间用一个空格隔开。(1<=N<=1000000,1<=M<=100000)

接下来的 M 行每行包含三个不同的整数,用一个空格隔开,分别表示一个区域的起始点 L 和终止点 R 的坐标,以及花费。

输出描述
输出包括一行,这一行只包含一个整数,所有的花费。

输入示例

500 3
150 300 4
100 200 20
470 471 19

输出示例

2662 


问题分析

这题直接151*4+101*20+2*19=2662不就好了。但还是先用用差分吧。

刚开始这500个树所需的钱均为0,所以其差分数列(对原列表中的每个数,都让其减去前面一个数,其中第一个数让其不变)也均为0。对于后面input的m行数,一行一行处理,让差分数列在第l个数加上所需的钱,在第r+1个数减去所需的钱,最后做一步差分的逆运算,以此就可以实现在区间[l,r]中每个数加上所需的钱。


代码示例

n,m=map(int,input().split())
ls=[0 for i in range(n)]
for i in range(m):
    l,r,q=map(int,input().split())
    ls[l]+=q
    ls[r+1]-=q
for i in range(1,n):
    ls[i]+=ls[i-1]
print(sum(ls))

二、大学里的树木要维护

题目描述
教室外有 N 棵树,根据不同的位置和树种,学校已经对其进行了多年的维护。因为树的排列成线性,且非常长,我们可以将它们看作一条直线给他们编号。

树的编号从 1∼N且N<1e6。由于已经维护了多年,每一个树都由学校的园艺人员进行了维护费用的统计。

每棵树的前期维护费用各不相同,但是由于未来需要要打药,所以有些树木的维护费用太高的话,就要重新种植。由于维护费用也呈区间分布,所以常常需要统记一个区间里的树木的维护开销。

现在园艺人员想知道,某个区间内的树木维护开销是多少。共计 M个区间需要查询。

输入描述
每组输入的第一行有两个整数 N和 M。N 代表马路的共计多少棵树,M 代表区间的数目,N 和 M 之间用一个空格隔开。(1<=N<=1000000,1<=M<=100000)

接下来的一行,包含 N 个数 ,分别表示每棵树的维护费用,每个数之间用空格隔开。

接下来的 M 行每行包含两个不同的整数,用一个空格隔开,表示一个区域的起始点 L 和终止点 R 的坐标。

输出描述
输出包括 M 行,每一行只包含一个整数,表示维护该区间的开销。

输入示例

10 3
7 5 6 4 2 5 0 8 5 3
1 5
2 6
3 7

输出示例

24
22
17 


问题分析 

这道题可以用前缀和来做,对于输入的数据(每棵树的维护费用),先在最前面加一个0(方便之后l,r的对应),之后创设一个sum列表,其中summ[i]=summ[i-1]+a[i],那么我们要求的从第1棵到第5棵树的维护费用之和就可以表示成summ[5]-summ[0]。


代码示例

n,m=map(int,input().split())
a=[0]+[int(i) for i in input().split()]
s=0
summ=[0]
for i in range(1,n+1):
    s+=a[i]
    summ.append(s)
for i in range(m):
    l,r=map(int,input().split())
    res=summ[r]-summ[l-1]
    print(res)

标签:杯备赛,示例,差分,蓝桥,summ,ls,区间,input,维护费用
From: https://blog.csdn.net/weixin_71409897/article/details/137419690

相关文章

  • 蓝桥杯,省赛,动态规划专题,青蛙,更小的数,松散子序列,接龙数列
    #include<bits/stdc++.h>usingnamespacestd;constintN=1e5+9;doublex[N],a[N],b[N];doubledp[N][5];intmain(){intn;cin>>n;for(inti=1;i<=n;i++)cin>>x[i];for(inti=1;i<=n-1;i++)cin>>a[i]>>b[i......
  • 差分
    前言学习差分前一定要先学习前缀和,因为差分就是前缀和的一个逆运算(有点像微分和积分),所以只有先搞清楚前缀和才能明白差分点这里补习前缀和这里同样也是从一维和二维两个角度去分析差分这个算法正文我们要先理清差分的含义:注意关系,这里跟前缀和里举的例子有差别,b的前缀和数组......
  • 蓝桥杯嵌入式2017年第八届省赛主观题解析
    1 题目2  代码/*USERCODEENDHeader*//*Includes------------------------------------------------------------------*/#include"main.h"#include"rtc.h"#include"tim.h"#include"gpio.h"/*Privateincludes--......
  • [蓝桥杯 2022 国 B] 齿轮(优化枚举)
        根据题目描述,如果采用dfs暴力做法枚举所有方案,肯定会超时,因此我们需要优化枚举,我们都知道在同一组共同转动的齿轮中,线速度相等,因此角速度的比值就是半径的反比,因此我们只需要找到对于每个齿轮作为起始齿轮,只需要找到其倍数半径是否存在即可,而倍数上限就是假设存在......
  • [蓝桥杯 2021 省 B] 杨辉三角形(二分查找+枚举)
        我们之前学过有关杨辉三角的一些性质,我们知道杨辉三角某个数等于左上和右上两个数相加,但是如果我们按照这个性质依次枚举每行每列,就会很容易超时,因此我们可以枚举列,再二分查找行来寻找满足要求的答案,我们可以先将列数到30,基本涵盖了所有的答案,通过组合数性质来二......
  • [蓝桥杯 2022 省 B] 李白打酒加强版(三维动态规划)
        通过题目描述,我们可以知道这道题目涉及到某种状态时候的方案数,因此我们可以用动态规划来解决问题,并且我们需要注意到酒的状态,因此我们可以用三维数组来存储状态,我们知道N,M最大不会超过100,并且如果酒超过了100斗,即使遇到100朵花也无法喝完,因此只需要定义大小都为1......
  • 蓝桥杯 试题 算法训练 拿金币
    问题描述有一个NxN的方格,每一个格子都有一些金币,只要站在格子里就能拿到里面的金币。你站在最左上角的格子里,每次可以从一个格子走到它右边或下边的格子里。请问如何走才能拿到最多的金币。输入格式第一行输入一个正整数n。以下n行描述该方格。金币数保......
  • python蓝桥题库2141-山
    见题目我最近买了他们官方的程序设计竞赛的书,一本紫色的,在引子部分这部分出现了这道题,最开始看代码的时候没看懂,我现在来逐层分析,你需要有一定基础来看这篇文章,还要就是我的见解偶数情况第一行先设置了个ans的计数变量接下来range循环20-20223(不对啊?这和题目要求的循环......
  • 蓝桥杯2023年A组-试题B-有奖问答
    0.题目小蓝正在参与一个现场问答的节目。活动中一共有30道题目,每题只有答对和答错两种情况,每答对一题得10分,答错一题分数归零。小蓝可以在任意时刻结束答题并获得目前分数对应的奖项,之后不能再答任何题目。最高奖项需要100分,所以到达100分时小蓝会直接停止答题。已知......
  • 第二十五周代码(蓝桥杯查缺补漏)
    2024/03/31    周日填充题目链接【参考代码】想用暴力,没过//枚举,未出结果QAQ#include <bits/stdc++.h>using namespace std;string s00 = "00";string s11 = "11";int ans = 0;//m个问号,子串有2^m种,使用dfs//初步思路:分割子串,直到只有两......