【BZOJ】2743: [HEOI2012]采花(树状数组)

题目

传送门:QWQ

分析

已经凉凉。看错数据范围敲了发莫队........

和HH的项链差不多,把每种颜色之前的颜色到再之前的颜色这段区间 区间加。

区间加就树状数组特技

代码

#include <bits/stdc++.h>
const int maxn=2e6+10;
using namespace std;
struct data{
    int num,l,r;
}Q[maxn]; 
int c[maxn],ans[maxn],pre[maxn],front[maxn],bit[maxn];
int n,m,o;
bool cmp(data a,data b){
    return a.r<b.r;
}
void add(int x,int a){if(!x)return; for(;x<=n;x+=x&-x) bit[x]+=a; }
int sum(int x){int ans=0; for(;x>0;x-=x&-x) ans+=bit[x]; return ans;}
int main(){
     scanf("%d%d%d",&n,&o,&m);
    for(int i=1;i<=n;i++) scanf("%d",&c[i]);
    for(int i=1;i<=m;i++){
        scanf("%d%d",&Q[i].l,&Q[i].r);
        Q[i].num=i;
    }
    sort(Q+1,Q+1+m,cmp);
    int now=1;
    for(int i=1;i<=m;i++){
        pre[i]=front[c[i]]; front[c[i]]=i;
        add(pre[pre[i]],-1); add(pre[i],1);
        while(Q[now].r==i) ans[Q[now].num]=sum(i)-sum(Q[now].l-1),now++;
    }
    for(int i=1;i<=m;i++){
        printf("%d
",ans[i]);
    }
    return 0;
}
原文地址:https://www.cnblogs.com/noblex/p/9126297.html