QOJ.ac
QOJ
ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#376731 | #2173. What's Our Vector, Victor? | ucup-team1209 | WA | 83ms | 9772kb | C++20 | 4.5kb | 2024-04-04 15:55:07 | 2024-04-04 15:55:08 |
Judging History
answer
#include <bits/stdc++.h>
#define cs const
#define pb push_back
using namespace std;
cs int N = 500 + 5;
using ll = long long ;
using pi = pair <int, int> ;
mt19937 rnd(1232435);
int d, n;
double x[N][N], v[N], r[N];
double base[N][N];
double a[N][N];
double X[N];
using db = double;
using sol = std::vector<db>;
using vd = sol;
int bc = 0;
void getans() {
sol init(bc);
vd z(d + 1);
for(int i = 0;i <= d;++i) z[i] = X[i];
auto eval = [&](sol x) {
vd vec = z;
for(int i = 0;i < bc;++i) {
for(int j = 0;j <= d;++j) {
vec[j] += base[i][j] * x[i];
}
}
db sum = 0;
for(int i = 0;i < d;++i) {
sum += vec[i] * vec[i];
}
sum -= vec[d];
return sum;
};
db rate = 30;
for(int i = 0;i < bc;++i) {
db sum = 0;
for(int j = 0;j <= d;++j) {
sum += base[i][j] * base[i][j];
}
sum = sqrt(sum);
for(int j = 0;j <= d;++j) {
base[i][j] /= sum;
}
}
for(int i = 0;i < 10000;++i) {
//std::cerr << eval(init) << '\n';
if(eval(init) < -1) break;
sol grad(bc);
vd vec = z;
for(int i = 0;i < bc;++i) {
for(int j = 0;j <= d;++j) {
vec[j] += base[i][j] * init[i];
}
}
for(int i = 0;i < bc;++i) {
for(int j = 0;j < d;++j) {
grad[i] += vec[j] * 2 * base[i][j];
}
grad[i] -= base[i][d];
}
db sg = 0;
for(int j = 0;j < bc;++j) {
sg += grad[j] * grad[j];
}
sg = sqrt(sg);
for(int j = 0;j < bc;++j) {
init[j] -= grad[j] / sg * rate;
}
rate *= 0.997;
}
sol l = init, r = init;
for(;eval(r) < 0;) {
for(int j = 0;j < bc;++j) {
r[j] += l[j] + 1;
}
}
for(int i = 0;i < 200;++i) {
sol mid = l;
for(int j = 0;j < bc;++j) {
mid[j] = (mid[j] + r[j]) / 2;
}
if(eval(mid) >= 0) {
r = mid;
} else {
l = mid;
}
}
vd vec = z;
for(int i = 0;i < bc;++i) {
for(int j = 0;j <= d;++j) {
vec[j] += base[i][j] * l[i];
}
}
// std::cerr << eval(l) << '\n';
for(int i = 0;i < d;++i) {
printf("%.10lf%c", vec[i], " \n"[i == d - 1]);
}
// for(int i = 0;i < n;++i) {
// db sum = 0;
// for(int k = 0;k <= d;++k) {
// sum += vec[k] * a[i][k];
// }
// printf("%.10lf\n", sum - a[i][d + 1]);
// }
// for(int i = 0;i < n;++i) {
// db ans = 0;
// for(int k = 0;k < d;++k) {
// ans += (vec[k] - x[i][k]) * (vec[k] - x[i][k]);
// }
// printf("%.10lf\n", std::sqrt(ans) - ::r[i]);
// }
}
int main() {
#ifdef zqj
freopen("1.in", "r", stdin);
#endif
ios :: sync_with_stdio(0), cin.tie(0);
cin >> d >> n;
for(int i = 0; i < n; i++) {
for(int j = 0; j < d; j++) cin >> x[i][j];
cin >> r[i];
for(int j = 0; j < d; j++) a[i][j] = - 2 * x[i][j];
a[i][d] = 1;
a[i][d + 1] = r[i] * r[i];
for(int j = 0; j < d; j++)
a[i][d + 1] -= x[i][j] * x[i][j];
}
// for(int z = 0; z < n; z++) {
// for(int t = 0; t <= d + 1; t++) {
// cout << a[z][t] << ' ';
// }
// cout << endl;
// }
vector<int> free;
using pr = std::pair<int, int>;
vector<pr> other;
for(int i = 0, r = 0; i <= d; i++) {
double mx = 0;
int k = r;
for(int j = r; j < n; j++) {
if(abs(a[j][i]) > mx) {
mx = abs(a[j][i]), k = j;
}
}
if(mx < 1e-5) {
free.push_back(i);
continue;
}
other.emplace_back(r, i);
swap(a[r], a[k]);
for(int j = 0; j < n; j++) if(j != r) {
double c = a[j][i] / a[r][i];
for(int k = i; k <= d + 1; k++)
a[j][k] -= a[r][k] * c;
}
r += 1;
}
for(int i : free) {
base[bc][i] = 1;
for(auto [pj, j] : other) {
base[bc][j] = -a[pj][i] / a[pj][j];
}
++bc;
}
for(auto [pi, i] : other) {
X[i] = a[pi][d + 1] / a[pi][i];
}
getans();
return 0;
}
詳細信息
Test #1:
score: 0
Wrong Answer
time: 83ms
memory: 9772kb
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:
63221.5160923789 -15.6490208242 -54884.4666446613 -162540.7070870356 44384.0499486309 1349.7210084359 128550.9429631836 52792.3496006779 -20596.5239788281 22005.8417508452 -33716.7863974667 -34451.3723244100 -109477.8569551262 61383.8243757537 -20471.9863417938 -17626.8928527229 -3156.2181140495 -45...
result:
wrong answer distance to vector 1 should be 1769.53592263014638775 but is 988152.29910052078776062, error 557.42454875501061906