QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#880418#2173. What's Our Vector, Victor?eggegg185WA 119ms10384kbC++142.5kb2025-02-03 11:56:402025-02-03 11:56:40

Judging History

This is the latest submission verdict.

  • [2025-02-03 11:56:40]
  • Judged
  • Verdict: WA
  • Time: 119ms
  • Memory: 10384kb
  • [2025-02-03 11:56:40]
  • Submitted

answer

#include <iostream>
#include <cmath>
using namespace std;
int d,n,p[505],cnt = 0; double a[505][505],x[505][505],e[505],v[505][505],A[505][505],ans[505];
template<class T> //cool! I have learned this to read matrixs.
void gauss(int n,int m,T a) {
	int cur = 1; for(int c = 1; c <= m; c++) {
		for(int i = cur+1; i <= n; i++) if(fabs(a[i][c]) > fabs(a[cur][c])) swap(a[cur],a[i]);
		if(fabs(a[cur][c]) < 1e-9) continue;
		for(int i = 1; i <= n; i++) {
			if(i != cur) {
				double rat = a[i][c]/a[cur][c];
				for(int j = 1; j <= m+1; j++) a[i][j] -= a[cur][j]*rat;
			}
		} for(int j = m+1; j >= 1; j--) a[cur][j] /= a[cur][c]; cur++;
	}
}
int main() {
	//freopen("P8141_1.in","r",stdin);
	cin.tie(0)->sync_with_stdio(false);
	cin >> d >> n; for(int i = 1; i <= n; i++) {
		for(int j = 1; j <= d; j++) cin >> x[i][j]; cin >> e[i];
	}
	for(int i = 2; i <= n; i++) {
		for(int j = 1; j <= d; j++) {
			x[i][j] -= x[1][j];
			a[i-1][j] = 2*x[i][j]; a[i-1][d+1] += x[i][j]*x[i][j];
		} a[i-1][d+1] += e[1]*e[1]-e[i]*e[i];
	} gauss(n-1,d,a);
	for(int i = 1; i <= n-1; i++) {
		int s = 0; for(int j = 1; j <= d; j++) if(fabs(a[i][j]) > 1e-9) {s = j; break;}
		p[s] = -1;
	}
	for(int i = 1; i <= d; i++) if(p[i] != -1) p[i] = ++cnt,v[cnt][i] = 1; p[d+1] = 0; //damn, I almost forget that
	if(!cnt) {
		for(int i = 1; i < n; i++) {
			int s = 0; for(int j = 1; j <= d; j++) if(fabs(a[i][j])>1e-9) {s = j; break;}
			ans[s] = a[i][d+1]+x[1][i];
		}
	} else {
		for(int i = 1; i < n; i++) {
			int s = 0; for(int j = 1; j <= d; j++) if(fabs(a[i][j]) > 1e-9) {s = j; break;}
			for(int j = s+1; j <= d+1; j++) {
				if(p[j] != -1) v[p[j]][s] = -a[i][j];
			}
		}
		for(int i = 1; i <= cnt; i++) {
			for(int j = 1; j <= d; j++) {
				for(int k = 1; k <= cnt; k++) A[i][k] += v[i][j]*v[k][j];
			}
		}
		for(int i = 1; i <= cnt; i++) {
			for(int j = 1; j <= d; j++) {
				A[i][cnt+1] -= v[i][j]*v[0][j];
			}
		}
		gauss(cnt,cnt,A); for(int i = 1; i <= d; i++) if(p[i] != -1) ans[i] = A[p[i]][cnt+1];
		for(int i = n-1; i >= 1; i--) {
			int s = 0; for(int j = 1; j <= d; j++) if(fabs(a[i][j]) > 1e-9) {s = j; break;} ans[s] = a[i][d+1];
			for(int j = s+1; j <= d; j++) ans[s] -= a[i][j]*ans[j];
		}
		double ss = 0,rr = 0;
		for(int i = 1; i <= d; i++) ss += ans[i]*ans[i],rr += v[1][i]*v[1][i];
		rr = sqrt(rr); for(int i = 1; i <= d; i++) ans[i] += v[1][i]/rr*sqrt(e[1]*e[1]-ss)+x[1][i];
	}
	for(int i = 1; i <= d; i++) printf("%.12f ",ans[i]);
	return 0;
}

Details

Tip: Click on the bar to expand more detailed information

Test #1:

score: 0
Wrong Answer
time: 119ms
memory: 10384kb

input:

500 500
60.00268893933372283 70.35885554610950976 -8.98574176457012186 46.16014112676185732 66.31422279348288384 29.03050764912902082 -35.06996828144599476 -59.10319321730690234 67.85808505028276727 20.30232033048615392 62.38784996896146140 59.92659390534240060 -36.26787439344059294 30.8251981981496...

output:

-nan -nan -nan -nan -nan -nan -nan -nan -nan -nan -nan -nan -nan -nan -nan -nan -nan -nan -nan -nan -nan -nan -nan -nan -nan -nan -nan -nan -nan -nan -nan -nan -nan -nan -nan -nan -nan -nan -nan -nan -nan -nan -nan -nan -nan -nan -nan -nan -nan -nan -nan -nan -nan -nan -nan -nan -nan -nan -nan -nan ...

result:

wrong output format Expected double, but "-nan" found