QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#346785#3858. Systematic salesmanKirill22#AC ✓294ms4236kbC++234.6kb2024-03-08 23:26:152024-03-08 23:26:16

Judging History

你现在查看的是最新测评结果

  • [2024-03-08 23:26:16]
  • 评测
  • 测评结果:AC
  • 用时:294ms
  • 内存:4236kb
  • [2024-03-08 23:26:15]
  • 提交

answer

#include "bits/stdc++.h"

using namespace std;

#define ld long double

long double kek(const pair<int, int>& x, const pair<int, int>& y) {
    return sqrtl((long double) (x.first - y.first) * 1ll * (x.first - y.first) +
                 (x.second - y.second) * 1ll * (x.second - y.second));
}

bool equal(long double x, long double y) {
    return abs(x - y) < 1e-9;
}

vector<ld> solve(vector<pair<int, int>> a, vector<ld> dp) {
    const int n = (int) a.size();
    if (n == 1) {
        return dp;
    }
    map<pair<int, int>, int> id;
    for (int i = 0; i < n; i++) {
        id[a[i]] = i;
    }
    std::sort(a.begin(), a.end());
    const int m = n / 2;
    vector<pair<int, int>> L, R;
    vector<ld> dpl, dpr;
    for (int i = 0; i < n; i++) {
        (i < m ? L : R).push_back({a[i].second, a[i].first});
        (i < m ? dpl : dpr).push_back(dp[id[a[i]]]);
    }
    vector<ld> res(n);
    {
        auto resl = solve(L, dpl);
        vector<ld> dpr2(dpr.size(), 1e18);
        for (int i = m; i < n; i++) {
            for (int j = 0; j < m; j++) {
                dpr2[i - m] = min(dpr2[i - m], resl[j] + kek(a[i], a[j]));
            }
        }
        auto resr = solve(R, dpr2);
        for (int i = m; i < n; i++) {
            res[i] = resr[i - m];
        }
    }
    {
        auto resr = solve(R, dpr);
        vector<ld> dpr2(dpl.size(), 1e18);
        for (int i = m; i < n; i++) {
            for (int j = 0; j < m; j++) {
                dpr2[j] = min(dpr2[j], resr[i - m] + kek(a[i], a[j]));
            }
        }
        auto resl = solve(L, dpr2);
        for (int i = 0; i < m; i++) {
            res[i] = resl[i];
        }
    }
    vector<ld> result = res;
    for (int i = 0; i < n; i++) {
        result[id[a[i]]] = res[i];
    }
    return result;
}

vector<int> restore(vector<pair<int, int>> a, vector<ld> dp, int mx) {
    const int n = (int) a.size();
    if (n == 1) {
        return vector<int>{0};
    }
    map<pair<int, int>, int> id;
    for (int i = 0; i < n; i++) {
        id[a[i]] = i;
    }
    auto p = a[mx];
    std::sort(a.begin(), a.end());
    for (int i = 0; i < n; i++) {
        if (a[i] == p) {
            mx = i;
        }
    }
    const int m = n / 2;
    vector<pair<int, int>> L, R;
    vector<ld> dpl, dpr;
    for (int i = 0; i < n; i++) {
        (i < m ? L : R).push_back({a[i].second, a[i].first});
        (i < m ? dpl : dpr).push_back(dp[id[a[i]]]);
    }
    if (mx >= m) {
        auto resl = solve(L, dpl);
        vector<ld> dpr2(dpr.size(), 1e18);
        for (int i = m; i < n; i++) {
            for (int j = 0; j < m; j++) {
                dpr2[i - m] = min(dpr2[i - m], resl[j] + kek(a[i], a[j]));
            }
        }
        auto resr = restore(R, dpr2, mx - m);
        for (auto& x : resr) {
            x += m;
        }
        for (int j = 0; j < m; j++) {
            if (equal(resl[j] + kek(a[resr.back()], a[j]), dpr2[resr.back() - m])) {
                auto resl = restore(L, dpl, j);
                for (auto x : resl) {
                    resr.push_back(x);
                }
                for (auto& x : resr) {
                    x = id[a[x]];
                }
                return resr;
            }
        }
        assert(false);
    } else {
        auto resr = solve(R, dpr);
        vector<ld> dpr2(dpl.size(), 1e18);
        for (int i = m; i < n; i++) {
            for (int j = 0; j < m; j++) {
                dpr2[j] = min(dpr2[j], resr[i - m] + kek(a[i], a[j]));
            }
        }
        auto resl = restore(L, dpr2, mx);
        for (int j = m; j < n; j++) {
            if (equal(resr[j - m] + kek(a[resl.back()], a[j]), dpr2[resl.back()])) {
                auto resr = restore(R, dpr, j - m);
                for (auto x : resr) {
                    resl.push_back(x + m);
                }
                for (auto& x : resl) {
                    x = id[a[x]];
                }
                return resl;
            }
        }
        assert(false);
    }
}

