zoukankan      html  css  js  c++  java
  • P2709 小B的询问(莫队)

    https://www.luogu.org/problem/show?pid=2709#sub

    莫队经典题

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    #include<cmath>
    using namespace std;
    int n,m,k,sum=0;
    int num[50009],a[50009],ans[50009];
    struct H{
        int qv,id,l,r;
    }Q[50009];
    int my_comp(const H&a,const H&b)
    {
        if(a.qv!=b.qv)
         return a.qv<b.qv?1:0;
        return a.r<b.r?1:0;
    }
    void del(int x)
    {
        num[x]--;
        if(x<=k&&x>=1)
        sum=sum-(num[x]+1)*(num[x]+1)+(num[x])*(num[x]);
    }
    void add(int x)
    {
        num[x]++;
        if(x<=k&&x>=1)
        sum=sum-(num[x]-1)*(num[x]-1)+(num[x])*(num[x]);
    }
    int main()
    {
        scanf("%d%d%d",&n,&m,&k);
        int limit=(int)(sqrt((double)(n)+0.5));
        for(int i=1;i<=n;i++)
          scanf("%d",&a[i]);
        for(int i=1;i<=m;i++)
        {
            scanf("%d%d",&Q[i].l,&Q[i].r);
            Q[i].id=i,Q[i].qv=Q[i].l/limit;
        } 
    
        sort(Q+1,Q+m+1,my_comp);
    
        int l=0,r=0;
        for(int i=1;i<=m;i++)
        {
            while(r>Q[i].r){
                r--;
                del(a[r+1]);
            }
            while(r<Q[i].r){
                r++;
                add(a[r]);
            }
            while(l<Q[i].l){
                l++;
                del(a[l-1]);
            }
            while(l>Q[i].l){
                l--;
                add(a[l]);
            }
    
            ans[Q[i].id]=sum;
        }
    
        for(int i=1;i<=m;i++)
         printf("%d
    ",ans[i]);
        return 0;
    } 
  • 相关阅读:
    将Infopath转成PDF
    调用MOSS API取document时出现out of memeory错误
    jquery dialog中mvc客户端验证无效
    Windows Service开发点滴20130622
    CentOS
    nginx
    VIM
    nodejs weixin 笔记
    nodejs mysql
    nodejs 笔记
  • 原文地址:https://www.cnblogs.com/dfsac/p/6819737.html
Copyright © 2011-2022 走看看