QOJ.ac
QOJ
ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#376855 | #2173. What's Our Vector, Victor? | ucup-team1209 | TL | 80ms | 10032kb | C++20 | 4.5kb | 2024-04-04 17:41:11 | 2024-04-04 17:41:34 |
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 = 1e5;
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 < 100000;++i) {
// std::cerr << init[0] << ' ' << eval(init) << '\n';
if(i % 17 == 0 && 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: 100
Accepted
time: 77ms
memory: 9924kb
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:
19.2131420239 6.6116010384 21.4200482705 56.9386478055 -89.7160474683 92.9322890063 70.9576916012 11.4955427802 -48.3685940500 38.6938107212 50.0774292067 7.6286116238 2.2148056501 -37.3139908424 -95.5061214107 -67.7834766726 -6.4342257994 45.2469434077 -27.5157456104 19.9638642430 30.1755275221 12....
result:
ok accepted
Test #2:
score: 0
Accepted
time: 74ms
memory: 10032kb
input:
500 500 -20.46791708061053328 -78.90373004342441732 -47.09421721341704625 49.96697218958462372 48.99528416466444014 -46.87780686216100889 73.68284736943891744 -53.69249802982882613 -92.37158007019175443 -97.95346943385396798 -47.79109018973426259 82.31965483504592385 -72.09718577745493917 -32.376534...
output:
-1.5215345076 4.5693935729 -55.1537400055 -30.8206123075 -4.5300711174 -40.7480490928 -98.0817466388 -70.6794335668 33.7580005787 40.8307871988 -79.9701023663 28.7611061458 74.1169381769 99.2006609739 63.1466615969 13.4872386250 87.8152808995 -79.2485168707 -94.8371768875 -18.8682559047 -7.222065851...
result:
ok accepted
Test #3:
score: 0
Accepted
time: 80ms
memory: 9964kb
input:
500 500 91.75754360584323877 -74.07465057030329092 -30.06919963013949371 -22.45376960826932589 -94.33818252302211249 95.43185666705545600 -35.93139380204742395 -46.28091101025437837 20.25588702053946122 -31.98355965847254367 96.27926708531694544 17.21195108047088240 -16.00480323252260462 -14.1553994...
output:
26.9679740848 -85.5196887592 33.0051525081 56.4491767908 96.2024192054 2.1449649798 46.1593010770 -10.5524772890 95.1878089215 89.0367034668 53.3099139964 47.8109364807 -44.1149361509 -38.6811778858 20.3000464890 -79.5595673824 -83.2187281280 81.0406419621 63.6096929398 -32.5949599087 -3.1428774192 ...
result:
ok accepted
Test #4:
score: 0
Accepted
time: 76ms
memory: 9964kb
input:
500 500 53.59239375857157484 1.29576452891167548 -55.60357761919549802 2.89491049833583247 -72.25117082444128869 -44.92736039007480997 6.81675337705620166 -46.20517542139523925 20.56179110027964896 99.93596620202598046 -30.87710828002636276 60.42621397022924157 79.91458345844398536 94.56182305252031...
output:
25.3319261915 6.0513200265 41.1514606864 -77.2156885794 76.9918318457 80.5690490053 93.0687005370 -33.3878339850 -33.1932708074 -89.2763178527 60.9935608857 21.8236314581 -91.8804470137 76.3755847553 26.4845929193 -41.6773655750 16.2208646187 81.9466267859 29.0695144401 -11.9289031393 65.5465321976 ...
result:
ok accepted
Test #5:
score: 0
Accepted
time: 80ms
memory: 9796kb
input:
500 500 -63.61543927507285190 43.87221058298641196 8.16924114047013461 -34.92232278546450175 91.80142804719758942 -76.82013016900501157 25.06001121373941487 48.24958448628115093 65.82846176112221315 33.19899446519090702 84.05389321600614494 -78.49637158041961982 87.99406312213668002 -60.859516869891...
output:
-0.5237395012 -10.7302221003 -99.8459370546 87.1413921023 4.2783215430 -50.7949355799 -67.3821708508 41.5351118975 67.6586753784 -95.2972443631 62.3913506553 -56.5351652871 -93.7357214687 -0.0784934799 63.4548000759 95.5924900612 93.8974991075 90.0565113185 -1.6842116212 10.6504788217 79.4691340903 ...
result:
ok accepted
Test #6:
score: -100
Time Limit Exceeded
input:
24 114 19.60728784212125220 62.05571106800468328 -77.66722345143722350 83.32150488873739391 85.61849285200199233 -61.26186974500755866 54.01645372221616981 -19.69713224000579999 -10.16958551834513003 -18.69109461054532062 9.59051520125903778 91.21514401069063638 89.60632230190051928 -51.201061482129...