社区讨论
不是妹子,初学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 条回复,欢迎继续交流。
正在加载回复...