萌新刚学OI,最后一个点WA了求调QAQ
查看原帖
萌新刚学OI,最后一个点WA了求调QAQ
452438
_Minecraft12345楼主2023/7/27 16:57

代码如下

#include<bits/stdc++.h>
#define int long long
using namespace std;
int n,m;
int sqn;//卡常了
struct node {
	int l,r,pos;//pos表示询问顺序
} ask[50010];
int cnt[50010];
int ansfz[50010],ansfm[50010];
int c[50010];
bool cmp(node nd1,node nd2) {
	if(nd1.l/sqn!=nd2.l/sqn)return nd1.l/sqn<nd2.l/sqn;
	return nd1.r<nd2.r;
}
int fenzi,fenmu;
void del(int x) {
	fenzi-=cnt[c[x]]*(cnt[c[x]]-1)/2;
	cnt[c[x]]--;
	fenzi+= cnt[c[x]]*(cnt[c[x]]-1)/2;
}
void add(int x) {
	fenzi-=cnt[c[x]]*(cnt[c[x]]-1)/2;
	cnt[c[x]]++;
	fenzi+= cnt[c[x]]*(cnt[c[x]]-1)/2;
}

signed main() {

	ios::sync_with_stdio(false);
	cin.tie(0);
	cin>>n>>m;
	sqn=sqrt(n);
	for(int i=1; i<=n; i++) {
		cin>>c[i];
	}
	for(int i=1; i<=m; i++) {
		int l,r;
		cin>>l>>r;
		ask[i]= {l,r,i};
	}
	sort(ask+1,ask+m+1,cmp);
	int l=ask[1].l,r=ask[1].r;

	fenmu=(r-l+1)*(r-l)/2;//概率的分子分母
	if(fenmu==1)fenzi=0;
	else {
		for(int i=l; i<=r; i++) { //第一次暴力计算概率
			cnt[c[i]]++;
		}
		for(int i=1; i<=n; i++) {
			fenzi+=cnt[i]*(cnt[i]-1)/2;
		}
	}
	ansfz[ask[1].pos]=fenzi;
	ansfm[ask[1].pos]=fenmu;
	for(int i=2; i<=m; i++) {
		int newl=ask[i].l,newr=ask[i].r;
		while(l<newl) { //l向后移
			del(l);
			++l;
		}
		while(l>newl) { //l向前移
			--l;
			add(l);
		}
		while(r<newr) { //r向后移
			++r;
			add(r);
		}
		while(r>newr) { //r向前移
			del(r);
			--r;
		}
		fenmu=(r-l+1)*(r-l)/2;//所有都要更新分母,所以干脆这里统一
		ansfz[ask[i].pos]=fenzi;
		ansfm[ask[i].pos]=fenmu;
	}
	for(int i=1; i<=m; i++) {
		if(/*ansfz[i]==ansfm[i]*/ansfm[i]==0)cout<<"0/1\n";
		else {
			int g=__gcd(ansfz[i],ansfm[i]);
			cout<< ansfz[i]/g<<"/"<<ansfm[i]/g<<'\n';
		}
	}
	return 0;
}

详细错误信息:

Wrong Answer.wrong answer On line 2 column 4, read 2, expected 3.

谢谢了AWA

2023/7/27 16:57
加载中...