莫队TLE求调
查看原帖
莫队TLE求调
688892
Fiendish楼主2024/7/26 12:33

RT,但是没写离散化(所以不知道咋T了

#include<iostream>
#include<algorithm>
#include<cmath>
#define gc getchar
using namespace std;
int n,Q,block;
struct node{
	int id,l,r;
}q[1000010];
int a[1000010],ans[1000010],t[1000010],nans;
template<typename T>
inline void read(T& a){a=0;int f=1;char ch=gc();while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=gc();}while(ch>='0'&&ch<='9')a=(a<<1)+(a<<3)+(ch^48),ch=gc();a*=f;}
int cmp(node n1,node n2){
	if(n1.id/block==n2.id/block){
		if((n1.id/block)&1) return n1.r<n2.r;
		else return n1.r>n2.r;
	}
	return n1.id/block<n2.id/block;
}
void add(int x){
	t[a[x]]++;
	if(t[a[x]]==3) nans--;
	if(t[a[x]]==2) nans++;
}
void del(int x){
	t[a[x]]--;
	if(t[a[x]]==1) nans--;
	if(t[a[x]]==2) nans++;
}
int main(){
	read(n),read(Q);
	block=sqrt(n);
	for(int i=1;i<=n;i++) read(a[i]);
	for(int i=1;i<=Q;i++){
		read(q[i].l),read(q[i].r);
		q[i].id=i;
	}
	sort(q+1,q+Q+1,cmp);
	int l=1,r=0;
	for(int i=1;i<=Q;i++){
		if(q[i].l==q[i].r){
			ans[q[i].id]=0;
			continue;
		}
		ans[q[i].id]=ans[q[i].id-1];
		while(l>q[i].l) add(--l);
		while(l<q[i].l) del(l++);
		while(r>q[i].r) del(r--);
		while(r<q[i].r) add(++r);
		ans[q[i].id]=nans;
	}
	for(int i=1;i<=Q;i++) printf("%d\n",ans[i]);
}
2024/7/26 12:33
加载中...