社区讨论

40tps!调了5天了,悬关求助

P3957[NOIP 2017 普及组] 跳房子参与者 2已保存回复 5

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
5 条
当前快照
1 份
快照标识符
@lzmq54k2
此快照首次捕获于
2024/08/09 21:09
2 年前
此快照最后确认于
2024/08/09 22:20
2 年前
查看原帖
CPP
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int N = 5e5 + 10;
int read(){
	int x=0,f=1;char ch=getchar();
	while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
	while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
	return x*f;
}
ll readll(){
	ll x=0,f=1;char ch=getchar();
	while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
	while(ch>='0'&&ch<='9'){x=(x<<3)+(x<<1)+ch-'0';ch=getchar();}
	return x*f;
}
ll n, d, k;
struct node{
	ll w, pos;
}a[N]; 
deque<ll> q;
int l, r;
ll f[N];
bool check( int g ){
	for( int i = 1 ; i <= n ; ++i )f[i] = -0x7f7f7f7f7f;
	f[0] = 0;
	ll str = 1;
	ll L = max(str,d-g);
	ll R = d+g;
	ll ans = -1;
	int j = 0;
	for( int i = 1 ; i <= n ; ++i ){
		while( !q.empty() && a[q.front()].pos < a[i].pos - R )q.pop_front();
		while( a[j].pos <= a[i].pos - L && j < i ){
			while( !q.empty() && f[q.back()] <= f[j] )q.pop_back();
			q.push_back(j);
			++j;
		}
		f[i] = f[q.front()] + a[i].w;
		if( f[i] >= k )return true;
	}
	return false;
}
int erfen( int l , int r){
	if( l == r )return l;
	int mid = (l + r) >> 1;
	if( check(mid) ){
		return erfen(l,mid);
	}
	else return erfen(mid+1,r);
}
int main(){
	n = readll();d = readll();k = readll();
	ll tot = 0;
	for( int i = 1 ; i <= n ; ++i ){
		a[i].pos = readll();a[i].w = readll();
		if( a[i].w > 0 )tot += a[i].w;
	}
	if( tot < k ){
		cout << -1 << "\n";
		return 0;
	}
	l = 1 , r = max(a[n].pos,d);
	int ans = erfen(l,r);
	cout << ans << '\n';
	return 0;
}

AC的点是#1,#2,#4,#5.

回复

5 条回复,欢迎继续交流。

正在加载回复...