这份代码我本地自测是对的,时间也没有问题,但是交上去之后全超时了,有没有大佬能帮忙看一下,谢谢。
#include<iostream>
#include<cstdio>
#include<cmath>
#include<ctime>
#include<algorithm>
using namespace std;
int n,m,k,block,Block[50010],num[50010],cnt[50010];
long long ans[50010],tot,len[50010],c[50010];
struct Node{
int l,r,id;
}query[50010];
bool operator <(const Node &x,const Node &y){
if(Block[x.l]==Block[y.l]) return x.r<y.r;
else return x.l<y.l;
}
int add_pos(int pos){
tot+=cnt[num[pos]];
cnt[num[pos]]++;
}
long long _gcd(long long x,long long y){
while(y){
long long z=x%y;
x=y;
y=z;
}
return x;
}
int remove_pos(int pos){
cnt[num[pos]]--;
tot-=cnt[num[pos]];
}
void solve(long long x,long long y){
long long gcd=_gcd(x,y);
printf("%lld/%lld\n",x/gcd,y/gcd);
}
int main(){
scanf("%d %d",&n,&m);
block=round(sqrt(n));
for(int i=1;i<=n;i++){
scanf("%d",&num[i]);
Block[i]=i/block;
}
for(int i=1;i<=m;i++){
scanf("%d %d",&query[i].l,&query[i].r);
query[i].id=i;
len[i]=query[i].r-query[i].l+1;
c[i]=len[i]*(len[i]-1)/2;
}
sort(query+1,query+1+m);
int prel=1,prer=0;
for(int i=1;i<=m;i++){
if(len[query[i].id]!=1){
while(prer<query[i].r) add_pos(++prer);
while(prel>query[i].l) add_pos(--prel);
while(prer>query[i].r) remove_pos(prer--);
while(prel<query[i].l) remove_pos(prel++);
ans[query[i].id]=tot;
}
}
for(int i=1;i<=m;i++){
if(len[i]==1 || ans[i]==0) printf("0/1\n");
else if(ans[i]==c[i]) printf("1/1\n");
else{
solve(ans[i],c[i]);
}
}
return 0;
}