QOJ.ac
QOJ
ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#187504 | #3858. Systematic salesman | wind_whisper# | AC ✓ | 31ms | 73636kb | C++14 | 4.9kb | 2023-09-24 17:52:14 | 2023-09-24 17:52:15 |
Judging History
answer
#include <stdio.h>
#include <math.h>
#include <algorithm>
#include <utility>
#include <vector>
#include <queue>
using namespace std;
#define MN 600010
#define MM 3000010
int X[1010],Y[1010];double di[1010][1010];
double dis(int a,int b)
{
return sqrt(1ll*a*a+1ll*b*b);
}
struct lin
{
int x,y,i;
void sw(){int t=x;x=y;y=t;}
}sz[1010];
bool operator<(const lin&a,const lin&b)
{
return a.x<b.x;
}
int cal(int n)
{
if(n==1)return 1;
int a=n/2,b=n-a;
return 2*(cal(a)+cal(b))+a*b+a+b;
}
int fr[MN],ne[MM],v[MM],bs=0,N;double w[MM];
void addb(int a,int b,double c)
{
//printf("(%d %d %.2lf)\n",a,b,c);
v[bs]=b;
w[bs]=c;
ne[bs]=fr[a];
fr[a]=bs++;
}
int wz[MN];vector<pair<int,int> > v3,v4;
int dy[MN];
void dfs(int l,int r,vector<pair<int,int> >&v1,vector<pair<int,int> >&v2,vector<int>&nd)
{
sort(sz+l,sz+r+1);
if(l==r)
{
int i=sz[l].i;fr[++N]=-1;
v1.push_back(make_pair(i,N));
v2.push_back(make_pair(i,N));
nd.push_back(N);dy[N]=i+1;
return;
}
if(l+1==r)
{
int i=sz[l].i,j=sz[l+1].i;
fr[++N]=-1;fr[++N]=-1;
v1.push_back(make_pair(i,N-1));
v2.push_back(make_pair(j,N));
nd.push_back(N);
nd.push_back(N-1);
addb(N-1,N,di[i][j]);
dy[N-1]=i+1;dy[N]=j+1;
return;
}
int m=(l+r+1)>>1;
for(int i=l;i<=r;i++)sz[i].sw();
vector<pair<int,int> > a,b,c,d;
vector<int> nl,nr;
dfs(l,m-1,a,b,nl);dfs(m,r,c,d,nr);
int s=nl.size();
for(int i=1;i<=s;i++)fr[N+i]=-1,wz[nl[i-1]]=i,dy[N+i]=dy[nl[i-1]];
for(int i=1;i<=s;i++)
{
int u=nl[i-1];
for(int j=fr[u];j!=-1;j=ne[j])
addb(N+wz[v[j]],N+i,w[j]);
}
for(auto t:a)v1.push_back(t);
for(auto t:b)v1.push_back(make_pair(t.first,N+wz[t.second]));
v3.clear();
for(auto t:b)v3.push_back(t);
for(auto t:a)v3.push_back(make_pair(t.first,N+wz[t.second]));
for(int t:nl)nd.push_back(t);
for(int i=1;i<=s;i++)nd.push_back(N+i);
N+=s;s=nr.size();
for(int i=1;i<=s;i++)fr[N+i]=-1,wz[nr[i-1]]=i,dy[N+i]=dy[nr[i-1]];
for(int i=1;i<=s;i++)
{
int u=nr[i-1];
for(int j=fr[u];j!=-1;j=ne[j])
addb(N+wz[v[j]],N+i,w[j]);
}
for(auto t:d)v2.push_back(t);
for(auto t:c)v2.push_back(make_pair(t.first,N+wz[t.second]));
v4.clear();
for(auto t:c)v4.push_back(t);
for(auto t:d)v4.push_back(make_pair(t.first,N+wz[t.second]));
for(int t:nr)nd.push_back(t);
for(int i=1;i<=s;i++)nd.push_back(N+i);
N+=s;
int s1=v1.size(),s2=v2.size();
/*for(int i=1;i<=s1+s2;i++)fr[N+i]=-1;
for(int i=1;i<=s1;i++)
addb(v3[i-1].second,N+i,0);
for(int i=1;i<=s2;i++)
addb(N+s1+i,v4[i-1].second,0);*/
for(int i=1;i<=s1;i++)
{
for(int j=1;j<=s2;j++)
{
auto tl=v3[i-1],tr=v4[j-1];
double c=di[tl.first][tr.first];
addb(tl.second,tr.second,c);
}
}
//for(int i=1;i<=s1+s2;i++)nd.push_back(N+i);
//N+=s1+s2;
}
bool bk[MN];double jl[MN];int S,T;
double dij()
{
for(int i=1;i<=N;i++)bk[i]=0,jl[i]=1e100;
typedef pair<double,int> Pr;
priority_queue<Pr,vector<Pr>,greater<Pr> >pq;
pq.push(make_pair(0,S));jl[S]=0;
while(pq.size())
{
auto t=pq.top();pq.pop();
int u=t.second;
if(u==T)return jl[u];
if(bk[u])continue;
bk[u]=1;
for(int i=fr[u];i!=-1;i=ne[i])
{
double s=jl[u]+w[i];
if(s<jl[v[i]])
{
jl[v[i]]=s;
pq.push(make_pair(s,v[i]));
}
}
}
return -1;
}
int la[MN];
double dfs(int u)
{
//printf("u=%d\n",u);
if(u==T)return 0;
if(bk[u])return jl[u];
double mi=1e100;
for(int i=fr[u];i!=-1;i=ne[i])
{
double t=w[i]+dfs(v[i]);
if(t<mi)mi=t,la[u]=v[i];
}
bk[u]=1;
return jl[u]=mi;
}
int main()
{
//printf("%d",cal(2));
int n;
scanf("%d",&n);
//for(int i=1;i<=100;i++)fr[i]=-1;
for(int i=0;i<n;i++)
{
//X[i]=i;Y[i]=i;
scanf("%d%d",&X[i],&Y[i]);
sz[i].x=X[i];sz[i].y=Y[i];sz[i].i=i;
}
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
di[i][j]=dis(X[i]-X[j],Y[i]-Y[j]);
vector<pair<int,int> >v1,v2;vector<int> nd;
dfs(0,n-1,v1,v2,nd);
S=N+1;T=N+2;fr[S]=fr[T]=-1;N+=2;
for(auto t:v1)addb(S,t.second,0);
for(auto t:v2)addb(t.second,T,0);
//printf("N=%d bs=%d\n",N,bs);
//double ans=dij();
double ans=dfs(S);
printf("%.10lf\n",ans);
int u=S;
while(u!=T)
{
int t=dy[u];
if(t)printf("%d ",t);
u=la[u];
//printf("u=%d\n",u);
}
//printf("[%d]",n);
//for(int i=1;i<=N;i++)printf("[%d]\n",fr[i]);
return 0;
}
详细
Test #1:
score: 100
Accepted
time: 0ms
memory: 18084kb
input:
8 7 3 2 0 4 5 1 4 8 2 9 9 0 8 6 1
output:
26.3833257716 7 3 4 2 8 5 1 6
result:
ok correct!
Test #2:
score: 0
Accepted
time: 0ms
memory: 18144kb
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: 0ms
memory: 20484kb
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: 4ms
memory: 35848kb
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 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 328 31...
result:
ok correct!
Test #5:
score: 0
Accepted
time: 27ms
memory: 72552kb
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: 16ms
memory: 72100kb
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.2524237186 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: 31ms
memory: 72708kb
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 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 631 1...
result:
ok correct!
Test #8:
score: 0
Accepted
time: 30ms
memory: 72880kb
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 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 403 51...
result:
ok correct!
Test #9:
score: 0
Accepted
time: 27ms
memory: 72448kb
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.5995467103 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 852 12...
result:
ok correct!
Test #10:
score: 0
Accepted
time: 25ms
memory: 73636kb
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 781 967 502 321 948 996 795 89 986 74 651 258 739 21 112 966 386 109 978 484 238 22 811 976 249 584 591 844 222 516 173 43 964 742 773 40 692 306 60 995 363 294 204 79 106 462 305 548 977 12 115 633 992 743 961 364 272 830 593 635 365 694 201 325 216 148 237 946 377 472 103 271 57...
result:
ok correct!