WA零分求调QAQ
查看原帖
WA零分求调QAQ
1030687
coco20121120楼主2025/7/24 17:04

样例过了但WA零分QAQ

#include<bits/stdc++.h>
using namespace std;
struct node{
	int l,r,minn;
};
node t[4000005];
int a[500005],dp[500005],sum[500005];
void bt(int i,int l,int r){
	t[i].l=l,t[i].r=r,t[i].minn=0x3f3f3f3f;
	if(l==r) return;
	int mid=(l+r)/2;
	bt(2*i,l,mid),bt(2*i+1,mid+1,r);
}
void g(int i,int id,int k){
	if(t[i].l==id&&t[i].r==id){
		t[i].minn=k;
		return;
	}
	if(id<=t[2*i].r) g(2*i,id,k);
	else g(2*i+1,id,k);
	t[i].minn=min(t[2*i].minn,t[2*i+1].minn);
}
int f(int i,int l,int r){
	if(l<=t[i].l&&r>=t[i].r) return t[i].minn;
	int mid=(t[i].l+t[i].r)/2,ans=0x3f3f3f3f;
	if(l<=mid) ans=min(ans,f(2*i,l,r));
	if(r>=(mid+1)) ans=min(ans,f(2*i+1,l,r));
	return ans;
}
int main(){
	int n,m;
	scanf("%d%d",&n,&m);
	dp[0]=0,sum[0]=500000,a[0]=-1;
	for(int i=1;i<=n;i++){
		scanf("%d",&a[i]);
		if(a[i]==1) sum[i]=sum[i-1]+1;
		else sum[i]=sum[i-1]-1;
	}
	int minsum=0x3f3f3f3f,maxsum=0;
	for(int i=1;i<=n;i++){
		if(sum[i]<minsum) minsum=sum[i];
		if(sum[i]>maxsum) maxsum=sum[i];
	}
	bt(1,minsum,maxsum);
	for(int i=1;i<=n;i++){
		if(a[i]!=a[i-1]) dp[i]=dp[i-1]+1,g(1,sum[i],dp[i]);
		else dp[i]=dp[i-1],g(1,sum[i],dp[i]);
	}
	for(int i=1;i<=n;i++){
		dp[i]=min(dp[i],f(1,max(minsum,sum[i]-m),min(maxsum,sum[i]+m)));
		g(1,sum[i],dp[i]);
	}
	printf("%d\n",dp[n]);
	return 0;
}

谢谢QAQ

2025/7/24 17:04
加载中...