样例过了但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