1 条题解

  • 0
    @ 2025-9-10 8:50:34

    C++ :

    #define MAXN 1000010UL
    
    #include <algorithm>
    #include <cstdio>
    #include <cmath>
    
    struct Query{
    	int id,l,r,a,b;
    	inline void in(int pid){id=pid,scanf("%d%d%d%d",&l,&r,&a,&b);return;}
    };
    
    Query p[MAXN];
    
    int n,m,L,R,tree[MAXN],blocks,c[MAXN],block[MAXN],Ans[MAXN],Ans2[MAXN],tree2[MAXN],ex[MAXN];
    
    inline bool comp(Query a,Query b){
    	return block[a.l]==block[b.l]?(a.r<b.r):(a.l<b.l);
    }
    
    inline int lowbit(int x){
    	return x&(-x);
    }
    
    inline void Update(int val,int add){
    	if(add==1){
    		ex[val]++;
    		if(ex[val]==1) for(int i=val;i<=n;i+=lowbit(i)) tree2[i]+=add;
    	}
    	else{
    		ex[val]--;
    		if(!ex[val]) for(int i=val;i<=n;i+=lowbit(i)) tree2[i]+=add;
    	}
    	for(int i=val;i<=n;i+=lowbit(i)) tree[i]+=add; 
    	return;
    }
    
    inline int Query(int val){
    	if(val<=0) return 0;
    	int ans=0;
    	for(int i=val;i>0;i-=lowbit(i)) ans+=tree[i];
    	return ans;
    }
    
    inline int Query2(int val){
    	if(val<=0) return 0;
    	int ans=0;
    	for(int i=val;i>0;i-=lowbit(i)) ans+=tree2[i];
    	return ans;
    }
    
    int main(){
    	scanf("%d%d",&n,&m);
    	for(int i=1;i<=n;i++) scanf("%d",&c[i]);
    	for(int i=1;i<=m;i++) p[i].in(i);
    	blocks=(int)sqrt(n+0.5);
    	for(int i=1;i<=n;i++) block[i]=(i-1)/blocks;
    	std::sort(p+1,p+m+1,comp);
    	L=p[1].l;R=p[1].r;
    	for(int i=L;i<=R;i++) Update(c[i],1);
    	if(p[1].b>=p[1].a) Ans[p[1].id]=Query(p[1].b)-Query(p[1].a-1),Ans2[p[1].id]=Query2(p[1].b)-Query2(p[1].a-1);
    	else Ans[p[1].id]=0,Ans2[p[1].id]=0;
    	for(int i=2;i<=m;i++){
    		while(R<p[i].r) R++,Update(c[R],1);
    		while(L>p[i].l) L--,Update(c[L],1);
    		while(R>p[i].r) Update(c[R],-1),R--;
    		while(L<p[i].l) Update(c[L],-1),L++;
    		if(p[i].b>=p[i].a) Ans[p[i].id]=Query(p[i].b)-Query(p[i].a-1),Ans2[p[i].id]=Query2(p[i].b)-Query2(p[i].a-1);
    		else Ans[p[i].id]=0,Ans2[p[i].id]=0;
    	}
    	for(int i=1;i<=m;i++) printf("%d %d\n",Ans[i],Ans2[i]);
    	return 0;
    }
    
    • 1

    信息

    ID
    3333
    时间
    40000ms
    内存
    128MiB
    难度
    (无)
    标签
    递交数
    0
    已通过
    0
    上传者