好耶,调半天还是TLE最后3个点,求助嘤嘤嘤
查看原帖
好耶,调半天还是TLE最后3个点,求助嘤嘤嘤
275989
LingHusama楼主2023/8/27 21:12

我也不知道怎么优化了捏 求大佬帮帮捏

#include<bits/stdc++.h>
#define int long long
using namespace std;
int num[100005];
struct node{
	int le;
	int ri;
	int id;
}line[100005];
int ans1[100005];
int ans2[100005];
int buc[100005];
int n;
int fk(int N,int pos){
	int sq=floor(1.0*sqrt(N));
	return floor(1.0*pos/sq)+1;
}
bool cmp(node x,node y){
	int fk1=fk(n,x.ri);
	int fk2=fk(n,y.ri);
	if(fk1!=fk2)return fk1<fk2;
	else return x.le<y.le;
}
int l,r;
long long present=0;
void movenxtr(int now,int to){
	while(r+1<=to){
		r++;
		present-=buc[num[r]]*buc[num[r]]-buc[num[r]];
		buc[num[r]]++;
		present+=buc[num[r]]*buc[num[r]]-buc[num[r]];
	}
}
void movefrontr(int now,int to){
	while(r-1>=to){
		present-=buc[num[r]]*buc[num[r]]-buc[num[r]];
		buc[num[r]]--;
		present+=buc[num[r]]*buc[num[r]]-buc[num[r]];
		r--;
	}
}

void movenxtl(int now,int to){
	while(l+1<=to){
		
		present-=buc[num[l]]*buc[num[l]]-buc[num[l]];
		buc[num[l]]--;
		present+=buc[num[l]]*buc[num[l]]-buc[num[l]];
		l++;
	}
}
void movefrontl(int now,int to){
	while(l-1>=to){
		l--;
		present-=buc[num[l]]*buc[num[l]]-buc[num[l]];
		buc[num[l]]++;
		present+=buc[num[l]]*buc[num[l]]-buc[num[l]];
		
	}
}
inline int read()
{
    int x=0,f=1;
    char ch=getchar();
    while(ch<'0'||ch>'9')
    {
        if(ch=='-')
            f=-1;
        ch=getchar();
    }
    while(ch>='0' && ch<='9')
        x=x*10+ch-'0',ch=getchar();
    return x*f;
}

void write(int x)
{
    if(x<0)
        putchar('-'),x=-x;
    if(x>9)
        write(x/10);
    putchar(x%10+'0');
    return;
}
int gcd(int a,int b){
	if(b==0){
		return a;
	}
	else return gcd(b,a%b);
}
signed main(){
	int n,m;
	n=read();
	m=read();
	for(int i=1;i<=n;i++){
		num[i]=read();
	}
	for(int i=1;i<=m;i++){
		line[i].le=read();
		line[i].ri=read();
		line[i].id=i;
	}
	sort(line+1,line+1+m,cmp);
	l=line[1].ri;
	r=line[1].ri;
	buc[num[line[1].ri]]++;
	for(int i=1;i<=m;i++){
		int left=line[i].le;
		int right=line[i].ri;
		int id=line[i].id;
		movenxtl(l,left);
		movenxtr(r,right);
		movefrontl(l,left);
		movefrontr(r,right);
		int fm=(right-left+1)*(right-left);
		int fz=present;
		if(fz!=0){
			int gc=gcd(fz,fm);
			ans1[id]=fz/gc;
			ans2[id]=fm/gc;
		}
		else{
			ans1[id]=0;
			ans2[id]=1;
		}
		
		
	}
	for(int i=1;i<=m;i++){
		write(ans1[i]);
		putchar('/');
		write(ans2[i]);
		puts("");
	}
	
}

2023/8/27 21:12
加载中...