int main() {
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
    int n;
    cin >> n;
    vector<pair<int, int>> a(n);
    for (int i = 0; i < n; i++) {
        cin >> a[i].first >> a[i].second;
    }
    vector<ld> dp(n, 0);
    auto ans = solve(a, dp);
    int pos = min_element(ans.begin(), ans.end()) - ans.begin();
    cout << fixed << setprecision(15) << ans[pos] << '\n';
    auto result = restore(a, dp, pos);
    reverse(result.begin(), result.end());
    for (auto x : result) {
        cout << x + 1 << " ";
    }
    cout << '\n';
}

Details

Tip: Click on the bar to expand more detailed information

Test #1:

score: 100
Accepted
time: 1ms
memory: 3816kb

input:

8
7 3
2 0
4 5
1 4
8 2
9 9
0 8
6 1

output:

26.383325771613344
7 3 4 2 8 5 1 6 

result:

ok correct!

Test #2:

score: 0
Accepted
time: 1ms
memory: 3812kb

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.883681117479741
14 4 20 12 10 17 8 15 7 2 6 3 9 5 11 16 13 19 18 1 

result:

ok correct!

Test #3:

score: 0
Accepted
time: 4ms
memory: 3904kb

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.452160233976989
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...

result:

ok correct!

Test #4:

score: 0
Accepted
time: 74ms
memory: 4040kb

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.888978355533935
268 48 322 189 168 140 264 178 400 430 112 8 162 407 355 111 329 269 472 242 123 195 102 361 311 478 245 413 491 452 261 434 397 460 151 344 485 240 193 489 218 391 464 97 342 494 145 31 373 190 471 403 169 251 385 422 382 395 10 50 155 2 461 60 199 126 236 91 401 276 324 222 3...

result:

ok correct!

Test #5:

score: 0
Accepted
time: 294ms
memory: 4216kb

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.782659301325133
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...

result:

ok correct!

Test #6:

score: 0
Accepted
time: 293ms
memory: 4212kb

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.252423732365060
996 161 990 503 22 836 748 567 420 209 837 955 702 689 571 338 255 882 72 285 915 632 232 656 910 814 373 819 201 178 549 98 850 776 429 487 299 878 623 779 323 514 124 107 376 2 80 513 591 381 844 189 659 508 252 706 442 998 62 344 17 709 211 932 77 392 968 34 515 195 473 4...

result:

ok correct!

Test #7:

score: 0
Accepted
time: 277ms
memory: 4236kb

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.799348810721947
139 910 204 440 142 764 831 963 668 37 769 289 830 606 781 787 561 613 554 343 426 658 451 92 408 433 821 423 689 862 496 914 949 223 398 771 125 840 150 835 331 542 587 999 843 974 841 470 42 118 527 194 836 205 106 962 187 279 869 652 249 567 20 241 893 513 383 50 352 135 964 ...

result:

ok correct!

Test #8:

score: 0
Accepted
time: 274ms
memory: 4144kb

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.799348810721947
691 968 983 575 70 748 324 137 934 588 993 560 379 512 474 885 81 333 54 966 574 874 720 341 609 823 501 174 144 918 441 185 577 18 618 816 158 917 323 724 234 537 854 728 25 791 491 308 278 253 42 374 847 650 152 923 462 985 315 378 822 295 614 108 203 371 205 989 110 243 898 4...

result:

ok correct!

Test #9:

score: 0
Accepted
time: 274ms
memory: 4168kb

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.599546710362931
899 658 474 908 175 260 295 425 44 229 693 839 599 832 418 822 630 136 366 528 868 877 670 130 536 477 95 572 845 856 485 57 369 511 514 867 616 278 163 551 609 595 844 137 621 190 22 283 749 767 970 761 659 526 890 774 891 483 225 33 241 677 261 758 618 802 110 59 797 950 530 8...

result:

ok correct!

Test #10:

score: 0
Accepted
time: 269ms
memory: 4204kb

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.526046471876271
960 570 289 296 881 394 30 652 998 345 788 759 500 554 138 446 174 180 133 980 698 49 969 263 350 820 526 419 184 62 332 877 989 938 221 784 477 10 932 826 728 875 845 101 818 154 880 566 993 985 273 335 563 708 921 809 724 395 833 226 194 896 988 751 317 662 63 909 765 102 1...

result:

ok correct!