[题解]CSP-J2022山东入门组补赛T1植树节

题目传送门

看一下题目,可以将题目简化一下:

给定n个区间,对于每个区间,将区间内的所有数+1

先看一下暴力

#include <bits/stdc++.h>
using namespace std;

int n,l,r,tree[1000005],ans=-1;
signed main(){
	cin>>n;
	while(n--){
		cin>>l>>r;
		for(int i=l;i<=r;i++){
			tree[i]++;
		}
	}
	for(int i=1;i<=1000001;i++){
		ans=max(ans,tree[i]);
	}
	cout<<ans<<endl;
	return 0;
}

再看一眼数据范围

每个区间都直接加的话时间复杂度最大应该是O(10^6*10^5)=O(10^{11}),这你不超时谁超时

所以得另想其它的方法

不难发现,这不就是一道差分的板子题嘛

如果不会差分可以自学一下

C++之差分入门-优快云博客

虽说我也卡了90WA了很长时间

那么这道题就不难做了

核心代码
for(int i=1;i<=n;i++){
    cin>>l>>r;
    d[l]++,d[r+1]--;
}

所以这道题只要会差分就很简单了

 完整代码
#include <bits/stdc++.h>
using namespace std;

int n,l,r,ans,d[1000005],tree[1000005];
signed main(){
	cin>>n;
	while(n--){
		cin>>l>>r;
		d[l]++,d[r+1]--;
	}
	for(int i=0;i<=1000001;i++){
		tree[i]=d[i]+tree[i-1];
		ans=max(ans,tree[i]);
	}
	cout<<ans<<endl;
	return 0;
}

顺便带一句:是因为补赛的原因吗,第一道题都上普及减了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值