普通莫队TLE求助
查看原帖
普通莫队TLE求助
680022
Rice_Demon_King楼主2025/6/26 15:55

开了O2,用了快读快写,和奇偶化排序

#include<bits/stdc++.h>
#define For(i,j,k) for(register int i=j;i<=k;i++)
#define dFor(i,j,k) for(register int i=j;i>=k;i--)
using namespace std;
#define size SiZe
int n,m,a[30010],ANS,cnt[1000010];
int size,block[30010];
int L=1,R,ans[200010];
struct Node{
	int l,r,a,b,id;
	bool operator<(const Node &node){
		if(block[l]!=block[node.l]) return l<node.l;
		else if(block[l]&1) return r<node.r;
		else return r>node.r;
	}
}q[200010];
inline int read(){
    int k=0;
    char c=getchar();
    while(c<'0'||c>'9') c=getchar();
    while(c>='0'&&c<='9')k=k*10+c-'0',c=getchar();
    return k;
}
inline void write(int x){
    if(x<10) putchar(x+'0');
    else write(x/10),putchar(x%10+'0');
}
signed main(){
    n=read();
    For(i,1,n) a[i]=read();
    m=read();
    For(i,1,m) q[i].l=read(),q[i].r=read(),q[i].id=i;
    sort(q+1,q+m+1);
    size=n/sqrt(m);
    For(i,1,n) block[i]=(i-1)/size+1;
    For(i,1,m){
    	while(L>q[i].l) ANS+=!cnt[a[--L]]++;
    	while(R<q[i].r) ANS+=!cnt[a[++R]]++;
    	while(L<q[i].l) ANS-=!--cnt[a[L++]];
    	while(R>q[i].r) ANS-=!--cnt[a[R--]];
    	ans[q[i].id]=ANS;
	}
	For(i,1,m) write(ans[i]),putchar('\n');
	return 0;
}

2025/6/26 15:55
加载中...