BZOJ3236做業

這東西是個應用爲O(logn)的莫隊。c++

正常莫隊的updata函數轉移是O(1)的,可這個題時間很是寬泛,能夠套兩個樹狀數組,那兩個東西很好維護,第一個直接普通權值樹狀數組維護,第二個開一個桶,記錄當前區間內某個數的出現次數,當從0->1時,第二個樹狀數組+權,1->0時,第二個樹狀數組-權,別的狀況不用管,這樣就能夠用莫隊輕鬆搞掉了。數組

#include<bits/stdc++.h>
#define lowbit(x) (x&(-x))
using namespace std;
int read(){
    int sum=0,f=1;char x=getchar();
    while(x<'0'||x>'9'){
        if(x=='-') f=-1;
        x=getchar();
    }while(x>='0'&&x<='9'){
        sum=sum*10+x-'0';
        x=getchar();
    }return sum*f;
}
struct MoCap{
    int l,r,id,a,b;
}q[1000500];
int n,m,part,L,R,ans1[1000500],ans2[1000500];
int bl[100500],col[100500],t1[100500],t2[100500],cnt[100500];
bool cmp(MoCap a,MoCap b){
    return bl[a.l]==bl[b.l]?a.r<b.r:a.l<b.l;
}
void add1(int pos,int val){
    for(int i=pos;i<=n;i+=lowbit(i))
        t1[i]+=val;
}
int ask1(int pos){
    int ans=0;
    for(int i=pos;i>=1;i-=lowbit(i))
        ans+=t1[i];
    return ans;
}
void add2(int pos,int val){
    for(int i=pos;i<=n;i+=lowbit(i))
        t2[i]+=val;
}
int ask2(int pos){
    int ans=0;
    for(int i=pos;i>=1;i-=lowbit(i))
        ans+=t2[i];
    return ans;
}
void updata(int i,int val){
    if(cnt[col[i]]==1&&val==-1){
        add2(col[i],val);
    }
    if(cnt[col[i]]==0&&val==1){
        add2(col[i],val);
    }
    add1(col[i],val);
    cnt[col[i]]+=val;
//    qaq1=ask1(R)-ask1(L-1);
//    qaq2=ask2(R)-ask2(L-1);
}
int main(){
    n=read();m=read();part=sqrt(n);
    for(int i=1;i<=n;i++){
        col[i]=read();
        bl[i]=i/part+1;
    }
    for(int i=1;i<=m;i++){
        q[i].l=read();
        q[i].r=read();
        q[i].a=read();
        q[i].b=read();
        q[i].id=i;
    }sort(q+1,q+1+m,cmp);
    int l=1,r=0;
    for(int i=1;i<=m;i++){
        L=q[i].a;R=q[i].b;
        while(l<q[i].l) updata(l++,-1);
        while(l>q[i].l) updata(--l,+1);
        while(r<q[i].r) updata(++r,+1);
        while(r>q[i].r) updata(r--,-1);
        ans1[q[i].id]=ask1(R)-ask1(L-1);
        ans2[q[i].id]=ask2(R)-ask2(L-1);
    }
    for(int i=1;i<=m;i++)
        printf("%d %d\n",ans1[i],ans2[i]);
    return 0;
}
View Code
相關文章
相關標籤/搜索