分块写法,写了一个长这样的询问:
int query(int x,int y){
int X=bar[x],Y=bar[y],ret=0,w[M]={};
if(X+1>=Y){
int now=0;
for(int i=x;i<=y;i++)if(D(i))ret=max(ret,now),now=0;else now++;
return max(ret,now);
}
r[0]=r[X];l[0]=l[Y];
r[X]=min(r[X],ed[X]-x+1);if(x==st[X]&&one[X]==0)w[X]=len(X);
l[Y]=min(l[Y],y-st[Y]+1);
printf("%d %d\n",l[Y],one[Y]);
for(int i=X+1;i<=Y-1;i++)
if(one[i]!=0){
if(one[i-1]!=0)ret=max(ret,l[i]+r[i-1]);
else ret=max(ret,l[i]+w[i-1]);
}else{
if(one[i-1]!=0)ret=max(ret,w[i]=len(i)+r[i-1]);
else ret=max(ret,w[i]=len(i)+w[i-1]);
}
ret=max(ret,l[Y]+r[Y-1]);
r[X]=r[0];l[Y]=l[0];
return ret;
}
思路是遇到全 0 块借助 w 数组 进行更新,请问这样的做法是否正确?
完整代码在这里