QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#595138#7184. Transport Plusesxuanbac05WA 0ms4176kbC++174.0kb2024-09-28 12:41:372024-09-28 12:41:38

Judging History

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

  • [2024-09-28 12:41:38]
  • 评测
  • 测评结果:WA
  • 用时:0ms
  • 内存:4176kb
  • [2024-09-28 12:41:37]
  • 提交

answer

#include <bits/stdc++.h>
#define ll long long
#define fi first
#define se second
#define endl '\n'
#define MASK(i) (1LL << (i))
#define ull unsigned long long
#define ld long double
#define pb push_back
#define all(x) (x).begin() , (x).end()
#define BIT(x , i) ((x >> (i)) & 1)
#define TASK "task"
#define sz(s) (int) (s).size()
 
using namespace std;
const int mxN = 207;
const int inf = 1e9 + 277;
const int mod = 1e9 + 7;
const ll infll = 1e18 + 7;
const int base = 307;
const int LOG = 20;
 
template <typename T1, typename T2> bool minimize(T1 &a, T2 b) {
    if (a > b) {a = b; return true;} return false;
}
template <typename T1, typename T2> bool maximize(T1 &a, T2 b) {
    if (a < b) {a = b; return true;} return false;
}

struct Trace{
    int id, x, y;
};

int n, t;
pair<int, int> sta;
pair<int, int> fin;
pair<int, int> a[mxN];
double dist[mxN][mxN];
Trace trace[mxN][mxN];


double getDist(pair<int, int> u, pair<int, int> v) {
    return 1LL * (u.fi - v.fi) * (u.fi - v.fi) + 1LL * (u.se - v.se) * (u.se - v.se);
}
 
void solve()
{
    cin >> n >> t;
    cin >> sta.fi >> sta.se >> fin.fi >> fin.se;
    for (int i = 1; i <= n; i++) {
        cin >> a[i].fi >> a[i].se;
    }

    for (int i = 0; i <= 100; i++)
    for (int j = 0; j <= 100; j++) dist[i][j] = (double) inf;

    priority_queue<pair<double, pair<int, int>>, vector<pair<double, pair<int, int>>>, greater<pair<double, pair<int, int>>>> pq;
    dist[sta.fi][sta.se] = 0;
    pq.push(make_pair(dist[sta.fi][sta.se], make_pair(sta.fi, sta.se)));
    while(!pq.empty()) {
        double val = pq.top().fi;
        pair<int, int> u = pq.top().se;
        pq.pop();
        if (abs(val - dist[u.fi][u.se]) > 1e-3) continue;

        for(int i = 1; i <= n; i++) {
            if(minimize(dist[a[i].fi][a[i].se], val + getDist(u, a[i]))) {
                trace[a[i].fi][a[i].se] = {0, u.fi, u.se};
                pq.push(make_pair(dist[a[i].fi][a[i].se], make_pair(a[i].fi, a[i].se)));
            }
            if(minimize(dist[a[i].fi][u.se], val + getDist(u, make_pair(a[i].fi, u.se)))) {
                trace[a[i].fi][u.se] = {0, a[i].fi, a[i].se};
                pq.push(make_pair(dist[a[i].fi][u.se], make_pair(a[i].fi, u.se)));
            }
            if(minimize(dist[u.fi][a[i].se], val + getDist(u, make_pair(u.fi, a[i].se)))) {
                trace[u.fi][a[i].se] = {0, u.fi, u.se};
                pq.push(make_pair(dist[u.fi][a[i].se], make_pair(u.fi, a[i].se)));
            }
            if(u.fi == a[i].fi || u.se == a[i].se) {
                for (int x = 0; x <= 100; x++) {
                    if(minimize(dist[x][a[i].se], val + t)) {
                        trace[x][a[i].se] = {i, u.fi, u.se};
                        pq.push(make_pair(dist[x][a[i].se], make_pair(x, a[i].se)));
                    }
                    if(minimize(dist[a[i].fi][x], val + t)) {
                        trace[a[i].fi][x] = {i, u.fi, u.se};
                        pq.push(make_pair(dist[a[i].fi][x], make_pair(a[i].fi, x)));
                    }
                }
            }
        }

        if(minimize(dist[fin.fi][fin.se], val + getDist(u, fin))) {
            trace[fin.fi][fin.se] = {0, u.fi, u.se};
            pq.push(make_pair(dist[fin.fi][fin.se], make_pair(fin.fi, fin.se)));
        }
        
    }

    cout << fixed << setprecision(6) << dist[fin.fi][fin.se] << endl;
    int x = fin.fi, y = fin.se;
    vector<Trace> path;
    while(x != sta.fi || y != sta.se) {
        path.pb({trace[x][y].id, x, y});
        int xx = trace[x][y].x;
        int yy = trace[x][y].y;
        x = xx;
        y = yy;
    }
    reverse(all(path));
    for(auto it : path) cout << it.id << ' ' << it.x << ' ' << it.y << endl;
}
 
int main()
{
    ios_base::sync_with_stdio(false);
    cin.tie(nullptr);
    // freopen(TASK".inp" , "r" , stdin);
    // freopen(TASK".out" , "w" , stdout);
 
    int tc = 1;
    //cin >> tc;
    while(tc--) {
        solve();
    }
    return 0;
}

Details

Tip: Click on the bar to expand more detailed information

Test #1:

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

input:

1 2
1 1
5 3
6 2

output:

4.000000
0 1 2
1 5 2
0 5 3

result:

wrong answer arrived at (1.000000, 1.000000) instead of (5.000000, 3.000000)