萌新鸽子WA50分求助
查看原帖
萌新鸽子WA50分求助
227728
冰糖鸽子TJ鸽子协会楼主2021/7/9 18:25

RT,后五个点,不开O2TLE,开了就WA。
单调队列优化DP


// Problem: P3957 [NOIP2017 普及组] 跳房子
// Contest: Luogu
// URL: https://www.luogu.com.cn/problem/P3957
// Memory Limit: 250 MB
// Time Limit: 2000 ms
// Powered by CP Editor (https://github.com/cpeditor/cpeditor)

#include <bits/stdc++.h>
using namespace std;
#define mid ((l+r)/2)
#define M 500010
#define int long long
const int inf=1e17;
int n,D,k,L,zz,R,l,r,ans,f[M],sum;
struct node
{int v,t;}p[M];
deque<node>d;
int max(int xx,int yy) {return (xx>yy?xx:yy);}
void Cg(node V,int tim)
{
	while(d.size()&&(d.front().t>tim+R)) d.pop_front();
	while(d.size()&&(d.back().v<V.v)) d.pop_back();
	d.push_back(V);
}
void Cut(int tim) {while(d.size()&&(d.front().t>tim+R)) d.pop_front();}
int check(int x)
{
	L=max(D-x,1),R=D+x,zz=n;for(int i=1;i<=n;i++) f[i]=p[i].v;f[0]=f[n+1]=f[n+2]=0;
	d.clear();
	Cg(node{0,p[n].t},1);
	for(int i=n-1;i>=0;i--)
	{
		while((p[zz].t-p[i].t)>R) zz--;
		while((p[zz].t-p[i].t)>=L&&(p[zz].t-p[i].t)<=R) Cg(node{f[zz],p[zz].t},p[i].t),zz--;
		Cut(p[i].t);
		f[i]+=(d.size()?d.front().v:-inf);
	}
	return f[0]>=k;
}
signed main()
{
	cin>>n>>D>>k;p[0].v=p[0].t=0;
	for(int i=1;i<=n;i++) cin>>p[i].t>>p[i].v,f[i]=p[i].v,sum+=max(0,p[i].v);
	r=max(D,(p[n].t-D));
	if(sum<k) {cout<<-1;return 0;}
	while(l+2<=r)
	{
		if(check(mid)) r=ans=mid;
		else l=mid+1;
	}
	for(int i=l;i<=r;i++) if(check(i)) {cout<<i<<endl;return 0;}
	return 0;
}
2021/7/9 18:25
加载中...