Submission #946116

# Submission time Handle Problem Language Result Execution time Memory
946116 2024-03-14T10:33:31 Z AverageAmogusEnjoyer Robot (JOI21_ho_t4) C++17
24 / 100
1135 ms 150488 KB
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
template<class T> bool cmin(T &i, T j) { return i > j ? i=j,true:false; }
template<class T> bool cmax(T &i, T j) { return i < j ? i=j,true:false; }

int main() {
    ios_base::sync_with_stdio(false);
    cin.tie(nullptr);
    int n, m;
    cin >> n >> m;
    int tot_nodes = 0;
    vector<map<int,vector<pair<int,int>>>> g_adj(n);
    for (int i=0,u,v,c,w;i<m;i++) {
        cin >> u >> v >> c >> w;
        --u,--v;
        g_adj[u][c].emplace_back(v,w);
        g_adj[v][c].emplace_back(u,w);
    }
    map<pair<int,int>,int> mapping;
    for (int i=0;i<n;i++) {
        //cout << "node " << i << " with no color = " << tot_nodes << endl;
        mapping[make_pair(i,-1)]=tot_nodes++;
        for (auto &c: g_adj[i]) {
            //cout << "node " << i << " with color " << c.first << " = " <<tot_nodes << endl;
            mapping[make_pair(i,c.first)]=tot_nodes++;
        }
    }
    const ll inf = 1e18;
    vector<ll> dist(tot_nodes,inf);
    vector<ll> last(tot_nodes,-inf);
    vector<vector<tuple<int,int,int>>> adj(tot_nodes);
    vector<int> color(tot_nodes);
    auto add_edge = [&](int u,int v,int c,int w) {
        //cout<<"added edge "<<u<<" "<<v<<endl;
        adj[u].emplace_back(v,c,w);
    };
    vector<map<int,ll>> tot_cost(tot_nodes);
    int lst=0;
    for (int i=0;i<n;i++) {
        int u = mapping[make_pair(i,-1)]; // general node
        color[u] = -1;
        if (i == n-1) { lst = u; } 
        for (auto &c: g_adj[i]) {
            int u2 = mapping[make_pair(i,c.first)]; // color_node
            color[u2]=c.first;
            for (auto &[j,w]: c.second) {
                tot_cost[u][c.first]+=w;
                tot_cost[u2][c.first]+=w;
                int v = mapping[make_pair(j,-1)];
                int v2 = mapping[make_pair(j,c.first)];
                add_edge(u,v,c.first,w);
                add_edge(u,v2,c.first,w);
                add_edge(u2,v,c.first,w);
                add_edge(u2,v2,c.first,w);
            }
        }
    }   
    dist[0] = 0;
    set<pair<ll,int>> q;
    q.emplace(0,0);
    while(!q.empty()) {
        int x=(*q.begin()).second;q.erase(q.begin());
        if (color[x]==-1) {
            for (auto &[y,c,w]: adj[x]) {
                if (color[y]==-1) {
                    ll ww=min((ll)w,tot_cost[x][c]-w);
                    ll p=dist[y];
                    if (cmin(dist[y],dist[x]+ww)) {
                        q.erase(make_pair(p,y));
                        q.emplace(dist[y],y);
                    }
                } else {
                    ll p=dist[y];
                    if (cmin(dist[y],dist[x]+w)) {
                        last[y]=w;
                        q.erase(make_pair(p,y));
                        q.emplace(dist[y],y);
                    } else if (dist[y]==dist[x]+w&&cmax(last[y],(ll)w)) {
                        q.emplace(dist[y],y);
                    }
                }
                //cout<<"w = "<<w<<endl;
                //cout<<"from "<<x<<" to "<<y<<" "<<dist[y]<<endl;
            }
        } else {
            for (auto &[y,c,w]: adj[x]) {
                if (color[y]==-1) {
                    ll ww=min((ll)w,tot_cost[x][color[x]]-last[x]-w);
                    ll p=dist[y];
                    if (cmin(dist[y],dist[x]+ww)) {
                        q.erase(make_pair(p,y));
                        q.emplace(dist[y],y);
                    }
                } else {
                    ll p=dist[y];
                    if (cmin(dist[y],dist[x]+w)) {
                        last[y]=w;
                        q.erase(make_pair(p,y));
                        q.emplace(dist[y],y);
                    } else if (dist[y]==dist[x]+w&&cmax(last[y],(ll)w)) {
                        q.emplace(dist[y],y);
                    }
                }
                //cout<<"from "<<x<<" to "<<y<<" "<<dist[y]<<endl;
            }
        }
    }
    cout << (dist[lst]==inf?-1:dist[lst]) << endl;
}

# Verdict Execution time Memory Grader output
1 Correct 0 ms 344 KB Output is correct
2 Correct 1 ms 348 KB Output is correct
3 Correct 1 ms 344 KB Output is correct
4 Correct 0 ms 348 KB Output is correct
5 Correct 1 ms 348 KB Output is correct
6 Correct 0 ms 348 KB Output is correct
7 Correct 2 ms 604 KB Output is correct
8 Correct 1 ms 348 KB Output is correct
9 Correct 4 ms 1884 KB Output is correct
10 Correct 4 ms 1628 KB Output is correct
11 Correct 2 ms 1372 KB Output is correct
12 Incorrect 3 ms 1116 KB Output isn't correct
13 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 253 ms 45432 KB Output is correct
2 Correct 113 ms 24152 KB Output is correct
3 Correct 257 ms 40320 KB Output is correct
4 Correct 153 ms 31660 KB Output is correct
5 Correct 1135 ms 150488 KB Output is correct
6 Correct 890 ms 131348 KB Output is correct
7 Correct 468 ms 95100 KB Output is correct
8 Correct 638 ms 89660 KB Output is correct
9 Correct 605 ms 89628 KB Output is correct
10 Correct 491 ms 80468 KB Output is correct
11 Correct 247 ms 59728 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 0 ms 344 KB Output is correct
2 Correct 1 ms 348 KB Output is correct
3 Correct 1 ms 344 KB Output is correct
4 Correct 0 ms 348 KB Output is correct
5 Correct 1 ms 348 KB Output is correct
6 Correct 0 ms 348 KB Output is correct
7 Correct 2 ms 604 KB Output is correct
8 Correct 1 ms 348 KB Output is correct
9 Correct 4 ms 1884 KB Output is correct
10 Correct 4 ms 1628 KB Output is correct
11 Correct 2 ms 1372 KB Output is correct
12 Incorrect 3 ms 1116 KB Output isn't correct
13 Halted 0 ms 0 KB -