Submission #388202

#TimeUsernameProblemLanguageResultExecution timeMemory
388202BartolMRobot (JOI21_ho_t4)C++17
100 / 100
2564 ms130168 KiB
#define DEBUG 1 #include <bits/stdc++.h> using namespace std; #define X first #define Y second #define mp make_pair #define pb push_back typedef long long ll; typedef pair <int, int> pii; typedef pair <int, pii> pip; typedef pair <pii, int> ppi; typedef pair <ll, ll> pll; typedef pair <int, ll> pil; typedef pair <ll, int> pli; const int INF=0x3f3f3f3f; const int N=8e5+5; const ll MAX=(ll)INF*INF; int n, m, uk; map <pii, int> boja, koji; map <pii, ll> zbr; ll dist[N]; vector <pil> ls[N]; set <pli> S; void dijkstra() { fill(dist, dist+N, MAX); dist[1]=0; S.insert(mp(0, 1)); while (!S.empty()) { pli node=*S.begin(); S.erase(S.begin()); for (pil sus:ls[node.Y]) { if (dist[sus.X]<=sus.Y+node.X) continue; if (S.count(mp(dist[sus.X], sus.X))) S.erase(mp(dist[sus.X], sus.X)); dist[sus.X]=node.X+sus.Y; S.insert(mp(dist[sus.X], sus.X)); } } } void solve() { uk=n+1; for (int i=1; i<=n; ++i) { for (int j=0; j<ls[i].size(); ++j) { pil sus=ls[i][j]; if (sus.X>n) continue; int boj=boja[{i, sus.X}]; if (!koji[{i, boj}]) { ls[i].pb(mp(uk, 0)); koji[{i, boj}]=uk++; } int node=koji[{i, boj}]; ls[sus.X].pb(mp(node, 0)); ls[node].pb(mp(sus.X, zbr[{i, boj}]-sus.Y)); assert( zbr[mp(i, boj)]>=sus.Y ); } } dijkstra(); printf("%lld\n", dist[n]>=MAX ? -1 : dist[n]); } void load() { scanf("%d %d", &n, &m); for (int i=0; i<m; ++i) { int a, b, boj, cos; scanf("%d %d %d %d", &a, &b, &boj, &cos); ls[a].pb(mp(b, cos)); ls[b].pb(mp(a, cos)); boja[{a, b}]=boj; boja[{b, a}]=boj; if (zbr.count({a, boj})) zbr[{a, boj}]+=cos; else zbr[{a, boj}]=cos; if (zbr.count({b, boj})) zbr[{b, boj}]+=cos; else zbr[{b, boj}]=cos; } } int main() { load(); solve(); return 0; }

Compilation message (stderr)

Main.cpp: In function 'void solve()':
Main.cpp:48:24: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::pair<int, long long int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   48 |         for (int j=0; j<ls[i].size(); ++j) {
      |                       ~^~~~~~~~~~~~~
Main.cpp: In function 'void load()':
Main.cpp:69:10: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   69 |     scanf("%d %d", &n, &m);
      |     ~~~~~^~~~~~~~~~~~~~~~~
Main.cpp:72:14: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   72 |         scanf("%d %d %d %d", &a, &b, &boj, &cos);
      |         ~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...