SPOJ-ZQUERY-分块求区间内和为0的最大长度

题目大意:给定一段只包含-1,1的序列,每次询问区间内满足区间和为0的最长子区间长度;

题目解析:分块真的是个很神奇的东西。朴素做法是每次询问搞出前缀和,然后二分,复杂度为M*N*logn,考虑分块的做法,其实就是预处理出每个块的答案,然后询问的时候只需要考虑不在最大块里面的元素即可,总时间复杂度降为M*N^0.5*logn;

AC代码:

#include
using namespace std;
const int maxn = 5e4+10;
const int maxm = 1e3;
const int del= 5e4+10;
int ans[maxm][maxm];
vectorsum[maxn<<1];
int  n,m;
int a[maxn];
int vis[maxn<<1];
int main()
{
    while(scanf("%d%d",&n,&m)!=EOF)
    {
        for(int i=0;i


你可能感兴趣的:(分块)