萌新妹子,求助,各种方法都优化了,还是3个点T了
查看原帖
萌新妹子,求助,各种方法都优化了,还是3个点T了
524801
不食嗟来之食楼主2022/9/16 19:52
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
using namespace std;
const int N=5e4+5;
struct peo {
	int l,r,id,le;
} qq[N],ans[N];
int sz,a[N],n,m,sum,alsum,le;
int cnt[N],jie[N];
int lcur=1,rcur=0;
inline void add(int x) {
	sum+=cnt[x];
	cnt[x]++;
}
inline void del(int x) {
	cnt[x]--;
	sum-=cnt[x];
}
bool cmp(peo ax,peo bx) {
	return ax.r/sz==bx.r/sz?ax.r/sz<bx.r/sz:ax.l/sz<bx.l/sz;
}
template <typename Tp>
Tp gcd(Tp a, Tp b) {
    return b == 0 ? a : gcd(b, a % b);
}
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-48;
		ch=getchar();
	}
	return x*f;
}
//int gcd(int x,int y){
//	if(y==0) return x;
//	else return gcd(y,x%y);
//}
int main() {
//	freopen("P1494_1.in","r",stdin);
//	freopen("P1494_1.out","w",stdout);
//	scanf("%d%d",&n,&m);
	n=read(),m=read();
	for(int i=1; i<=n; i++) 
	{
		a[i]=read();
	}
	sz=(int)n/sqrt(n*2/3);
	for(int i=1; i<=m; i++) {
//		scanf("%d%d",&qq[i].l,&qq[i].r);
		qq[i].l=read(),qq[i].r=read();
		qq[i].id=i;
	}
	sort(qq+1,qq+1+m,cmp);
	
	for(int i=1; i<=m; i++) {
		if(qq[i].l==qq[i].r){
			ans[qq[i].id].id=0;
			ans[qq[i].id].le=1;
			continue;
		}
		while(lcur>qq[i].l) add(a[--lcur]);
		while(lcur<qq[i].l) del(a[lcur++]);
		while(rcur>qq[i].r) del(a[rcur--]);
		while(rcur<qq[i].r) add(a[++rcur]);
		ans[qq[i].id].id=sum;
		ans[qq[i].id].l=qq[i].l;
		ans[qq[i].id].r=qq[i].r;
	}
	for(int i=1; i<=m; i++) {
		if(ans[i].id==0) {
			printf("0/1\n");
			continue;
		}
		ans[i].le=ans[i].r-ans[i].l;
		if(ans[i].le&1) ans[i].le=ans[i].le/2*(ans[i].le+1)+(ans[i].le+1)/2;
		else ans[i].le=ans[i].le/2*(ans[i].le+1);
		int g=gcd(ans[i].le,ans[i].id);
		printf("%d/%d\n",ans[i].id/g,ans[i].le/g);
	}
	return 0;
}

求助求助,奉上我的关注

2022/9/16 19:52
加载中...