CSU 1515 Sequence

莫队算法+map

#include<cstdio>
#include<cstring>
#include<cmath>
#include<map>
#include<algorithm>
using namespace std;

const int maxn=200000+10;
int n,t,a[maxn],cnt[maxn*10],pos[maxn];
struct X
{
    int l,r,id;
} s[maxn];
int L,R;
int Ans,f[maxn];

bool cmp(const X&a,const X&b)
{
    if(pos[a.l]==pos[b.l]) return a.r<b.r;
    return pos[a.l]<pos[b.l];
}

int main()
{
    while(~scanf("%d",&n))
    {
        scanf("%d",&t);
        int sz=sqrt(n);
        for(int i=1; i<=n; i++)
        {
            scanf("%d",&a[i]);
            pos[i]=i/sz;
        }
        for(int i=1; i<=t; i++)
        {
            scanf("%d%d",&s[i].l,&s[i].r);
            s[i].id=i;
        }

        sort(s+1,s+1+t,cmp);

        map<int,int>m;
        Ans=0;
        for(int i=s[1].l; i<=s[1].r; i++)
        {
            Ans=Ans+m[a[i]-1]+m[a[i]+1];
            m[a[i]]++;
        }

        f[s[1].id]=Ans;
        L=s[1].l;
        R=s[1].r;

        for(int i=2; i<=t; i++)
        {
            while(L<s[i].l)
            {
                Ans=Ans-m[a[L]-1]-m[a[L]+1];
                m[a[L]]--;
                L++;
            }

            while(L>s[i].l)
            {
                L--;
                Ans=Ans+m[a[L]-1]+m[a[L]+1];
                m[a[L]]++;
            }

            while(R>s[i].r)
            {
                Ans=Ans-m[a[R]-1]-m[a[R]+1];
                m[a[R]]--;
                R--;
            }

            while(R<s[i].r)
            {
                R++;
                Ans=Ans+m[a[R]-1]+m[a[R]+1];
                m[a[R]]++;
            }

            f[s[i].id]=Ans;
        }

        for(int i=1; i<=t; i++)
            printf("%d\n",f[i]);
    }

    return 0;
}

 

posted @ 2016-04-18 09:22  Fighting_Heart  阅读(137)  评论(0编辑  收藏  举报