Submission #1299382

#TimeUsernameProblemLanguageResultExecution timeMemory
1299382hoa208Aesthetic (NOI20_aesthetic)C++20
100 / 100
268 ms52668 KiB
#include<bits/stdc++.h> using namespace std; #define ll long long #define FOR(i, a, b) for (int i = (a), _b = (b); i <= _b; i++) #define FORD(i, b, a) for (int i = (b), _a = (a); i >= _a; i--) #define pa pair<ll, ll> #define fi first #define se second #define bit(mask, j) ((mask >> j) & 1) const ll mod = 1e9 + 7; const ll INF = 1e18; //-------------------------------------------------------------------- const ll N = 3e5 + 10; struct ED { ll u, v, w; } ed[N]; vector<pa> g[N]; ll n, m; namespace sub3 { bool check() { return m == n - 1; } ll f[N]; bool dx[N]; pa par[N]; void dfs(ll u, ll p) { for(auto e : g[u]) { ll v = e.fi, id = e.se; if(v == p) continue; par[v] = {u, id}; f[v] = f[u] + ed[id].w; dfs(v, u); } } void slove() { FOR(i, 1, m) { ll u = ed[i].u, v = ed[i].v, w = ed[i].w; g[u].push_back({v, i}); g[v].push_back({u, i}); } dfs(1, 0); vector<ll> vt; ll u = n; while(u != 1) { ll v = par[u].fi, id = par[u].se; dx[id] = 1; u = v; } ll ans = f[n]; ll mx = -INF; FORD(i, m, 1) { if(dx[i]) { ans = max(ans, f[n] + mx); } mx = max(ed[i].w, mx); } cout << ans; } } namespace sub1 { bool check() { return n <= 2000 && m <= 2000; } const ll N = 2003; ll d[N]; void DJK() { priority_queue<pa, vector<pa>, greater<pa>> q; q.push({0, 1}); fill(d + 1, d + n + 1, INF); d[1] = 0; while(!q.empty()) { ll u = q.top().se, du = q.top().fi; q.pop(); if(du != d[u]) continue; for(auto e : g[u]) { ll v = e.fi, w = ed[e.se].w; if(d[v] > d[u] + w) { d[v] = d[u] + w; q.push({d[v], v}); } } } } void slove() { FOR(i, 1, m) { ll u = ed[i].u, v = ed[i].v, w = ed[i].w; g[u].push_back({v, i}); g[v].push_back({u, i}); } DJK(); ll ans = d[n]; ll mx = ed[m].w; FORD(i, m - 1, 1) { ed[i].w = ed[i].w + mx; DJK(); ans = max(ans, d[n]); ed[i].w = ed[i].w - mx; mx = max(ed[i].w, mx); } cout << ans; } } namespace subend { ll c[N]; ll d_1[N], d_n[N]; ll num[N], low[N], timedfs; bool used[N], bridge[N]; void DJK(ll s, ll d[]) { priority_queue<pa, vector<pa>, greater<pa>> q; q.push({0, s}); fill(d + 1, d + n + 1, INF); d[s] = 0; while(!q.empty()) { ll du = q.top().fi, u = q.top().se; q.pop(); if(du != d[u]) continue; for(auto e : g[u]) { ll v = e.fi, w = ed[e.se].w; if(d[v] > d[u] + w) { d[v] = d[u] + w; q.push({d[v], v}); } } } } void dfs(ll u) { num[u] = low[u] = ++timedfs; for(auto e : g[u]) { ll v = e.fi, id = e.se; if(used[id]) continue; used[id] = 1; if(!num[v]) { dfs(v); if(low[v] == num[v] && num[v] <= num[n]) { bridge[id] = 1; } low[u] = min(low[v], low[u]); } else { low[u] = min(low[u], num[v]); } } } bool check(ll L) { FOR(i, 1, n) { num[i] = low[i] = 0; } timedfs = 0; FOR(i, 1, m) { used[i] = 0; bridge[i] = 0; ll u = ed[i].u, v = ed[i].v, w = ed[i].w; if(!(d_1[u] + d_n[v] + w < L || d_1[v] + d_n[u] + w < L)) { used[i] = 1; } } dfs(1); FOR(i, 1, m - 1) { ll u = ed[i].u, v = ed[i].v, w = ed[i].w; if(bridge[i]) { if(min(d_1[v] + d_n[u], d_1[u] + d_n[v]) + w + c[i] >= L) { return true; } } } return false; } void slove() { FOR(i, 1, m) { ll u = ed[i].u, v = ed[i].v, w = ed[i].w; g[u].push_back({v, i}); g[v].push_back({u, i}); } ll mx = ed[m].w; c[m] = -INF; FORD(i, m - 1, 1) { c[i] = mx; mx = max(mx, ed[i].w); } DJK(1, d_1); DJK(n, d_n); ll l = d_1[n] + 1, r = mx + l; ll ans = d_1[n]; while(l <= r) { ll mid = l + r >> 1; if(check(mid)) { l = mid + 1; ans = mid; } else r = mid - 1; } cout << ans << '\n'; } } void hbmt() { cin >> n >> m; FOR(i, 1, m) { ll u, v, w; cin >> u >> v >> w; ed[i] = {u, v, w}; } // if(sub1::check()) return sub1::slove(); // if(sub3::check()) return sub3::slove(); return subend::slove(); } int main() { ios_base::sync_with_stdio(0); cin.tie(0);cout.tie(0); #define NAME "hbmt" if(fopen(NAME".inp", "r")) { freopen(NAME".inp", "r", stdin); freopen(NAME".out", "w", stdout); } //int t;cin>>t;while(t--) hbmt(); return 0; } /* 6 8 5 6 2 3 1 4 1 2 2 6 2 3 5 3 3 3 2 1 4 6 3 2 4 2 ans : 8 7 6 2 1 4 1 3 3 4 5 4 5 7 3 4 6 2 1 4 0 ans = 10 5 5 4 3 3 1 4 4 3 1 3 4 5 2 2 3 1 ans - 8 */

Compilation message (stderr)

Aesthetic.cpp: In function 'int main()':
Aesthetic.cpp:215:24: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
  215 |                 freopen(NAME".inp", "r", stdin);
      |                 ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~
Aesthetic.cpp:216:24: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
  216 |                 freopen(NAME".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...