제출 #1152712

#제출 시각아이디문제언어결과실행 시간메모리
1152712dubabubaRobot (JOI21_ho_t4)C++20
0 / 100
1181 ms85668 KiB
#include <bits/stdc++.h> using namespace std; #define int long long typedef pair<int, int> pii; #define ff first #define ss second #define MP make_pair const int sus = 1.1e5; const int mxn = 2.2e5; int a[mxn], b[mxn], c[mxn], p[mxn]; vector<pii> adj[mxn]; vector<pair<int, pii>> go[mxn]; int n, m, dis[mxn], cnt[mxn]; int32_t main() { cin >> n >> m; for(int i = 0; i < m; i++) { cin >> a[i] >> b[i] >> c[i] >> p[i]; adj[a[i]].push_back(MP(i, 0)); adj[b[i]].push_back(MP(i, 0)); } for(int i = 1; i <= n; i++) { if(adj[i].size() == 0) continue; sort(adj[i].begin(), adj[i].end(), [&] (pii pi, pii pj) { return c[pi.ff] < c[pj.ff]; }); for(pii e : adj[i]) { int id = e.ff; int j = a[id] + b[id] - i; } int L = 0; int col = c[adj[i][0].ff]; int cost = p[adj[i][0].ff]; vector<pair<int, pii>> vec; for(int R = 1; R < adj[i].size(); R++) { int id = adj[i][R].ff; if(col == c[id]) { cost += p[id]; } else { vec.push_back(MP(cost, MP(L, R - 1))); L = R; col = c[id]; cost = p[id]; } } vec.push_back(MP(cost, MP(L, adj[i].size() - 1))); for(pair<int, pii> e : vec) { int cost = e.ff; int l = e.ss.ff; int r = e.ss.ss; for(int t = l; t <= r; t++) { int id = adj[i][t].ff; int rest = cost - p[id]; int j = a[id] + b[id] - i; go[i].push_back(MP( j, MP(rest, c[id]) )); go[i].push_back(MP( j + sus, MP(p[id], c[id]) )); } } } priority_queue<pair<pii, pii>> pq; pq.push(MP(MP(0, 0), MP(1, -1))); memset(dis, -1, sizeof dis); set<pair<int, pii>> mp; while(pq.size()) { int d = -pq.top().ff.ff; int las = pq.top().ff.ss; int cur = pq.top().ss.ff; int col = pq.top().ss.ss; pq.pop(); int u = (cur > sus) ? cur - sus : cur; bool change = (cur > sus); if(u == n) { cout << d << endl; return 0; } // cout << cur << ' ' << d << endl; if(cnt[cur] >= 2) continue; cnt[cur]++; if(dis[cur] == d) continue; if(dis[cur] == -1) dis[cur] = d; // auto it = mp.find(MP(cur, MP(col, las))); // if(mp.end() != it) continue; // mp.insert(MP(cur, MP(col, las))); // cout << "\nnow: " << cur << " = " << d << endl; for(pair<int, pii> e : go[u]) { int v = e.ff; int w = e.ss.ff; int c = e.ss.ss; int cost = d + w; if(col == c && change && v < sus) cost -= las; // cout << cur << " -> " << v << " = " << cost << endl; pq.push(MP(MP(-cost, w), MP(v, c))); } } cout << -1 << endl; return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...