I. Ice Cream Shop

这篇博客介绍了一种利用双指针预处理区间并进行差分处理的方法,来解决点覆盖问题。代码展示了一个高效实现,适用于处理与区间覆盖相关的问题,通过排序和最小值计算,达到优化目标。

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

做法 :

每一个点都有一个对应的是否能取到的区间,在这个区间内便可被取到,因此可以双指针预处理出区间,并使用差分获得各个值即可。 

看了大佬的代码,感觉码风非常好,故记录下来。

#include <bits/stdc++.h>

using namespace std;
typedef long long ll;
const int N = 1e4 + 7;
const ll inf = 1e18;
int n,m;
ll ans;

int main()
{
	
	cin >> n >> m;
	std::vector<ll > as(n),xs(m),dis(n,inf);
	for(ll &a : as) cin >> a;
	for(ll &x : xs) cin >> x;
	sort(xs.begin(),xs.end());
	for(int i = 0 , j = -1 ; i < n ; i++)
	{
		ll x = i * 100;
		while(j + 1 < m && xs[j + 1] < x )j++;
		if(j >= 0) dis[i] = min(dis[i],x - xs[j]);
		if(j + 1 < m) dis[i] = min(dis[i],xs[j + 1] - x);
	}
	std::vector<pair<ll,ll> > eves(2 * n);
	for(int i = 0 ; i < n ; i++)
	{
		ll x = i * 100;
		eves[2 * i] = {x - dis[i],as[i]};
		eves[2 * i + 1] = {x + dis[i],-as[i]};
	}
	sort(eves.begin(),eves.end());
	ll now = 0;
	for(auto eve : eves)
	{
		now += eve.second;
		ans = max(ans,now);
	}
	cout << ans << endl;
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值