进食后人
查看原帖
进食后人
1048780
zhangchi1234楼主2025/7/2 08:23

如果像我这样直接在前面的dp上加1,然后在ans上减一的话要将ans初值赋为1

#include<bits/stdc++.h>
using namespace std;
const int N=5e5+5;
int n,d,r,h[N],id[N],s[N<<2],dp[N],ans=1;
void pushup(int k)
{
	s[k]=max(s[k*2],s[k*2+1]);
}
void change(int k,int l,int r,int x,int v)
{
	if(l==r&&l==x)
	{
		s[k]+=v;
		return;
	}
	int mid=(l+r)>>1;
	if(x<=mid)change(k*2,l,mid,x,v);
	else change(k*2+1,mid+1,r,x,v);
	pushup(k);
}
int ask(int k,int l,int r,int x,int y)
{
	if(x<=l&&r<=y)
	{
		return s[k];
	}
	int mid=(l+r)>>1,ans=0;
	if(x<=mid)ans=max(ans,ask(k*2,l,mid,x,y));
	if(y>mid)ans=max(ans,ask(k*2+1,mid+1,r,x,y));
	return ans;
}
int main()
{
	cin>>n>>d>>r;
	for(int i=1;i<=n;i++)
	{
		cin>>h[i];
		id[h[i]]=i;
	}
	for(int i=1;i<=n;i++)
	{
		int o=id[i];
		if(i>d)change(1,1,n,id[i-d],dp[id[i-d]]);
		if(o!=1)dp[o]=max(dp[o],ask(1,1,n,max(o-r,1),o-1)+1);
		if(o!=n)dp[o]=max(dp[o],ask(1,1,n,o+1,min(o+r,n))+1);
		ans=max(ans,dp[o]);
	}
	cout<<ans-1;
}
2025/7/2 08:23
加载中...