莫队是一种用于处理询问区间值的暴力离线算法,思路是通过移动两个指针到对应的区间来计算结果,精华是合理分块并依次处理。
离线,暴力,1e5
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; }