• P2709 小B的询问-莫队


    • 思路 :依旧是 分块 块内按照 r 排序 不同块按照 L排序,处理好增加 删除对结果的影响即可。
    #include<bits/stdc++.h>
    using namespace std;
    #define maxn 56789
    int n,m,l,r,B,sum,len,k,col[maxn],cnt[maxn],ans[maxn];
    struct node
    {
        int l,r,id;
        bool operator <(const node &b)const
        {
            return b.l/B==l/B?r<b.r:l<b.l;
        }
    } a[maxn];
    void add(int x)
    {
        if(x<1||x>k)return;
        cnt[x]++;
        sum+=(cnt[x]*cnt[x])-((cnt[x]-1)*(cnt[x]-1));
    }
    void del(int x)
    {
        if(x<1||x>k)return;
        cnt[x]--;
        sum-=((cnt[x]+1)*(cnt[x]+1))-((cnt[x])*(cnt[x]));
    }
    int main()
    {
        r=sum=len=0;
        scanf("%d%d%d",&n,&m,&k);
        for(int i=1; i<=n; i++)
            scanf("%d",&col[i]);
        for(int i=0; i<m; i++)
        {
            scanf("%d%d",&a[i].l,&a[i].r);
            a[i].id=i;
        }
        B=n/sqrt(m);
        sort(a,a+m);
        l=1;
        for(int i=0; i<m; i++)
        {
            while(l<a[i].l)
                del(col[l++]);
            while(r<a[i].r)
                add(col[++r]);
            while(l>a[i].l)
                add(col[--l]);
            while(r>a[i].r)
                del(col[r--]);
            ans[a[i].id]=sum;
        }
        for(int i=0; i<m; i++)
            printf("%d
    ",ans[i]);
        return 0;
    }
    

      

  • 相关阅读:

    bzoj3052: [wc2013]糖果公园
    莫队算法心得
    bzoj1104: [POI2007]洪水pow
    bzoj1102: [POI2007]山峰和山谷Grz
    bzoj1121: [POI2008]激光发射器SZK
    bzoj1113: [Poi2008]海报PLA
    bzoj1103: [POI2007]大都市meg
    bzoj1396: 识别子串
    bzoj3756: Pty的字符串
  • 原文地址:https://www.cnblogs.com/SDUTNING/p/10245287.html
Copyright © 2020-2023  润新知