QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#324248#3858. Systematic salesmanOrezTsimWA 0ms12068kbC++202.5kb2024-02-10 17:22:422024-02-10 17:22:42

Judging History

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

  • [2024-02-10 17:22:42]
  • 评测
  • 测评结果:WA
  • 用时:0ms
  • 内存:12068kb
  • [2024-02-10 17:22:42]
  • 提交

answer

#include<bits/stdc++.h>
#define int long long
using namespace std;

const int N=1010,M=N<<5,inf=1e18;
int n,m,typ;

struct Node {
    int x,y,id;
    friend bool operator <(const Node &fi,const Node &se) {
        if(!typ) return fi.x<se.x;
        return fi.y<se.y;
    }
} a[N];

double f[N][N],dp[N][N],dis[N][N];
int fc[N][N],dpc[N][N];

auto sq(int x) -> int { return x*x; }
void solve(int l,int r) {
    if(l==r) return; int mid=(l+r-1)>>1;
    nth_element(a+l,a+mid,a+r+1);
    typ^=1,solve(l,mid),solve(mid+1,r),typ^=1;
    for(int i=l;i<=mid;++i)
        for(int j=mid+1;j<=r;++j)
            dis[i][j]=sqrt(sq(a[i].x-a[j].x)+sq(a[i].y-a[j].y));
    for(int i=l;i<=mid;++i)
        for(int j=mid+1;j<=r;++j)
            f[i][j]=dp[i][j]=inf;
    if(l<mid) {
        int nxt=(l+mid-1)>>1;
        for(int i=l;i<=nxt;++i)
            for(int j=nxt+1;j<=mid;++j)
                for(int k=mid+1;k<=r;++k) {
                    double val=dp[i][j]+dis[j][k];
                    if(f[i][k]>val) f[i][k]=val,fc[i][k]=j;
                    val=dp[i][j]+dis[i][k];
                    if(f[j][k]>val) f[j][k]=val,fc[j][k]=i;
                }
    } else for(int j=mid+1;j<=r;++j)
        f[l][j]=dis[l][j],fc[l][j]=l;
    if(mid+1<r) {
        int nxt=(mid+r)>>1;
        for(int i=l;i<=mid;++i)
            for(int j=mid+1;j<=nxt;++j)
                for(int k=nxt+1;k<=r;++k) {
                    double val=dp[j][k]+f[i][j];
                    if(dp[i][k]>val) dp[i][k]=val,dpc[i][k]=j;
                    val=dp[j][k]+f[i][k];
                    if(dp[i][j]>val) dp[i][j]=val,dpc[i][j]=i;
                }
    } else for(int i=l;i<=mid;++i)
        dp[i][r]=dis[i][r],dpc[i][r]=r;
}

auto pr(int l,int r,int x,int y) -> vector<int> {
    if(l==r) return {a[l].id};
    bool ok=(x>y); if(ok) swap(x,y);
    int mid=(l+r-1)>>1;
    int fir=dpc[x][y],sec=fc[x][fir];
    vector<int>res=pr(l,mid,x,sec);
    for(auto it: pr(mid+1,r,fir,y)) res.push_back(it);
    if(ok) reverse(res.begin(),res.end());
    return res;
}

auto main() -> signed {
    ios::sync_with_stdio(false);
    cin.tie(0),cout.tie(0);
    cin>>n;
    for(int i=1;i<=n;++i)
        cin>>a[i].x>>a[i].y,a[i].id=i;
    if(n==1) return cout<<"0.0000\n1",0;
    solve(1,n); int x=1,y=n,mid=n>>1;
    for(int i=1;i<=mid;++i)
        for(int j=mid+1;j<=n;++j)
            if(dp[i][j]<dp[x][y]) x=i,y=j;
    cout<<fixed<<setprecision(10)<<dp[x][y]<<"\n";
    for(auto it: pr(1,n,x,y)) cout<<it<<' ';
    return 0;
}

详细

Test #1:

score: 0
Wrong Answer
time: 0ms
memory: 12068kb

input:

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

output:

26.3833257716
3 7 4 2 8 5 1 6 

result:

wrong answer you reported 26.383325772 but the real length of your path is 27.344153737