0pts TLE,悬关求助
查看原帖
0pts TLE,悬关求助
793612
Miku_QwQ楼主2024/7/27 14:26

这份代码我本地自测是对的,时间也没有问题,但是交上去之后全超时了,有没有大佬能帮忙看一下,谢谢。

#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;
}
2024/7/27 14:26
加载中...