求问分块询问
查看原帖
求问分块询问
1010254
Myano楼主2023/6/10 17:44

分块写法,写了一个长这样的询问:

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;
}
  • D(i)D(i) 表示第 ii 位是 00 还是 11。
  • oneione_i 表示第 ii 个块中 11 的个数。
  • lil_i 表示第 ii 个块从左侧开始的连续 00 的个数。
  • rir_i 表示第 ii 个块从右侧开始的连续 00 的个数。

思路是遇到全 00 块借助 ww 数组 进行更新,请问这样的做法是否正确?

完整代码在这里

2023/6/10 17:44
加载中...