QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#213735#3858. Systematic salesmanrealIyxiangAC ✓685ms28912kbC++143.0kb2023-10-14 15:50:202023-10-14 15:50:21

Judging History

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

  • [2023-10-14 15:50:21]
  • 评测
  • 测评结果:AC
  • 用时:685ms
  • 内存:28912kb
  • [2023-10-14 15:50:20]
  • 提交

answer

#include <bits/stdc++.h>

#define eb emplace_back
#define ep emplace
#define fi first
#define se second
#define in read<int>()
#define lin read<ll>()
#define rep(i, x, y) for(int i = (x); i <= (y); i++)
#define per(i, x, y) for(int i = (x); i >= (y); i--)

using namespace std;

using ll = long long;
using db = double;
using pii = pair < int, int >;
using vec = vector < int >;
using veg = vector < pii >;

template < typename T > T read() {
	T x = 0; bool f = 0; char ch = getchar();
	while(!isdigit(ch)) f |= ch == '-', ch = getchar();
	while(isdigit(ch)) x = x * 10 + (ch ^ 48), ch = getchar();
	return f ? -x : x;
}

template < typename T > void chkmax(T &x, const T &y) { x = x > y ? x : y; }
template < typename T > void chkmin(T &x, const T &y) { x = x < y ? x : y; }

const int N = 1010;

int n;
int x[N], y[N], p[N];

db sq(db x) { return x * x; }
db d(int a, int b) { return sqrt(sq(x[a] - x[b]) + sq(y[a] - y[b])); }

db f[N][N], g[N][N];
bool usd[N][N];
int pf[N][N], pg[N][N];

void upd(db &x, int &cho, db ret, int v) {
	if(ret < x) x = ret, cho = v;
}

vec build(int x, int y, int fl = 0) {
	if(x == y) return f[p[x]][p[x]] = 0, vec{p[x]};
	vec lpot, rpot;
	if(fl == 1) {
		sort(p + x, p + y + 1, [&](int a, int b) { return ::y[a] < ::y[b]; });
		int mid = x + y - 1 >> 1; lpot = build(x, mid, fl ^ 1), rpot = build(mid + 1, y, fl ^ 1);
	} else {
		sort(p + x, p + y + 1, [&](int a, int b) { return ::x[a] < ::x[b]; });
		int mid = x + y - 1 >> 1; lpot = build(x, mid, fl ^ 1), rpot = build(mid + 1, y, fl ^ 1);
	}
	for(auto x : lpot) for(auto y : lpot) if(!usd[x][y]) {
				for(auto z : rpot) upd(g[x][z], pg[x][z], f[x][y] + d(y, z), y);
			}
	for(auto x : rpot) for(auto y : rpot) if(!usd[x][y]) {
				for(auto z : lpot) upd(g[x][z], pg[x][z], f[x][y] + d(y, z), y);
			}
	for(auto x : lpot) for(auto y : rpot) for(auto z : rpot) if(!usd[y][z]) {
					upd(f[x][y], pf[x][y], g[x][z] + f[z][y], z);
				}
	for(auto x : rpot) for(auto y : lpot) for(auto z : lpot) if(!usd[y][z]) {
					upd(f[x][y], pf[x][y], g[x][z] + f[z][y], z);
				}
	/*
	for(auto x : lpot)
		for(auto y : lpot) if(!usd[x][y])
							   for(auto z : rpot)
								   for(auto t : rpot) if(!usd[z][t])
														  chkmin(f[x][t], f[x][y] + f[z][t] + d(y, z));
	*/
	for(auto x : lpot) for(auto y : lpot) usd[x][y] = true;
	for(auto x : rpot) for(auto y : rpot) usd[x][y] = true;
	for(auto v : rpot) lpot.eb(v);
	return lpot;
}

void calc(int x, int y) {
	if(x == y) return printf("%d ", x), void();
	int b = pf[x][y], a = pg[x][b];
	calc(x, a), calc(b, y);
}

void solve() {
	n = in; rep(i, 1, n) x[i] = in, y[i] = in, p[i] = i;
	rep(i, 1, n) rep(j, 1, n) f[i][j] = g[i][j] = 1e18; build(1, n);
	db ans = 1e18; pii ret;
	rep(i, 1, n) rep(j, 1, n) if(!usd[i][j]) if(f[i][j] < ans) ans = f[i][j], ret = { i, j };
	printf("%.10lf\n", ans);
	calc(ret.fi, ret.se);
}

int main() {
#ifdef YJR_2333_TEST
	freopen("1.in", "r", stdin);
#endif
	for(int T = 1; T; T--) solve();
	return 0;
}

详细

Test #1:

score: 100
Accepted
time: 0ms
memory: 10132kb

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: 10112kb

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
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: 2ms
memory: 10484kb

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: 67ms
memory: 24060kb

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: 672ms
memory: 28604kb

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
915 327 292 156 727 752 92 917 577 264 965 899 484 902 831 648 44 562 708 797 869 271 508 949 762 146 453 837 253 115 369 620 822 208 551 773 419 236 260 880 395 860 885 312 599 789 431 756 958 130 166 405 348 598 226 86 257 592 154 135 279 103 334 922 302 765 646 758 337 889 416 71...

result:

ok correct!

Test #6:

score: 0
Accepted
time: 669ms
memory: 28832kb

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: 676ms
memory: 28912kb

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: 685ms
memory: 28828kb

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: 671ms
memory: 28552kb

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: 660ms
memory: 28736kb

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!