本来代码是这样的:
#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;
}
但吸氧后: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;
}
有大佬知道为什么莫队算法符号写错不会WA但会TLE? Orz