Submission #1256422

#TimeUsernameProblemLanguageResultExecution timeMemory
1256422tradzAesthetic (NOI20_aesthetic)C++20
100 / 100
789 ms64696 KiB
#include <bits/stdc++.h> #define TIME (1.0 * clock() / CLOCKS_PER_SEC) #define For(i,a,b) for(int i = a; i <= b; i++) #define Ford(i,a,b) for(int i = a; i >= b; i--) #define ll long long #define ii pair<int,int> #define fi first #define se second #define all(v) v.begin(),v.end() #define RRH(v) v.resize(unique(all(v)) - v.begin()) using namespace std; const int N = 300000 + 7; const int Mod = 1e9 + 7; const ll INF = (ll)3e18; const ll BASE = 137; mt19937_64 rng(chrono::steady_clock::now().time_since_epoch().count()); long long GetRandom(long long l, long long r) { return uniform_int_distribution<long long> (l, r)(rng); } struct Edge { int u, v, w; }; int n, m; Edge edges[N]; ll dp[2][N]; int Cost[N]; vector<ii> ke[N], adj[N]; int low[N], numt[N]; void solution() { cin >> n >> m; For(i,1,m) { int u, v, w; cin >> u >> v >> w; ke[u].push_back({v,w}); ke[v].push_back({u,w}); edges[i] = {u,v,w}; } For(i,1,m+2) Cost[i] = 0; Ford(i,m,1) { Cost[i] = max(edges[i].w, Cost[i+1]); } For(t,0,1) For(i,1,n) dp[t][i] = INF; auto Dijkstra = [&](int st, int typ) { vector<char> vis(n+1, 0); priority_queue<pair<ll,int>, vector<pair<ll,int>>, greater<pair<ll,int>>> pq; dp[typ][st] = 0; pq.push({0, st}); while (!pq.empty()) { auto cur = pq.top(); pq.pop(); int u = cur.second; if (vis[u]) continue; vis[u] = 1; for (auto &id : ke[u]) { int v = id.fi, w = id.se; if (dp[typ][v] > dp[typ][u] + w) { dp[typ][v] = dp[typ][u] + w; pq.push({dp[typ][v], v}); } } } }; Dijkstra(1, 0); Dijkstra(n, 1); function<int(ll)> check = [&](ll X) -> int { For(i,1,n) { vector<ii>().swap(adj[i]); low[i] = numt[i] = 0; } For(i,1,m) { int u = edges[i].u, v = edges[i].v, w = edges[i].w; if ((dp[0][u] + dp[1][v] + w < X) || (dp[0][v] + dp[1][u] + w < X)) { int added = w + Cost[i+1]; adj[u].push_back({v, added}); adj[v].push_back({u, added}); } } int time_dfs = 0; int res = 0; function<void(int,int)> dfs = [&](int u, int p) { low[u] = numt[u] = ++time_dfs; for (auto &ed : adj[u]) { int v = ed.fi; ll w = ed.se; if (v == p) continue; if (!numt[v]) { dfs(v, u); low[u] = min(low[u], low[v]); if (low[v] == numt[v] && numt[v] <= numt[n]) { if (dp[0][u] + dp[1][v] + w >= X) res = 1; } } else { low[u] = min(low[u], numt[v]); } } }; dfs(1, 0); if (!numt[n]) return 1; return res; }; ll L = dp[0][n]; if (L >= INF/4) L = INF/4; ll R = dp[0][n] * 2 + Cost[1]; if (R < L) R = L; while (L < R) { ll mid = (L + R + 1) >> 1; if (check(mid)) L = mid; else R = mid - 1; } cout << L << '\n'; } int main() { ios::sync_with_stdio(false); cin.tie(nullptr); #define TASK "" if (fopen (".inp", "r")) { freopen (".inp", "r", stdin); freopen (".out", "w", stdout); } if(fopen(TASK".inp", "r")) { freopen(TASK".inp", "r", stdin); freopen(TASK".out", "w", stdout); } solution(); cerr << "Time elapsed: " << TIME << " s.\n"; return 0; }

Compilation message (stderr)

Aesthetic.cpp: In function 'int main()':
Aesthetic.cpp:134:17: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
  134 |         freopen (".inp", "r", stdin);
      |         ~~~~~~~~^~~~~~~~~~~~~~~~~~~~
Aesthetic.cpp:135:17: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
  135 |         freopen (".out", "w", stdout);
      |         ~~~~~~~~^~~~~~~~~~~~~~~~~~~~~
Aesthetic.cpp:138:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
  138 |         freopen(TASK".inp", "r", stdin);
      |         ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~
Aesthetic.cpp:139:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
  139 |         freopen(TASK".out", "w", stdout);
      |         ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...