1 条题解

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

    C++ :

    #define MAXN 100010UL
    
    #include <cstdio>
    #include <cmath>
    #include <algorithm>
    
    struct Query{
    	int l,r,id;
    	inline void in(int pid){scanf("%d%d",&l,&r);id=pid;return;}
    };
    
    Query p[MAXN];
    
    int Ans[MAXN],c[MAXN],n,m,e,blocks,block[MAXN],Ans_now,ex[MAXN],L,R;
    
    inline bool comp(Query a,Query b){
    	return block[a.l]==block[b.l]?(a.r<b.r):(a.l<b.l);
    }
    
    inline void Update(int k,int add){
    	k=c[k];
    	if(add==1){
    		if(ex[k]==1) Ans_now++;
    		ex[k]++;
    	}
    	else{
    		if(ex[k]==2) Ans_now--;
    		ex[k]--;
    	}
    	return;
    }
    
    int main(){
    	scanf("%d%d%d",&n,&e,&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(i,1);
    	Ans[p[1].id]=Ans_now;
    	for(int i=2;i<=m;i++){
    		while(R<p[i].r) R++,Update(R,1);
    		while(L>p[i].l) L--,Update(L,1);
    		while(R>p[i].r) Update(R,-1),R--;
    		while(L<p[i].l) Update(L,-1),L++;
    		Ans[p[i].id]=Ans_now;
    	}
    	for(int i=1;i<=m;i++) printf("%d\n",Ans[i]);
    	return 0;
    }
    
    • 1

    信息

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