P4396 [AHOI2013]作业


思路

因为每次a和b不相同
用莫队+分块或者莫队+树状数组即可维护
不过分块单点修改是O(1)的,更优
我用树状数组维护了一下,只能开O2通过

代码

#include 
#include 
#include 
#include 
using namespace std;
struct BIT{
    int tr[10000000],MAXW;
    int lowbit(int x){
        return x&(-x);
    }
    void add(int pos,int c){
        pos++;
        while(pos<=MAXW){
            tr[pos]+=c;
            pos+=lowbit(pos);
        }
    }
    int query(int pos){
        pos++;
        int ans=0;
        while(pos){
            ans+=tr[pos];
            pos-=lowbit(pos);
        }
        return ans;
    }
}times,nums;
int color[10000000],a[100100],n,m,L,R,sz,num,belong[100100],ans1[100100],ans2[100100];
struct Query{
    int l,r,a,b,id;
    bool operator < (const Query &b) const{
        return (belong[l]==belong[b.l])?rQ[i].l)
            moveL(-1);
        while(RQ[i].r)
            moveR(-1);
        ans1[Q[i].id]=times.query(Q[i].b)-times.query(Q[i].a-1);
        ans2[Q[i].id]=nums.query(Q[i].b)-nums.query(Q[i].a-1);
    }
    for(int i=1;i<=m;i++)
        printf("%d %d\n",ans1[i],ans2[i]);
    return 0;
}

相关