wa自动机 的 莫队 刷题记录

洛谷P2709小B的询问

  • 莫队裸题,模板题
  • 莫队就是把询问区间排个序,先按左端点的Pos排序(POS是分块那个数组),pos一样的按右端点排序
  • 代码:
     1 #include <bits/stdc++.h>
     2 #define nmax 50010
     3 
     4 using namespace std;
     5 int a[nmax],ta[nmax],cnt[nmax]={0};
     6 int n,m,qn,k;
     7 struct que{
     8     int l,r,p,id;
     9     bool operator < (const que& x) const{ return (x.p==p)?(x.r>r):(x.p>p); }
    10 }q[nmax];
    11 
    12 int main(){
    13     scanf("%d%d%d",&n,&qn,&k);
    14     m=sqrt(n);
    15     for (int i=1; i<=n; i++) scanf("%d",&a[i]);
    16     for (int i=1; i<=qn; i++) {
    17         scanf("%d%d",&q[i].l,&q[i].r);
    18         q[i].p=(q[i].l-1)/m;
    19         q[i].id=i;
    20     }
    21     sort(q+1,q+qn+1);
    22     int l=q[1].l,r=q[1].l-1,ans=0;
    23     for (int i=1; i<=qn; i++) {
    24         while(l>q[i].l) l--,ans+=(2*cnt[a[l]]+1),cnt[a[l]]++;
    25         while(r<q[i].r) r++,ans+=(2*cnt[a[r]]+1),cnt[a[r]]++;
    26         while(l<q[i].l) ans-=(2*cnt[a[l]]-1),cnt[a[l]]--,l++;
    27         while(r>q[i].r) ans-=(2*cnt[a[r]]-1),cnt[a[r]]--,r--;
    28         ta[q[i].id]=ans;
    29     }
    30     for (int i=1; i<=qn; i++) printf("%d\n",ta[i]);
    31     return 0;
    32 }
    ヽ✿゜▽゜)ノ

猜你喜欢

转载自www.cnblogs.com/jiecaoer/p/11332677.html