TLE 求助!
查看原帖
TLE 求助!
751073
wuxiyi楼主2023/7/16 21:25

record

#include<cstdio>
#include<algorithm>
#include<cmath>
using namespace std;

int n,m,block;
struct ask{
	int l,r,id;
}asks[57257];
int id[57257];
bool cmp(ask x,ask y){
    if (id[x.l]==id[y.l]){
        if (id[x.l]&1)	return x.r<y.r;
        else	return x.r>y.r;    
    }
    else	return id[x.l]<id[y.l];
}

int c[57257],cnt[57257];

int ansx[57257],ansy[57257];
int nowx,nowy;

int gcd(int a,int b){
	return b?gcd(b,a%b):a;
}

void update(int x,int d){
	cnt[x]+=d;
	if (d==1&&cnt[x]>1){
		nowx+=2*cnt[x]-2;
	}if (d==-1&&cnt[x]>0){
		nowx-=cnt[x]*2;
	}
}

int main(){
	scanf("%d%d",&n,&m);
	block=sqrt(n);
	for (int i=1;i<=n;i++)	scanf("%d",&c[i]),id[i]=(i-1)*block+1;
	for (int i=1;i<=m;i++){
		scanf("%d%d",&asks[i].l,&asks[i].r);
		asks[i].id=i;
	}
	
	sort(asks+1,asks+m+1,cmp);
	
	for (int i=asks[1].l;i<=asks[1].r;i++)	update(c[i],1);
	nowy=(asks[1].r-asks[1].l+1)*(asks[1].r-asks[1].l);
	ansx[asks[1].id]=nowx/gcd(nowx,nowy); 
	ansy[asks[1].id]=nowy/gcd(nowx,nowy);
	int l=asks[1].l,r=asks[1].r;
	
	for (int i=2;i<=m;i++){
		while (l<asks[i].l)	update(c[l++],-1);
		while (l>asks[i].l)	update(c[--l],1);
		while (r>asks[i].r)	update(c[r--],-1);
		while (r<asks[i].r)	update(c[++r],1);
		
		nowy=(asks[i].r-asks[i].l+1)*(asks[i].r-asks[i].l);
		
		if (!nowx)	ansx[asks[i].id]=0,ansy[asks[i].id]=1;
		else	ansx[asks[i].id]=nowx/gcd(nowx,nowy),ansy[asks[i].id]=nowy/gcd(nowx,nowy);
	}
	
	for (int i=1;i<=m;i++)	printf("%d/%d\n",ansx[i],ansy[i]);
	return 0;
}
2023/7/16 21:25
加载中...