Submission #1087629

#TimeUsernameProblemLanguageResultExecution timeMemory
1087629WhisperAesthetic (NOI20_aesthetic)C++17
100 / 100
837 ms71968 KiB
#include <bits/stdc++.h> using namespace std; using ll = long long; #define int long long #define FOR(i, a, b) for (int i = (a); i <= (b); i++) #define FORD(i, a, b) for (int i = (b); i >= (a); i --) #define REP(i, a) for (int i = 0; i < (a); ++i) #define REPD(i, a) for (int i = (a) - 1; i >= 0; --i) #define MASK(i) (1LL << (i)) #define BIT(x, i) (((x) >> (i)) & 1) constexpr ll LINF = (1ll << 60); constexpr int INF = (1ll << 30); constexpr int Mod = 1e9 + 7; mt19937 rng(chrono::steady_clock::now().time_since_epoch().count()); /* Phu Trong from Nguyen Tat Thanh High School for gifted student */ template <class X, class Y> bool minimize(X &x, const Y &y){ X eps = 1e-9; if (x > y + eps) {x = y; return 1;} return 0; } template <class X, class Y> bool maximize(X &x, const Y &y){ X eps = 1e-9; if (x + eps < y) {x = y; return 1;} return 0; } #define MAX 300005 int numNode, numEdge; vector<int> G[MAX]; struct Edge{ int u, v, w; Edge(){} Edge(int _u, int _v, int _w): u(_u), v(_v), w(_w){} int other(int x){return (x ^ u ^ v);} } edge[MAX]; int minDist[2][MAX]; void dijkstra(int s, int minDist[]){ for (int i = 1; i <= numNode; ++i) minDist[i] = LINF; priority_queue<pair<int, int>, vector<pair<int, int>>, greater<pair<int, int>>> q; q.emplace(0, s); minDist[s] = 0; while(q.size()){ int du, u; tie(du, u) = q.top(); q.pop(); if(du > minDist[u]) continue; for(int&i : G[u]) { int v = edge[i].other(u); if(minimize(minDist[v], minDist[u] + edge[i].w)){ q.emplace(minDist[v], v); } } } } int low[MAX], num[MAX], timeDfs = 0; int suffix[MAX]; bool contain[MAX]; vector<pair<int, int>> newG[MAX]; bool ok = 0; int value = 0; void tarjan(int u, int p){ if(u == numNode) contain[u] = true; low[u] = num[u] = ++timeDfs; for (pair<int, int>&x : newG[u]){ int v = x.first, i = x.second; if(i ^ p){ if(num[v]) minimize(low[u], num[v]); else{ tarjan(v, i); minimize(low[u], low[v]); contain[u] |= contain[v]; if(num[v] == low[v]){ if(!contain[v]) continue; int eu = edge[i].u, ev = edge[i].v; if(minDist[0][eu] + edge[i].w + minDist[1][ev] != minDist[0][numNode]) continue; if(minDist[0][eu] + edge[i].w + minDist[1][ev] + suffix[i] >= minDist[0][numNode] + value) ok = 1; } } } } } void process(void){ cin >> numNode >> numEdge; int max_weight = 0; for (int i = 1; i <= numEdge; ++i){ cin >> edge[i].u >> edge[i].v >> edge[i].w; G[edge[i].u].emplace_back(i); G[edge[i].v].emplace_back(i); maximize(max_weight, edge[i].w); } dijkstra(1, minDist[0]); dijkstra(numNode, minDist[1]); suffix[numEdge] = -LINF; for (int i = numEdge - 1; i >= 1; --i){ maximize(suffix[i], suffix[i + 1]); maximize(suffix[i], edge[i + 1].w); } for (int i = 1; i <= numEdge; ++i){ if(minDist[0][edge[i].u] > minDist[0][edge[i].v]) swap(edge[i].u, edge[i].v); } int l = 1, r = max_weight; int add = 0; auto check = [&](int val) -> bool{ timeDfs = 0, ok = 0; value = val; for (int i = 1; i <= numNode; ++i) newG[i].clear(), contain[i] = num[i] = low[i] = 0; auto active = [&](int u, int v, int w, int x) -> bool{ if(minDist[0][u] + minDist[1][v] + w < minDist[0][numNode] + x) return true; if(minDist[0][v] + minDist[1][u] + w < minDist[0][numNode] + x) return true; return false; }; for (int u = 1; u <= numNode; ++u){ for (int&i : G[u]){ int v = edge[i].other(u); if(active(u, v, edge[i].w, val)) { newG[u].emplace_back(v, i); } } } tarjan(1, 0); return (ok); }; while(l <= r){ int m = (l + r) >> 1; if(check(m)) l = m + 1, add = m; else r = m - 1; } cout << minDist[0][numNode] + add; } signed main(){ #define name "Whisper" cin.tie(nullptr) -> sync_with_stdio(false); //freopen(name".inp", "r", stdin); //freopen(name".out", "w", stdout); process(); return (0 ^ 0); }

Compilation message (stderr)

Aesthetic.cpp: In lambda function:
Aesthetic.cpp:128:81: warning: suggest parentheses around assignment used as truth value [-Wparentheses]
  128 |         for (int i = 1; i <= numNode; ++i) newG[i].clear(), contain[i] = num[i] = low[i] = 0;
      |                                                                          ~~~~~~~^~~~~~~~~~~~
#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...