RT,由于代码是从小b的序列那题迁移过来的,所以能保证莫队部分没错但还是希望有大佬来看看有没有智障错误qwq
下面是我推的式子:
设一个颜色袜子共有x只
则在其中选取的两只袜子的情况共x(x-1)/2只(题目中提到,不考虑顺序)
如果袜子数+1,则答案要加上(x+1)*x/2-(x-1)*x/2
提取公因式,得:(x+1-x+1)*x/2=2/2*x=x
如袜子数-1,则答案要减去(x-1)*x/2-(x-1)(x-2)/2
拆开得:
[x*x-x-x*x+3x-2]/2=(-x+3x-2)/2=(2x+2)/2=x+1
所以最终答案只需要将now与(que[i].r-que[i].l)*(que[i].r-que[i].l+1)/2约分即可。
代码:
#include<bits/stdc++.h>
using namespace std;
int n,m,k,a[100005],ton[100005],kuai[100005];
int l,r,now,ans[100005][3];
void add(int p){
now+=ton[a[p]];
ton[a[p]]++;
}
void del(int p){
now-=(ton[a[p]]-1);
--ton[a[p]];
}
struct node{
int l,r,id;
}que[1000001];
bool cmp(node a,node b){
return kuai[a.l]==kuai[b.l]?a.r<b.r:kuai[a.l]<kuai[b.l];
}
int main(){
cin>>n>>m;
for(int i=1;i<=n;i++){
cin>>a[i];
}
l=1;
r=0;
int pin=sqrt(m);
for(int i=1;i<=m;i++){
cin>>que[i].l>>que[i].r;
que[i].id=i;
kuai[i]=(i-1)/pin+1;
}
sort(que+1,que+m+1,cmp);
for(int i=1;i<=m;i++){
if(que[i].l==que[i].r){
ans[que[i].id][1]=0;
ans[que[i].id][2]=1;
continue;
}
while(l<que[i].l) del(l++);
while(l>que[i].l) add(--l);
while(r<que[i].r) add(++r);
while(r>que[i].r) del(r--);
ans[que[i].id][1]=now;
ans[que[i].id][2]=(que[i].r-que[i].l)*(que[i].r-que[i].l+1)/2;
}
for(int i=1;i<=m;i++){
if(ans[i][1]==0){
cout<<"0/1"<<endl;
continue;
}
int ans1=ans[i][1],ans2=ans[i][2];
cout<<ans1/__gcd(ans1,ans2)<<'/'<<ans2/__gcd(ans1,ans2)<<endl;
}
}
所以到底哪里错了?是思路还是代码错了?求解qwq