TLE怎么优化
查看原帖
TLE怎么优化
746930
NO_OI_NO_LIFE楼主2024/3/26 22:47
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;

inline int read(){
	int res=0;char ch=getchar();
	while(!isdigit(ch)&&ch!=EOF)
		ch=getchar();
	while(isdigit(ch)){
		res=(res<<1)+(res<<3)+(ch-'0');
		ch=getchar();	
	}
	return res;
}

int n,m,bl,curl,curr,tot,a[100005],cnt[100005],ans[100005];

struct query{
	int l,r,p;
	
}q[100005]; 

bool operator<(const query &a,const query &b){
	return a.l^b.l ? a.l<b.l : a.l/bl&1 ? a.r>b.r : a.r<b.r;
}

void Add(int k){
	if(++cnt[a[k]]==1) ++tot;
}

void Del(int k){
	if(--cnt[a[k]]==0) --tot;
}

int main(){
//	freopen("count.in","r",stdin);
//	freopen("count.out","w",stdout);
	n=read();m=read();bl=(int)sqrt(n);
	for(int i=1;i<=n;i++)
		a[i]=read();
	for(int i=1;i<=m;i++){
		q[i].l=read();
		q[i].r=read();
		q[i].p=i;
	}
	sort(q+1,q+m+1);
	curl=0;curr=-1;tot=0;
	for(int i=1;i<=m;i++){
		int L=q[i].l,R=q[i].r;
		while(curr<R) Add(++curr);
		while(curl>L) Add(--curl);
		while(curr>R) Del(curr--);
		while(curl<L) Del(curl++);
		ans[q[i].p]=tot;
	}
	for(int i=1;i<=m;i++)
		cout<<ans[i]<<endl;
	return 0;
}
2024/3/26 22:47
加载中...