社区讨论

不是妹子,初学OI,求帮忙找错

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

讨论操作

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

当前回复
17 条
当前快照
1 份
快照标识符
@mi6yc18x
此快照首次捕获于
2025/11/20 12:49
4 个月前
此快照最后确认于
2025/11/20 15:29
4 个月前
查看原帖
CPP
#include<bits/stdc++.h>
using namespace std;

long long gcd(const long long &a,const long long &b){
    return b?gcd(b,a%b):a;
}

inline long long lcm(const long long &a,const long long &b){
    return a/gcd(a,b)*b;
}

struct fraction{
    long long mol,den;
    fraction():mol(0),den(1) {}
    fraction(long long mol,long long den){
        if(den<0 and mol>=0) den*=-1,mol*=-1;
        long long d=gcd(mol,den);
        mol/=d;
        den/=d;
        this->mol=mol;
        this->den=den;
    }
};

fraction operator * (const fraction &a,const fraction &b){
    return fraction(a.mol*b.mol,a.den*b.den);
}
/*
fraction operator / (const fraction &a,const fraction &b){
    return fraction(a.mol*b.den,a.den*b.mol);
}

fraction operator + (const fraction &a,const fraction &b){
    long long L=lcm(a.den,b.den);
    return fraction(L/a.den*a.mol+L/b.den*b.mol,L);
}

fraction operator - (const fraction &a,const fraction &b){
	return a+fraction(-b.mol,b.den);
}
*/
const int maxn=5e4+10;
int n,m;
int c[maxn];
int cnt[maxn];

struct Q{
    int l,r,idx;
    fraction ans;
};
Q q[maxn];

inline bool cmp1(const Q &a,const Q &b){
    return a.idx<b.idx;
}

inline bool cmp2(const Q &a,const Q &b){
    return a.l<b.l;
}

inline bool cmp3(const Q &a,const Q &b){
    return a.r<b.r;
}

int t,s;
int l[2500],r[2500];

void read(){
    cin>>n>>m;
    for(int i=1;i<=n;++i) scanf("%d",&c[i]);
    for(int i=1;i<=m;++i){
        int l,r; scanf("%d%d",&l,&r);
        q[i]=(Q){l,r,i,fraction(0,1)};
    }
    sort(q+1,q+m+1,cmp2);
    s=sqrt(m);
    t=m/s;
    if(m%s) t++;
    for(int i=1;i<=t;++i){
        l[i]=(i-1)*s+1;
        r[i]=min(m,l[i]+s-1);
    }
    for(int i=1;i<=t;++i) sort(q+l[i],q+r[i]+1,cmp3);
}

void solve(){
	for(int i=1;i<=t;++i){
		long long sum=0;
		memset(cnt,0,sizeof(cnt));
		long long L=q[l[i]].l,R=q[l[i]].r;
		if(L==R) cnt[L]=1;
		if(L!=R) for(int j=L;j<=R;++j) sum+=2*cnt[c[j]]++;
		q[l[i]].ans=fraction(sum,L!=R?sum?(R-L+1)*(R-L):1:1);
		for(int j=l[i]+1;j<=r[i];++j){
			long long _L=q[j].l,_R=q[j].r;
			if(_L==_R) sum=0,memset(cnt,0,sizeof(cnt)),cnt[c[_L]]=1;
			else{
				if(R<_R) for(++R;R<=_R;++R) sum+=2*cnt[c[R]]++;
				if(L>_L) for(--L;L>=_L;--L) sum+=2*cnt[c[L]]++;
				else if(L<_L) for(;L<_L;++L) sum-=2*--cnt[c[L]];
			}
			L=_L,R=_R;
			q[j].ans=fraction(sum,R!=L?sum?(R-L+1)*(R-L):1:1);
		}
	}
	sort(q+1,q+m+1,cmp1);
    for(int i=1;i<=m;++i) printf("%lld/%lld\n",q[i].ans.mol,q[i].ans.den);
}

int main(){
	freopen("test1.in","r",stdin);
	freopen("ans1.out","w",stdout);
    read();
    solve();
    return 0;
}
sum维护sigma(cnt[ci]*(cnt[ci]-1)); 在#1的一组询问l=4986 r=4987里给出1/1,标准输出应当是0/1

回复

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

正在加载回复...