算法设计与编程 语文成绩 题型:差分模板题

83 阅读1分钟

P2367 语文成绩 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

给一段区间加上某个数,经典的差分:

#include<bits/stdc++.h>
using namespace std;
#define N 5000005
int n,m,x,y,z,minn=INT_MAX;
int a[N],b[N];
int main()
{
  cin.tie(nullptr)->sync_with_stdio(false);
  cin>>n>>m;
  for(int i=1;i<=n;i++)cin>>a[i];
  
  //构建差分数组
   for(int i=1;i<=n;i++)
   {
   	 b[i]=a[i]-a[i-1];
   }
   
   //区间+z
   for(int i=0;i<m;i++)
   {
   	 cin>>x>>y>>z;
	 b[x]+=z;
	 b[y+1]-=z; 
	} 
	
	//修改完后的数组中的最小值 
	for(int i=1;i<=n;i++)
	{
		a[i]=a[i-1]+b[i];
		if(minn>a[i])minn=a[i]; 
	}
	cout<<minn;
 return 0;	
} 

image.png

#include<bits/stdc++.h>
using namespace std;
#define N 5000005
int n,m,x,y,z,minn=INT_MAX;
int a[N],b[N];

void insert(int l,int r,int c)
{
  b[l]+=c;
  b[r+1]-=c;
} 
int main()
{
  cin.tie(nullptr)->sync_with_stdio(false);
  cin>>n>>m;
  for(int i=1;i<=n;i++)cin>>a[i];
  
  //构建差分数组
   for(int i=1;i<=n;i++)
   {
   	  insert(i,i,a[i]);
   }
   
   //区间+z
   for(int i=0;i<m;i++)
   {
   	 cin>>x>>y>>z;
     insert(x,y,z);
	} 
	
	//修改完后的数组中的最小值 
	for(int i=1;i<=n;i++)
	{
		a[i]=a[i-1]+b[i];
		if(minn>a[i])minn=a[i]; 
	}
	cout<<minn;
 return 0;	
} 

image.png