求助大佬,莫队算法
查看原帖
求助大佬,莫队算法
691247
liu006楼主2023/9/2 09:53

本来代码是这样的:

#include<iostream>
#include<cstdio>
#include<cmath>
#include<algorithm>
using namespace std;
int n,a[50005],m,size,cnt[50005],ans[50005],k;
struct node{
	int p;
	int id;
	int l,r;
}q[50005];
bool cmp(node a,node b){
	if(a.p==b.p){
		if(a.id&1) return a.r<b.r;
		else return a.r>b.r;
	}else return a.p<b.p;
}
int main(){
	scanf("%d%d%d",&n,&m,&k);
	for(int i=1;i<=n;i++){
		scanf("%d",&a[i]);
	}
	size=sqrt(n);
	for(int i=1;i<=m;i++){
		scanf("%d%d",&q[i].l,&q[i].r);
		q[i].p=(q[i].l-1)%size+1;
		q[i].id=i;
	}
	int l=1,r=0,sum=0;
	sort(q+1,q+m+1,cmp);
	for(int i=1;i<=m;i++){
		while(q[i].l<l){l--;cnt[a[l]]++;sum+=2*cnt[a[l]]-1;}
		while(q[i].r>r){r++;cnt[a[r]]++;sum+=2*cnt[a[r]]-1;}
		while(q[i].l>l){cnt[a[l]]--;sum-=2*cnt[a[l]]+1;l++;}
		while(q[i].r<r){cnt[a[r]]--;sum-=2*cnt[a[r]]+1;r--;}
		ans[q[i].id]=sum;
	}
	for(int i=1;i<=m;i++) printf("%d\n",ans[i]);
	return 0;
}

全TLE

但吸氧后:AC,但600多ms

然后发现有个符号写错了(/错写为%)

#include<iostream>
#include<cstdio>
#include<cmath>
#include<algorithm>
using namespace std;
int n,a[50005],m,size,cnt[50005],ans[50005],k;
struct node{
	int p;
	int id;
	int l,r;
}q[50005];
bool cmp(node a,node b){
	if(a.p==b.p){
		if(a.id&1) return a.r<b.r;
		else return a.r>b.r;
	}else return a.p<b.p;
}
int main(){
	scanf("%d%d%d",&n,&m,&k);
	for(int i=1;i<=n;i++){
		scanf("%d",&a[i]);
	}
	size=sqrt(n);
	for(int i=1;i<=m;i++){
		scanf("%d%d",&q[i].l,&q[i].r);
		q[i].p=(q[i].l-1)/size+1;
		q[i].id=i;
	}
	int l=1,r=0,sum=0;
	sort(q+1,q+m+1,cmp);
	for(int i=1;i<=m;i++){
		while(q[i].l<l){l--;cnt[a[l]]++;sum+=2*cnt[a[l]]-1;}
		while(q[i].r>r){r++;cnt[a[r]]++;sum+=2*cnt[a[r]]-1;}
		while(q[i].l>l){cnt[a[l]]--;sum-=2*cnt[a[l]]+1;l++;}
		while(q[i].r<r){cnt[a[r]]--;sum-=2*cnt[a[r]]+1;r--;}
		ans[q[i].id]=sum;
	}
	for(int i=1;i<=m;i++) printf("%d\n",ans[i]);
	return 0;
}

不用O2就AC

有大佬知道为什么莫队算法符号写错不会WA但会TLE? Orz

2023/9/2 09:53
加载中...