莫队+unordered_map+O2 TLE求助
查看原帖
莫队+unordered_map+O2 TLE求助
505954
huangruiheng0217楼主2023/3/2 21:35

rt 吸了氧最后两个点还是超时

但是我不想用离散化

有希望卡过去吗

#include<bits/stdc++.h>
using namespace std;
int fr(){
	int x=0;char ch=getchar();
	while(ch<'0'||ch>'9')ch=getchar();
	while(ch>='0'&&ch<='9')x=x*10+ch-48,ch=getchar();
	return x;
}
int n,m,mod,cur,a[500005],fk[500005];
unordered_map<int,int> np;
struct Query{
	int dx,dxl,dy,id,ans;
}q[500005];
bool cmp1(Query a,Query b){
	if(a.dxl!=b.dxl)return a.dxl<b.dxl;
	if(a.dxl&1)return a.dy<b.dy;
	return a.dy>b.dy;
}
bool cmp2(Query a,Query b){
	return a.id<b.id;
}
void add(int p){
	np[a[p]]++;
	if(np[a[p]]==2)cur++;
	if(np[a[p]]==3)cur--;
}
void del(int p){
	np[a[p]]--;
	if(np[a[p]]==2)cur++;
	if(np[a[p]]==1)cur--;
}
int main(){
	n=fr(),m=fr();
	mod=sqrt(n);
	for(int i=1;i<=n;i++){
		fk[i]=(i-1)/mod;
		a[i]=fr();
	}
	for(int i=1;i<=m;i++){
		q[i].dx=fr(),q[i].dy=fr();
		q[i].id=i,q[i].dxl=fk[q[i].dx];
	}
	sort(q+1,q+m+1,cmp1);
	int l=1,r=0;
	for(int i=1;i<=m;i++){
		while(q[i].dx<l)add(--l);
		while(q[i].dx>l)del(l++);
		while(q[i].dy<r)del(r--);
		while(q[i].dy>r)add(++r);
		q[i].ans=cur;
	}
	sort(q+1,q+m+1,cmp2);
	for(int i=1;i<=m;i++)
		printf("%d\n",q[i].ans);
	return 0;
}
2023/3/2 21:35
加载中...