QOJ.ac
QOJ
ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#880418 | #2173. What's Our Vector, Victor? | eggegg185 | WA | 119ms | 10384kb | C++14 | 2.5kb | 2025-02-03 11:56:40 | 2025-02-03 11:56:40 |
Judging History
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;
}
详细
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