首页 > 其他分享 >莫队

莫队

时间:2023-08-10 20:34:59浏览次数:27  
标签:int qwe vl while 莫队 block

回滚莫队

++L一定要独立出来

inline void Q(){
    k=pow(n,0.66);
    for(int i=1;i<=max(n,m);++i)  block[i]=(i-1)/k+1;
    for(int i=1;i<=q;++i)  qwe[i]={read(),read(),read(),read(),i,0};
    sort(qwe+1,qwe+q+1,cmp);
    int L=1,R=0,las=0,_l;
    for(int i=1;i<=q;++i){
        if(block[qwe[i].l]==block[qwe[i].r]){
            for(int j=qwe[i].l;j<=qwe[i].r;++j){
                sum1[a[j]]+=b[j];
                if(a[j]>=qwe[i].vl&&a[j]<=qwe[i].vr)
                    qwe[i].A=max(qwe[i].A,sum1[a[j]]);
            }for(int j=qwe[i].l;j<=qwe[i].r;++j)  sum1[a[j]]-=b[j];
            continue;
        }if(block[qwe[i].l]!=las){
            int rr=min(block[qwe[i].l]*k,n);
            while(R>rr)  c[block[a[R]]]=d[block[a[R]]]=0,sum[a[R]]-=b[R],--R;
            while(L<rr+1)  c[block[a[L]]]=d[block[a[L]]]=0,sum[a[L]]-=b[L];++L;
            las=block[qwe[i].l];
        }while(R<qwe[i].r)  ++R,add(R,c);_l=L;
        while(_l>qwe[i].l)  --_l,add(_l,d);
        qwe[i].A=ask(qwe[i].vl,qwe[i].vr);
        while(_l<L)  d[block[a[_l]]]=c[block[a[_l]]],sum[a[_l]]-=b[_l],++_l;
    }sort(qwe+1,qwe+q+1,CMP);
    for(int i=1;i<=q;++i)  printf("%lld\n",qwe[i].A);
}

 

标签:int,qwe,vl,while,莫队,block
From: https://www.cnblogs.com/yswn/p/17621426.html

相关文章

  • [Ynoi2016] 这是我自己的发明(根号分治+分块/莫队)
    题目传送门soltion简单题换根显然可以拆成\(O(1)\)个区间,这里先不管。直接做法是莫队,把双子树拆成\(dfs\)序上的双前缀,可以直接莫队,但是常数比较大。另一种做法是根分,对颜色出现次数分治,大于的求出\(dfs\)序的前缀和即可,小于的因为一共只有\(O(n\sqrtn)\)个点对,所以......
  • 普通莫队
    普通莫队形式如果从\([l,r]\)的答案能够$O(1)$扩展到\([l+1,r][l-1,r][l,r+1][l,r-1]\)(即与\([l,r]\)相邻的区间)的答案,那么使用莫队算法可以在\(O(n\sqrtn)\)的复杂度内求出所有询问的答案。核心我们假设已经知道\([l,r]\)的答案,现在我们要求\([l',r']\),我们就可以移动左右指针......
  • 莫队学习
    大致思路:1.分块2.对提问排序3.暴力处理#莫队模板```cpp#include<bits/stdc++.h>usingnamespacestd;constintN=1e6+10,M=1e6+10;inta[N],belong[N],bnum,cnt[N];intn,q,len,ans[M];structnode{ intl,r,id;}e[M];boolcmp(nodea,nodeb){ return(belong[a.l]^belong[b......
  • 莫队
    简介用于解决一类离线区间询问问题。将其加以扩展,便能轻松处理树上路径询问以及支持修改操作。普通莫队算法概述对于序列上的区间询问问题,如果从\([l,r]\)答案能够\(O(1)\)扩展到\([l-1,r],[l+1,r],[l,r+1],[l,r-1]\)(即与\([l,r]\)相邻的区间)的答案,那么......
  • 莫队学习笔记
    这是一篇模仿算导的学习笔记/题解。例题:P1494给定一个长为\(n\)的数组\(a\)和\(m\)个询问(有序数对)\(b_i=(l_i,r_i)\),询问允许离线,对每个询问\((l,r)\)求出满足\(l\lei\ltj\ltr\wedgea_i=a_j\)的数对\((i,j)\)数量.证明:若数\(x\)在\(a\)数组下标为......
  • 莫队学习笔记
    引入问题给出一个长度为\(n\)的数组\(A\),接下来\(q\)次询问,每次询问求\([l,r]\)中有多少组\((i,j,k)\)使得\(a_i=a_j=a_k(i<j<k)\)。保证\(1\leqn\leq10^5,1\leqA_i\leqn(1\leqi\leqn)\)。莫队的基础思想——区间转移简单分析问题,貌似并没有可加性,所以分块和......
  • 莫队 学习笔记
    莫队学习笔记引入莫队算法是一种优美的暴力算法,可以用来处理大量的区间询问。前提是,维护的信息可以高效地插入、删除。我们就以一道题为例,来初探莫队:洛谷P3901数列找不同题意:给定一个数列,\(q\)次询问,问区间\([l,r]\)内的数是否各不相同。首先,我们很容易想到,问某个区间......
  • permu题解(树上莫队)(非正解)
    题目传送门题意给出一个长度为$n$的排列$P(P1,P2,...Pn)$,以及$m$个询问。每次询问某个区间$[l,r]$中,最长的值域连续段长度。思路首先这道题事求连续段的长度,打个莫队先#include<bits/stdc++.h>#defineintlonglongusingnamespacestd;namespaceTestify{ inlineint......
  • 【学习笔记】(2) 基础莫队——优美的暴力
    莫队,是莫涛发明的一种解决区间查询等问题的离线算法,基于分块思想,复杂度一般为\(\mathcal{O}(N\sqrt{N})\)普通莫队例题:P1972[SDOI2009]HH的项链(其实这道题用莫队过不了,就仅是用来引入莫队而已)题意:长度为\(N\)的序列,\(M\)次询问,每次询问一段闭区间内有多少个不同的数。......
  • 【BZOJ4241】【回滚莫队模板题】历史研究
    Description给定一个序列,每次询问区间[l,r][l,r]内,所有权值与其出现次数的乘积的最大值。Solution回滚莫队模板题。将询问以左端点所在块为第一关键字,右端点为第......