为什么会这样
查看原帖
为什么会这样
801371
Midnight_szx楼主2023/4/5 16:44

如代码

#include<iostream>
#include<queue>
#include<cstring>
#define int long long
using namespace std;
int n, d, k, ans = -1;
int a[500005][3];
int f[500005];
int check(int g) {
	int l = d - g, r = d + g;
	if(l < 1)
	    l = 1;
    deque<int> q;
	memset(f, 0, sizeof(f));
	int p = 0;
	for(int i = 1; i <= n; i++) {
		for(; p < i and a[i][1] - a[p][1] >= l; p++) {
			while(!q.empty() and f[p] >= f[q.back()])
			    q.pop_back();
			q.push_back(p);
		}
		while(!q.empty() and a[i][1] - a[q.front()][1] > r)
		    q.pop_front();
		if(!q.empty())
		    f[i] = f[q.front()] + a[i][2];
		else
		    f[i] = -999999999999;
		if(f[i] >= k)
		    return 1;
	}
	return 0;
}
signed main() {
	std::ios::sync_with_stdio(0);
	cin>>n>>d>>k;
	for(int i = 1; i <= n; i++) 
	    cin>>a[i][1]>>a[i][2];
	int ll = 0, rr = 1005;
	int mid = (ll + rr) >> 1;
	while(ll <= rr) {
		if(check(mid) == 1){
			ans = mid;
			rr = mid - 1;
		}
		else
		    ll = mid + 1;
		mid = (ll + rr) >> 1;
	}
	cout<<ans;
	return 0;
}

为什么把第27行的f[i] = -999999999999;改成f[i] = (-1) * (1 << 31);就只有90pts ???

2023/4/5 16:44
加载中...