QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#595152#7184. Transport Plusesxuanbac05TL 1ms4384kbC++174.0kb2024-09-28 12:44:152024-09-28 12:44:15

Judging History

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

  • [2024-09-28 12:44:15]
  • 评测
  • 测评结果:TL
  • 用时:1ms
  • 内存:4384kb
  • [2024-09-28 12:44:15]
  • 提交

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 sqrt(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));
    cout << sz(path) << endl;
    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;
}

详细

Test #1:

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

input:

1 2
1 1
5 3
6 2

output:

4.000000
3
0 1 2
1 5 2
0 5 3

result:

ok correct

Test #2:

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

input:

2 1
1 1
6 1
1 3
6 3

output:

2.000000
2
1 0 3
2 6 1

result:

ok correct

Test #3:

score: 0
Accepted
time: 0ms
memory: 4048kb

input:

0 0
1 1
1 1

output:

0.000000
0

result:

ok correct

Test #4:

score: 0
Accepted
time: 0ms
memory: 4076kb

input:

0 0
100 100
0 0

output:

141.421356
1
0 0 0

result:

ok correct

Test #5:

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

input:

1 0
100 100
0 0
100 100

output:

100.000000
2
1 0 100
0 0 0

result:

ok correct

Test #6:

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

input:

1 0
100 100
0 0
100 0

output:

0.000000
1
1 0 0

result:

ok correct

Test #7:

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

input:

1 0
100 100
0 0
0 100

output:

0.000000
1
1 0 0

result:

ok correct

Test #8:

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

input:

1 100
50 50
0 0
50 50

output:

70.710678
1
0 0 0

result:

ok correct

Test #9:

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

input:

1 100
50 50
0 0
0 50

output:

70.710678
1
0 0 0

result:

ok correct

Test #10:

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

input:

1 100
50 50
0 0
51 51

output:

70.710678
1
0 0 0

result:

ok correct

Test #11:

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

input:

1 100
50 50
0 0
2 53

output:

70.710678
1
0 0 0

result:

ok correct

Test #12:

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

input:

1 100
0 0
100 100
50 50

output:

141.421356
1
0 100 100

result:

ok correct

Test #13:

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

input:

1 33
0 0
100 100
50 50

output:

133.000000
3
0 0 50
1 50 100
0 100 100

result:

ok correct

Test #14:

score: -100
Time Limit Exceeded

input:

1 12
100 0
11 90
0 100

output:


result: