莫队算法学习记录
作者:互联网
什么是莫队:
莫队是一种用于处理询问区间值的暴力离线算法,思路是通过移动两个指针到对应的区间来计算结果,精华是合理分块并依次处理。
什么时候用莫队:
离线,暴力,1e5
原版莫队:
建立区间(x1/2):
ll size=sqrt(n),bnum=ceil((double)n/size); for(ll i = 1; i <= bnum; ++i) for(ll j = (i - 1) * size + 1; j <= i * size; ++j) belong[j] = i;
排序:
bool cmp(Query a,Query b) { return((belong[a.l]^belong[b.l])?belong[a.l]<belong[b.l]:((belong[a.l]&1)?a.r<b.r:a.r>b.r)); }
区间移动:
for(ll i=1;i<=q;i++) { ll ql=query[i].l,qr=query[i].r; while(l<ql) now -=(--num[a[l++]]) ; while(l>ql) now += num[a[--l]]++; while(r<qr) now += num[a[++r]]++; while(r>qr) now -= (--num[a[r--]]); ans1[query[i].id]=now; }
标签:记录,--,ll,belong,算法,区间,now,莫队 来源: https://www.cnblogs.com/Ultramarines/p/16520424.html