做法 :
每一个点都有一个对应的是否能取到的区间,在这个区间内便可被取到,因此可以双指针预处理出区间,并使用差分获得各个值即可。
看了大佬的代码,感觉码风非常好,故记录下来。
#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;
}