社区讨论

第一次打莫队,最后一个点T了,求大佬帮忙指导卡常

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

讨论操作

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

当前回复
2 条
当前快照
1 份
快照标识符
@lospppt7
此快照首次捕获于
2023/11/10 22:27
2 年前
此快照最后确认于
2023/11/11 17:48
2 年前
查看原帖
CPP
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int N=5e5+10;
int gcd(int a,int b){
	if(a==0||b==0)return max(a,b);
	return gcd(min(a,b),max(a,b)%min(a,b));
}
int a[N],n,m;
struct node{
	int l,r,lk,id,ans;
}q[N];
int ans,tong[N];
void myin(const int &x){
	ans+=tong[a[x]];tong[a[x]]++;
}
void myout(const int &x){
	tong[a[x]]--;ans-=tong[a[x]];
}
bool cmp(const node &a,const node &b){
	return (a.lk==b.lk)?(a.r<=b.r):(a.lk<=b.lk);
}
bool cmp2(const node &a,const node &b){
	return a.id<=b.id;
}
int head=1,tail=0;
signed main(){
	cin>>n>>m;
	for(int i=1;i<=n;i++)scanf("%lld",&a[i]);
	for(int i=1;i<=m;i++){
		scanf("%lld%lld",&q[i].l,&q[i].r);q[i].lk=q[i].l/(sqrt(n));q[i].id=i;
	}
	sort(q+1,q+m+1,cmp);
	for(int i=1;i<=m;i++){
		while(tail<q[i].r)myin(++tail);
		while(head>q[i].l)myin(--head);
		while(tail>q[i].r)myout(tail--);
		while(head<q[i].l)myout(head++);
		q[i].ans=ans;
	}
	sort(q+1,q+m+1,cmp2);
	for(int i=1;i<=m;i++){
		int num1=q[i].r-q[i].l+1,num2=num1*(num1-1)/2,num3=gcd(q[i].ans,num2);
		if(q[i].l==q[i].r)printf("0/1\n");
		else printf("%lld/%lld\n",q[i].ans/num3,num2/num3);
	}
	return 0;
}

回复

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

正在加载回复...