社区讨论

RE求助,,,,,

P1494[国家集训队] 小 Z 的袜子参与者 2已保存回复 1

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
1 条
当前快照
1 份
快照标识符
@lo1xktkj
此快照首次捕获于
2023/10/23 04:38
2 年前
此快照最后确认于
2023/11/03 05:04
2 年前
查看原帖
CPP
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
#define ll long long
using namespace std;
int c[50005],B,cnt[50005];
struct node{
	int l,r,id;
}a[50005];
bool cmp(node a,node b){
	if((a.l/B)!=(b.l/B))return (a.l/B)<(b.l/B);
	else return a.r<b.r;
}
ll C(int x){
	if(x<2)return 0;
	return x*1ll*(x-1); 
}ll ans[50005],as[50005];
ll gcd(ll a,ll b){return b==0?a:gcd(b,a%b);}
int main(){
//	freopen("P1491_1.in","r",stdin);
//	freopen("P1491.out","w",stdout);
	int n,m,l=0,r=0;
	ll sum=0;
	scanf("%d%d",&n,&m);
	B=sqrt(n);
	for(int i=1; i<=n; i++)scanf("%d",&c[i]);
	for(int i=1; i<=m;i++){
		scanf("%d %d",&a[i].l,&a[i].r);
		a[i].id=i;
	}
	sort(a+1,a+1+m,cmp);
	for(int i=1; i<=m; i++){
		if(a[i].l==a[i].r){
			l=a[i].l;
			r=a[i].r;
			as[a[i].id]=1;
			ans[a[i].id]=0;
			sum=0;
			continue;
		}
		while(l>a[i].l){
			sum-=C(cnt[c[--l]]);
			sum+=C(++cnt[c[l]]);
		}
		while(l<a[i].l){
			sum-=C(cnt[c[l]]);
			sum+=C(--cnt[c[l++]]);
		}
		while(r<a[i].r){
			sum-=C(cnt[c[++r]]),
			sum+=C(++cnt[c[r]]);
		}
		while(r>a[i].r){
			sum-=C(cnt[c[r]]);
			sum+=C(--cnt[c[r--]]);
		}
		ans[a[i].id]=sum;
		as[a[i].id]=C(r-l+1);
	}
	for(int i=1; i<=m; i++){
		if(as[i]==0)as[i]=2;
		ll d=gcd(ans[i]/2,as[i]/2);
		printf("%lld/%lld\n",ans[i]/2/d,as[i]/2/d);
	}
	return 0;
}

回复

1 条回复,欢迎继续交流。

正在加载回复...