【求助TLE】
查看原帖
【求助TLE】
397982
Deuteron楼主2022/6/23 19:46

RT

T了7个点,本地跑的飞快,luogu交就挂了

#include<iostream>
#include<algorithm>
using namespace std;
const int N=1e5+500,SN=300;
typedef long long ll;
int n,sn;
struct de{
	int l,r,id;
};
de d[N];
int c[N],t[N],a[N],q[N],ans;
static char buf[100000],*pa=buf,*pd=buf;
#define gc pa==pd&&(pd=(pa=buf)+fread(buf,1,100000,stdin),pa==pd)?EOF:*pa++
inline int read(){
    register int x(0);register char c(gc);
    while(c<'0'||c>'9')c=gc;
    while(c>='0'&&c<='9')x=(x<<1)+(x<<3)+(c^48),c=gc;
    return x;
}
int blk(int x){
	return (x-1)/SN;
}
int gcd(int a,int b){
	if(b==0) return a;
	return gcd(b,a%b);
}
int cmp(de x,de y){
	int dlx=blk(x.l),drx=blk(x.r),dly=blk(y.l),dry=blk(y.r);
	if(dlx<dly) return 0;
	if(dlx==dly) return drx<dry;
}
void update(int fl,int x){
	//cout<<fl<<" "<<x<<endl;
	if(fl){
		t[x]++;
		ans+=(t[x]*2-1);
	}
	else{
		t[x]--;
		ans-=(t[x]*2+1);
	}
	//cout<<ans<<endl;
}
int m;
int main(){
	//freopen("add.in","r",stdin);
	//freopen("add.out","w",stdout);
	n=read();
	m=read();
	for(int i=1;i<=n;i++) a[i]=read();
	for(int i=1;i<=m;i++){
		int l,r;
		l=read();
		r=read();
		d[i].l=l,d[i].r=r;
		d[i].id=i;
	}
	sort(d+1,d+m+1,cmp);
	int l=1,r=0;
	for(int i=1;i<=m;i++){
		//cout<<l<<" "<<r<<" "<<d[i].l<<" "<<d[i].r<<"\n";
		while(r>d[i].r) update(0,a[r]),r--;
		while(r<d[i].r) r++,update(1,a[r]);
		while(l>d[i].l) l--,update(1,a[l]);
		while(l<d[i].l) update(0,a[l]),l++;
		if(l==r){
			c[d[i].id]=0;
			q[d[i].id]=1;
			continue;
		}
		c[d[i].id]=ans-r+l-1;
		q[d[i].id]=(r-l+1)*(r-l);
	}
	for(int i=1;i<=m;i++){
		if(c[i]==0){
			cout<<"0/1\n";
			continue;
		}
		cout<<c[i]/gcd(c[i],q[i])<<"/"<<q[i]/gcd(c[i],q[i])<<"\n";
	}
	return 0;
}
2022/6/23 19:46
加载中...