【bzoj2743】[HEOI2012]采花

树状数组

#include<algorithm>
#include<iostream>
#include<cstdlib>
#include<cstring>
#include<cstdio>
#include<cmath>
#include<queue>
using namespace std;
 
#define N 1000010
 
#define lowbit(x) (x & (-x))
 
int n,c,m;
 
int t[N],next[N],ans[N],p[N],a[N];
 
struct Node
{
       int l,r,id;
}q[N];
 
int cmp(Node a,Node b)
{
    return a.l<b.l;
}
 
void update(int x,int d)
{
     while (x<=n)
           t[x]+=d,x+=lowbit(x);
}
 
int ask(int x)
{
    int res(0);
    while (x>0)
          res+=t[x],x-=lowbit(x);
    return res;
}
 
int main()
{
    scanf("%d%d%d",&n,&c,&m);
    for (int i=1;i<=n;i++)
        scanf("%d",&a[i]);
    for (int i=n;i>0;i--)
        next[i]=p[a[i]],p[a[i]]=i;
    for (int i=1;i<=c;i++)
        if (next[p[i]])
           update(next[p[i]],1);
    for (int i=1;i<=m;i++)
        scanf("%d%d",&q[i].l,&q[i].r),q[i].id=i;
    sort(q+1,q+m+1,cmp);
    int l=1;
    for (int i=1;i<=m;i++)
    {
        while (l<q[i].l)
        {
              if (next[l])
                 update(next[l],-1);
              if (next[next[l]])
                 update(next[next[l]],1);
              l++;
        }        
        ans[q[i].id]=ask(q[i].r)-ask(q[i].l-1);  
    }
    for(int i=1;i<=m;i++)
        printf("%d\n",ans[i]);
    return 0;
}

  

posted @ 2016-03-25 21:02  Yangjiyuan  阅读(163)  评论(0编辑  收藏  举报