蓝桥杯绝世武功(二阶差分)

文章探讨了在一阶差分和二阶差分算法中对时间复杂度的影响。一阶差分时间复杂度为O(n*n),而通过二阶差分可以将时间复杂度降低到O(n)。代码示例展示了如何实现这两种方法,特别是在处理区间加不同值的问题上,二阶差分显示出更高的效率。

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

一阶差分时间复杂度O(n*n),得分25

#include<iostream>//一阶差分过不了,时间复杂度大O(n*n)
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int main()
{
	int n,m;
	cin>>n>>m;
	ll *a=new ll [n+10];
	ll sum=0;
	memset(a,0,sizeof(ll)*(n+10));
//	for(int i=0;i<n+10;i++)cout<<a[i]<<' ';
//	cout<<endl;
	int l,r;
	ll s,e;
	for(int i=1;i<=m;i++)
	{
		cin>>l>>r>>s>>e;
        int d=(e-s)/(r-l);//求公差 
        a[l]+=s;
        a[r+1]-=s;
        if(d!=0){
		
        for(int i=l+1;i<=r;i++)
        {
        	a[i]+=d;
        	a[r+1]-=d;
		}
		
	}
	}
	for(int i=1;i<=n;i++)
	{
		a[i]=a[i-1]+a[i];
//		cout<<a[i]<<' ';
		sum+=a[i];
	}
//	cout<<endl;
	cout<<sum<<endl; 
	
	delete[] a;
	return 0;
}

二阶差分时间复杂度O(n),得分100

#include<iostream>//二阶差分时间复杂度O(n) 
using namespace std;

//绝世武功(二阶差分数组)
typedef long long ll;
ll n,m,d,ans;//d:[s,e]公差
ll a[10000005],d1[10000005],d2[10000005];
int main()
{
    cin>>n>>m;
    for(int i=1;i<=m;i++){
       ll l,r,s,e;
       cin>>l>>r>>s>>e;
       d=(e-s)/(r-l);//求出公差
       d2[l]= d2[l]+s;//都加首项 
       d2[l+1]=d2[l+1]+d-s;
       d2[r+1]=d2[r+1]-d-e;
       d2[r+2]=d2[r+2]+e;
    }
    for(int i=1;i<=n;i++){
        d1[i]=d1[i-1]+d2[i];//一阶
        a[i]=a[i-1]+d1[i]; //二阶 
        ans+=a[i];
    }
    cout<<ans<<endl;
    return 0;
} //二阶差分用于一个区间加不同的值:http://t.csdn.cn/iFmuJ
//通过原数组推一阶,把一阶当做原数组推二阶 
//最好用三个数组,这样一个for就可以出来:必须一阶一阶的完成 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值