c语言网-1501-[蓝桥杯][算法提高VIP]分苹果

本文介绍了一种利用线段树和差分数组解决特定类型问题的方法,通过实例解析了如何在大规模数据下高效计算每个元素的累积值,避免了O(m*n)的时间复杂度超时问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目描述

小朋友排成一排,老师给他们分苹果。
小朋友从左到右标号1..N。有M个老师,每次第i个老师会给第Li个到第Ri个,一共Ri-Li+1个小朋友每人发Ci个苹果。
最后老师想知道每个小朋友有多少苹果。

数据规模和约定
100%的数据,N、M≤100  000,1≤Li≤Ri≤N,0≤Ci≤100。
 

输入

第一行两个整数N、M,表示小朋友个数和老师个数。 
接下来M行,每行三个整数Li、Ri、Ci,意义如题目表述。

输出

一行N个数,第i个数表示第i个小朋友手上的水果。 

样例输入

5  3 
1  2  1 
2  3  2 
2  5  3 

样例输出

1  6  5  3  3 

这个题目用到了线段树的知识  因为用普通的循环  我们得到的时间复杂度为O(m*n) 肯定会超时

言归正传,所谓差分数组,就是说假设有两个数组d[i],a[i],d[i]=a[i]-a[i-1],d[0]=a[0],那么d[i]就是a[i]的差分数组,d[i]的前缀和就是a[i],即a[i]=d[i]+d[i-1]+...+d[0];

本题中,发苹果的方式是连续的,那么每次改变的差分数组只有d[l]和d[r+1],连续m次,

最后根据上述公式可以求出每个小朋友得到的苹果。

其实差分数组求和的原理就是数学上的裂项相消,可以说并不困难,可我就是没能想到,我能说什么呢!

 #  include <iostream>
  # include <iomanip>
  # include <algorithm>
  using namespace std;
  int main ()
  {
  	int a,b;
  	cin>>a>>b;
  	int array[100001];
  	for(int g=0;g<100001;g++)
  	{
  		array[g]=0;
	  }
  	for(int g=0;g<b;g++)
  	{
  		int d,e,f;
  		cin>>d>>e>>f;
  	array[d]+=f;
  	array[e+1]-=f;
	  }
	  for(int c=1;c<=a;c++)
	  {
	  	array[c]+=array[c-1];
	  	
	  }
	  for(int c=1;c<=a;c++)
	  {
	  	cout<<array[c]<<" ";
	  }
	cout<<endl;
  	
  }

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值