求助,代码没错,思路错了
查看原帖
求助,代码没错,思路错了
149219
_mazetorches楼主2020/8/1 14:32

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

2020/8/1 14:32
加载中...