QOJ.ac
QOJ
ID | Problem | Submitter | Result | Time | Memory | Language | File size | Submit time | Judge time |
---|---|---|---|---|---|---|---|---|---|
#320725 | #3858. Systematic salesman | PetroTarnavskyi# | AC ✓ | 2400ms | 36056kb | C++20 | 3.3kb | 2024-02-03 20:38:06 | 2024-02-03 20:38:08 |
Judging History
answer
#include <bits/stdc++.h>
using namespace std;
#define FOR(i, a, b) for(int i = (a); i < (b); i++)
#define RFOR(i, a, b) for(int i = (a) - 1; i >= (b); i--)
#define SZ(a) int(a.size())
#define ALL(a) a.begin(), a.end()
#define PB push_back
#define MP make_pair
#define F first
#define S second
typedef long long LL;
typedef vector<int> VI;
typedef pair<int, int> PII;
typedef double db;
const int N = 1 << 11;
const db INF = 1e47;
template<typename T>
void updMin(T& a, T b)
{
a = min(a, b);
}
db dist(const PII& a, const PII& b)
{
return hypot(b.F - a.F, b.S - a.S);
}
vector<vector<tuple<db, int, int>>> matr[N];
vector<PII> pts[N];
VI globalIndices[N];
void solve(int v, bool hor)
{
int n = SZ(pts[v]);
matr[v] = vector(n, vector<tuple<db, int, int>>(n, {INF, -1, -1}));
if (n == 1)
{
matr[v][0][0] = {0, 0, 0};
return;
}
VI sortedIndices(n);
iota(ALL(sortedIndices), 0);
sort(ALL(sortedIndices), [&](int i, int j)
{
return hor ? pts[v][i].S < pts[v][j].S : pts[v][i].F < pts[v][j].F;
});
globalIndices[v] = sortedIndices;
int szL = n / 2, szR = n - szL;
int leftV = 2 * v + 1, rightV = 2 * v + 2;
pts[leftV].resize(szL);
pts[rightV].resize(szR);
FOR(i, 0, szL)
pts[leftV][i] = pts[v][sortedIndices[i]];
FOR(i, 0, szR)
pts[rightV][i] = pts[v][sortedIndices[i + szL]];
solve(leftV, hor ^ 1);
solve(rightV, hor ^ 1);
FOR(a, 0, szL)
{
int aa = sortedIndices[a];
FOR(c, 0, szR)
{
int cc = sortedIndices[c + szL];
db minAC = INF;
int bestB = -1;
FOR(b, 0, szL)
{
int bb = sortedIndices[b];
db cur = get<0>(matr[leftV][a][b]) + dist(pts[v][bb], pts[v][cc]);
if (cur < minAC)
{
minAC = cur;
bestB = b;
}
}
FOR(d, 0, szR)
{
int dd = sortedIndices[d + szL];
db cur = minAC + get<0>(matr[rightV][c][d]);
if (cur < get<0>(matr[v][aa][dd]))
{
matr[v][aa][dd] = {cur, bestB, c};
}
}
}
}
FOR(i, 0, n)
FOR(j, 0, n)
{
auto [d, b, c] = matr[v][i][j];
updMin(matr[v][j][i], make_tuple(d, c, b));
}
}
vector<PII> answer;
void restore(int v, int a, int d)
{
int n = SZ(pts[v]);
if (SZ(pts[v]) == 1)
{
answer.PB(pts[v][0]);
return;
}
auto [dis, b, c] = matr[v][a][d];
a = find(ALL(globalIndices[v]), a) - globalIndices[v].begin();
d = find(ALL(globalIndices[v]), d) - globalIndices[v].begin();
int szL = n / 2;
assert((a < szL) ^ (d < szL));
if (a < szL)
{
restore(2 * v + 1, a, b);
restore(2 * v + 2, c, d - szL);
}
else
{
restore(2 * v + 2, a - szL, b);
restore(2 * v + 1, c, d);
}
}
int main()
{
ios::sync_with_stdio(0);
cin.tie(0);
cout << fixed << setprecision(10);
int n;
cin >> n;
pts[0].resize(n);
for (auto& [x, y] : pts[0])
cin >> x >> y;
solve(0, false);
db ans = INF;
int a = -1, d = -1;
FOR(i, 0, n)
FOR(j, 0, n)
if (get<0>(matr[0][i][j]) < ans)
{
ans = get<0>(matr[0][i][j]);
a = i;
d = j;
}
map<PII, int> mp;
FOR(i, 0, n)
mp[pts[0][i]] = i;
restore(0, a, d);
assert(SZ(answer) == n);
cout << ans << "\n";
db check = 0;
FOR(i, 0, n)
{
if (i > 0)
{
cout << " ";
check += dist(answer[i - 1], answer[i]);
}
cout << mp[answer[i]] + 1;
}
cout << "\n";
cerr << check << endl;
return 0;
}
Details
Tip: Click on the bar to expand more detailed information
Test #1:
score: 100
Accepted
time: 1ms
memory: 3976kb
input:
8 7 3 2 0 4 5 1 4 8 2 9 9 0 8 6 1
output:
26.3833257716 6 1 5 8 2 4 3 7
result:
ok correct!
Test #2:
score: 0
Accepted
time: 1ms
memory: 4064kb
input:
20 4 71 52 7 49 15 59 83 12 9 46 6 74 44 89 50 32 10 82 58 11 33 78 72 27 49 64 75 97 0 38 46 91 54 8 70 18 61 79 92
output:
374.8836811175 1 18 19 13 16 11 5 9 3 6 2 7 15 8 17 10 12 20 4 14
result:
ok correct!
Test #3:
score: 0
Accepted
time: 3ms
memory: 4344kb
input:
100 192 64 839 68 846 688 911 133 110 439 592 226 355 364 418 487 402 466 436 425 509 847 542 78 648 404 954 313 726 906 777 922 596 550 159 172 507 651 720 932 575 805 889 193 246 206 175 326 897 464 108 70 790 2 548 624 867 222 743 269 41 98 348 173 49 915 35 939 404 571 371 625 363 758 317 155 90...
output:
8491.4521602340 31 26 86 1 98 18 93 79 5 45 90 24 23 38 42 57 32 56 85 49 67 7 10 9 41 63 83 62 96 47 39 33 34 48 72 91 60 61 88 11 92 80 99 37 89 36 35 8 82 19 75 28 44 17 71 78 55 97 69 50 58 21 15 20 81 16 74 66 76 87 3 46 54 77 95 68 73 25 52 43 14 84 4 22 29 40 2 27 100 53 12 65 6 30 64 51 13 7...
result:
ok correct!
Test #4:
score: 0
Accepted
time: 280ms
memory: 12180kb
input:
500 380 190 314 738 973 705 875 517 593 638 132 681 714 411 400 589 139 353 339 771 832 883 610 170 925 431 351 96 884 683 674 817 5 386 710 99 348 173 996 812 533 453 851 10 877 142 86 361 860 168 489 50 641 766 158 118 989 745 823 559 374 971 605 158 432 307 931 863 719 635 73 341 726 906 536 372 ...
output:
22821.8889783555 65 67 29 163 378 480 3 64 441 104 396 105 301 343 476 179 223 334 30 278 4 398 157 15 281 340 379 52 78 141 377 288 266 437 129 213 20 181 500 327 234 315 285 496 448 270 34 318 143 134 433 136 307 115 62 11 409 386 202 436 390 249 122 165 482 280 462 194 402 467 37 146 432 175 487 ...
result:
ok correct!
Test #5:
score: 0
Accepted
time: 2400ms
memory: 35968kb
input:
1000 818 537 491 340 916 881 776 67 368 978 888 853 8 349 561 929 604 8 349 828 874 894 257 757 667 962 242 746 3 614 931 863 235 578 516 580 61 177 13 821 949 165 231 732 970 21 711 731 392 374 878 672 106 596 82 166 149 539 944 485 481 675 845 636 352 185 326 4 229 472 617 972 622 175 83 554 447 7...
output:
32684.7826593013 763 794 126 659 675 593 108 402 34 998 45 259 781 715 943 896 220 520 961 459 410 590 700 477 383 33 446 845 834 359 428 461 247 690 78 362 418 805 233 701 955 216 806 403 429 57 176 608 460 363 162 582 324 159 124 509 371 823 737 473 239 542 725 237 513 932 971 934 565 113 512 721 ...
result:
ok correct!
Test #6:
score: 0
Accepted
time: 2379ms
memory: 36056kb
input:
1000 94954 408313 589670 644618 101544 170845 308094 798263 871557 182716 42389 153936 777317 429523 812471 38482 979047 249000 967597 351300 982071 356744 369070 837238 661606 876392 70400 544589 460840 381840 151672 220775 539578 774105 717079 505259 241023 619236 318139 186353 39127 718711 697393...
output:
32281914.2524237335 325 372 208 79 234 190 602 359 664 336 351 480 44 875 296 19 606 76 900 126 535 309 425 941 800 938 511 324 980 485 704 898 14 512 963 524 830 643 316 583 401 612 724 559 675 411 732 331 115 388 123 746 21 876 568 834 182 82 136 58 94 874 206 949 804 787 109 478 229 197 97 911 59...
result:
ok correct!
Test #7:
score: 0
Accepted
time: 1695ms
memory: 35920kb
input:
1000 1097 1097 1661 1661 1121 1121 1377 1377 1541 1541 1907 1907 1796 1796 1547 1547 1376 1376 1992 1992 1317 1317 1762 1762 1561 1561 1794 1794 1874 1874 1577 1577 1688 1688 1650 1650 1460 1460 1062 1062 1247 1247 1596 1596 1996 1996 1146 1146 1452 1452 1190 1190 1839 1839 1799 1799 1346 1346 1889 ...
output:
1412.7993488107 138 146 382 23 755 773 788 10 596 576 318 305 551 825 40 220 941 838 225 691 149 290 371 346 854 58 258 271 411 871 534 265 157 151 720 65 858 376 975 161 741 673 54 634 434 262 400 569 59 126 757 456 514 260 712 283 944 958 875 663 86 342 356 946 452 474 824 114 219 850 409 747 839 ...
result:
ok correct!
Test #8:
score: 0
Accepted
time: 1702ms
memory: 35944kb
input:
1000 1640 360 1469 531 1967 33 1800 200 1807 193 1265 735 1178 822 1747 253 1327 673 1164 836 1188 812 1623 377 1684 316 1806 194 1577 423 1915 85 1380 620 1033 967 1510 490 1213 787 1363 637 1751 249 1944 56 1252 748 1044 956 1158 842 1484 516 1242 758 1991 9 1212 788 1446 554 1576 424 1683 317 127...
output:
1412.7993488107 414 749 122 507 128 855 558 576 29 517 876 958 721 69 487 61 363 719 351 834 190 957 992 87 418 150 851 873 385 376 36 954 3 449 527 492 817 138 202 237 273 597 63 809 726 662 783 886 619 635 524 935 880 901 952 23 500 807 164 763 405 106 286 861 357 555 355 365 521 767 944 928 995 4...
result:
ok correct!
Test #9:
score: 0
Accepted
time: 1707ms
memory: 36056kb
input:
1000 921 1079 860 860 815 1185 821 1179 50 50 311 1689 244 244 788 788 508 508 934 934 845 1155 584 584 170 170 589 1411 605 1395 88 88 439 1561 593 1407 842 842 647 1353 64 64 93 1907 930 930 730 730 328 328 151 1849 354 354 599 1401 849 1151 457 1543 808 808 469 1531 119 1881 604 604 130 130 305 1...
output:
4400.5995467104 660 512 580 247 427 664 557 518 905 720 311 208 793 652 43 817 538 834 293 937 285 928 476 144 945 974 849 493 674 382 300 124 108 931 626 387 506 741 348 936 194 308 717 276 14 400 18 611 635 28 699 333 15 546 565 82 363 211 804 478 698 473 973 657 112 633 895 288 923 926 370 179 78...
result:
ok correct!
Test #10:
score: 0
Accepted
time: 1673ms
memory: 36000kb
input:
1000 208821 93534 971563 333783 973615 339722 964813 684252 218789 913425 751635 932065 816127 887381 657687 25516 515910 253 381949 14136 648326 977493 348288 976428 993310 581520 284456 48845 42 493513 828139 877260 6188 421581 118647 823372 989248 603131 927245 240266 459001 998316 434015 995627 ...
output:
3138446.5260464726 748 755 333 379 358 314 869 440 304 498 898 343 227 414 352 425 899 622 246 648 378 984 577 994 815 585 353 507 412 624 417 884 348 893 282 291 983 730 373 606 210 337 382 476 836 496 53 11 688 796 182 264 625 870 519 997 555 465 84 617 167 248 265 940 750 663 903 260 190 326 583 ...
result:
ok correct!