社区讨论
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 条回复,欢迎继续交流。
正在加载回复...