70pts求求求求求调
查看原帖
70pts求求求求求调
1275819
nzlys04楼主2025/7/24 16:49

WA on #5,#6,#7

#include<bits/stdc++.h>
using namespace std;
#define int long long
const int N=5e5+5,inf=5e5;
int a[N],dp[N],res[N];
struct Segmenttree{
	int l,r;
	int w;
}t[4*(2*inf+10)]; 
void pushup(int u)
{
	t[u].w=min(t[u<<1].w,t[u<<1|1].w);
}
void build(int l,int r,int u)
{
	t[u].l=l,t[u].r=r;
	if(l==r)
	{
		t[u].w=0x3f3f3f3f;
		return;
	}
	int mid=l+r>>1;
	build(l,mid,u<<1);
	build(mid+1,r,u<<1|1);
	pushup(u);
}
int query(int u,int l,int r)//区间查询 
{
	if(t[u].l>=l&&t[u].r<=r)
		return t[u].w;
	if(t[u].r<l||t[u].l>r)
		return 0x3f3f3f3f;
	return min(query(u<<1,l,r),query(u<<1|1,l,r));
}
void update(int u, int pos, int val) 
{
    if(t[u].l==t[u].r) 
	{
        t[u].w=min(t[u].w,val);
        return;
    }
    int mid=(t[u].l+t[u].r)>>1;
    if(pos<=mid) update(u<<1,pos,val);
    else update(u<<1|1,pos,val);
    pushup(u);
}
 main()
{
	std::ios::sync_with_stdio(0);
	cin.tie(0),cout.tie(0); 
	int n,m;
	cin>>n>>m;
	memset(dp,0x3f,sizeof dp);
	for(int i=1;i<=n;++i)
	{
		cin>>a[i],a[i]--;
		if(!a[i])a[i]--;
		res[i]=res[i-1]+a[i];
	}
	build(0,2*inf,1);
	update(1,inf,0);
	for(int i=1;i<=n;++i)
	{
		dp[i]=query(1,res[i]-m+inf,res[i]+m+inf)+1;
		update(1,res[i]+inf,dp[i]);
//		cout<<dp[i]<<" ";
	}
	cout<<dp[n];
	return 0;
}
2025/7/24 16:49
加载中...