QOJ.ac
QOJ
ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#570077 | #8082. Minimum Euclidean Distance | longyin | AC ✓ | 836ms | 4156kb | C++20 | 2.7kb | 2024-09-17 13:41:51 | 2024-09-17 13:41:54 |
Judging History
answer
#include <bits/stdc++.h>
//#define int long long
#define endl "\n"
using namespace std;
using ll = long long;
const int N = 5e3 + 5;
const long double INF = 1e30;
const long double eps = 1e-9;
struct Point {
long double x, y;
using Vec = Point;
Point operator + (const Point& p) {
return {x + p.x, y + p.y};
}
Point operator - (const Point& p) {
return {x - p.x, y - p.y};
}
Point operator * (const long double k) {
return {x * k, y * k};
}
Point operator / (const int k) {
return {x / k, y / k};
}
long double dot(const Point& p) {
return x * p.x + y * p.y;
}
long double cross(const Vec& p) {
return x * p.y - y * p.x;
}
long double dis(const Point& p) {
return sqrt(dis2(p));
}
long double dis2(const Point& p) {
return pow(x - p.x, 2) + pow(y - p.y, 2);
}
long double len() {
return sqrt(len2());
}
long double len2() {
return pow(x, 2) + pow(y, 2);
}
void show() {
cout << x << " " << y << endl;
}
} points[N];
using Vec = Point;
long double pToSegDis(Point& p, Point& a, Point& b) {
Point s;
if (a.x == b.x) {
s = {a.x - p.x, 0};
}
else if (a.y == b.y) {
s = {0, a.y - p.y};
}
else {
long double k = -1 / ((a.y - b.y) / (a.x - b.x));
long double d = abs((b - a).cross(p - a)) / a.dis(b);
long double m = sqrt(1 + k * k);
long double n = d / m;
s = Point({1, k}) * n;
}
Point h = p + s;
long double res = (b - a).dot(h - a) / a.dis2(b);
if (res <= -eps)
return p.dis2(a);
else if (res >= 1 + eps)
return p.dis2(b);
else
return p.dis2(h);
}
int main() {
ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
int n, q;
cin >> n >> q;
for (int i = 1; i <= n; i++) {
cin >> points[i].x >> points[i].y;
}
points[n + 1] = points[1];
for (int i = 1; i <= q; i++) {
Point p, q;
cin >> p.x >> p.y >> q.x >> q.y;
Point o = (p + q) / 2;
long double r = p.dis(q) / 2;
long double res = INF;
bool flag = false;
for (int j = 1; j <= n; j++) {
if ((points[j + 1] - points[j]).cross(o - points[j]) <= eps) {
flag = true;
}
long double d = pToSegDis(o, points[j], points[j + 1]);
res = min(res, d);
}
if (!flag)
res = 0;
res += r * r / 2;
cout << fixed << setprecision(10) << res << endl;
}
return 0;
}
詳細信息
Test #1:
score: 100
Accepted
time: 0ms
memory: 3944kb
input:
4 3 0 0 1 0 1 1 0 1 0 0 1 1 1 1 2 2 1 1 2 3
output:
0.2500000000 0.7500000000 1.8750000000
result:
ok Your answer is acceptable!^ ^
Test #2:
score: 0
Accepted
time: 0ms
memory: 3868kb
input:
48 10 -30 0 -29 -4 -28 -7 -27 -9 -25 -12 -22 -16 -21 -17 -17 -20 -14 -22 -12 -23 -9 -24 -5 -25 -4 -25 0 -24 3 -23 5 -22 8 -20 12 -17 13 -16 16 -12 18 -9 19 -7 20 -4 21 0 21 1 20 5 19 8 18 10 16 13 13 17 12 18 8 21 5 23 3 24 0 25 -4 26 -5 26 -9 25 -12 24 -14 23 -17 21 -21 18 -22 17 -25 13 -27 10 -28 ...
output:
589.5000000000 51.4705882353 1051.2500000000 66.6250000000 174.1250000000 562.6750000000 272.3942307692 287.3850000000 689.6250000000 436.2500000000
result:
ok Your answer is acceptable!^ ^
Test #3:
score: 0
Accepted
time: 835ms
memory: 4044kb
input:
5000 5000 -50000000 0 -49999885 -49450 -49999770 -85675 -49999604 -122394 -49999391 -157604 -49999130 -192731 -49998803 -229143 -49998399 -267196 -49997956 -303872 -49997469 -339362 -49996891 -377221 -49996257 -414903 -49995577 -451819 -49994843 -488600 -49994059 -524941 -49993173 -563137 -49992252 ...
output:
2214785369560632.8750000000 1632645104370924.3750000000 3954739966640761.3752441406 5405105667896787.7500000000 817274719687553.0313720703 902260846427661.0824584961 3194363161448624.1250000000 1619744446324385.1248779297 363457485421825.2499694824 4776425533214308.6240234375 8267595460255072.724609...
result:
ok Your answer is acceptable!^ ^
Test #4:
score: 0
Accepted
time: 374ms
memory: 3944kb
input:
2224 5000 -500000 0 -499999 -30 -499998 -59 -499997 -87 -499996 -114 -499995 -140 -499994 -165 -499993 -189 -499992 -212 -499991 -234 -499990 -255 -499989 -275 -499988 -294 -499987 -312 -499986 -329 -499985 -345 -499984 -360 -499982 -389 -499981 -403 -499979 -430 -499978 -443 -499976 -468 -499975 -4...
output:
931340796015.3750000000 410570465847.7500000000 225774975043.7500000000 686588110927.3750000000 803635163394.8750000000 440321806244.7500000000 781364862674.5000000000 303496624306.7500000000 146653887864.7500000000 1361017661096.7500000000 409649028457.5000000000 417747460932.7500000000 46509181005...
result:
ok Your answer is acceptable!^ ^
Test #5:
score: 0
Accepted
time: 777ms
memory: 4036kb
input:
4672 5000 -300 0 -299 -43 -298 -85 -297 -126 -296 -166 -295 -205 -294 -243 -293 -280 -292 -316 -291 -351 -290 -385 -289 -418 -288 -450 -287 -481 -286 -511 -285 -540 -284 -568 -283 -595 -282 -621 -281 -646 -280 -670 -279 -693 -278 -715 -276 -758 -275 -779 -273 -820 -272 -840 -270 -879 -269 -898 -267 ...
output:
356616.5000000000 121018.5000000000 0.2500000000 189.6250000000 103099.6250000000 83253.1250000000 131701.2500000000 58352.5000000000 355863.1250000000 197638.8597240473 605772.4121621622 2062.4458977408 113763.2500000000 134694.5000000000 74679.6520547945 114481.2500000000 60577.2500000000 7456.250...
result:
ok Your answer is acceptable!^ ^
Test #6:
score: 0
Accepted
time: 101ms
memory: 3900kb
input:
576 5000 -300 0 -299 -15 -298 -29 -297 -42 -296 -54 -295 -65 -294 -75 -293 -84 -292 -92 -290 -107 -289 -114 -287 -127 -286 -133 -284 -144 -283 -149 -280 -163 -278 -172 -275 -185 -274 -189 -270 -204 -267 -215 -265 -222 -262 -232 -258 -245 -257 -248 -252 -262 -248 -273 -245 -281 -240 -294 -238 -299 -2...
output:
189295.2500000000 377943.2944162437 299473.0000000000 243821.9171974522 559270.9922279793 100367.5923396675 472743.1250000000 374450.6250000000 77260.6250000000 106891.2307692308 193578.1250000000 98895.0654145078 124020.0000000000 296138.8750000000 1209.1250000000 480040.6250000000 133543.970689655...
result:
ok Your answer is acceptable!^ ^
Test #7:
score: 0
Accepted
time: 61ms
memory: 4016kb
input:
336 5000 -300 0 -299 -11 -298 -21 -297 -30 -296 -38 -295 -45 -294 -51 -292 -62 -291 -67 -289 -76 -288 -80 -285 -91 -283 -98 -280 -108 -279 -111 -275 -122 -272 -130 -270 -135 -267 -142 -263 -151 -258 -162 -257 -164 -251 -175 -246 -184 -242 -191 -239 -196 -234 -204 -227 -215 -225 -218 -218 -228 -213 -...
output:
478.1250000000 408.1250000000 1341.2500000000 861.2500000000 4210.0000000000 1709.1250000000 846.2500000000 1389.1250000000 722.5000000000 753.1250000000 574.2500000000 1167.1250000000 439.6250000000 5650.2500000000 619.6250000000 2664.5000000000 2138.6250000000 2138.6250000000 1226.2500000000 1226....
result:
ok Your answer is acceptable!^ ^
Test #8:
score: 0
Accepted
time: 58ms
memory: 3960kb
input:
336 5000 -300 0 -299 -11 -298 -21 -297 -30 -296 -38 -295 -45 -294 -51 -292 -62 -291 -67 -289 -76 -288 -80 -285 -91 -283 -98 -280 -108 -279 -111 -275 -122 -272 -130 -270 -135 -267 -142 -263 -151 -258 -162 -257 -164 -251 -175 -246 -184 -242 -191 -239 -196 -234 -204 -227 -215 -225 -218 -218 -228 -213 -...
output:
95.1250000000 8382.6250000000 77361.1250000000 142408.1250000000 98056.2500000000 110581.2500000000 20413.0000000000 1253.1250000000 64468.6250000000 8915.6250000000 93179.1250000000 26286.2500000000 35118.2500000000 129681.2500000000 59545.6250000000 49997.9103773585 1685.1250000000 58020.625000000...
result:
ok Your answer is acceptable!^ ^
Test #9:
score: 0
Accepted
time: 831ms
memory: 4156kb
input:
5000 5000 -50000000 0 -49999912 -33572 -49999824 -59400 -49999710 -83347 -49999578 -105149 -49999382 -130924 -49999166 -154591 -49998916 -178069 -49998599 -203894 -49998262 -228398 -49997905 -251647 -49997466 -277451 -49997003 -302413 -49996511 -326907 -49995964 -352128 -49995393 -376671 -49994795 -...
output:
481990667522174063.0000000000 900047257776892012.8750000000 84250235108292086.0468750000 357963472278544291.7500000000 758024710210129399.3750000000 651805790712522724.3750000000 422072215223185896.7500000000 571948904059660677.3750000000 685946954834850006.7500000000 781017527404628198.5000000000 3...
result:
ok Your answer is acceptable!^ ^
Test #10:
score: 0
Accepted
time: 836ms
memory: 4104kb
input:
5000 5000 -50000000 0 -49999762 -138397 -49999461 -244153 -49999007 -349713 -49998392 -456086 -49997577 -566637 -49996632 -673023 -49995462 -784273 -49994137 -894156 -49992625 -1005080 -49990945 -1115094 -49989066 -1226720 -49987021 -1337531 -49984788 -1449227 -49982415 -1559155 -49979887 -1668061 -...
output:
259053256470500481.8750000000 472297859897907116.8750000000 271976522374482758.8750000000 930648882061706004.8750000000 110596174224097027.8750000000 385963660067947077.5000000000 441658538323309453.6250000000 259108189662189395.8750000000 379723545376251013.7500000000 43293951022380795.8750000000 2...
result:
ok Your answer is acceptable!^ ^
Extra Test:
score: 0
Extra Test Passed