Submission #1123917

#TimeUsernameProblemLanguageResultExecution timeMemory
1123917vjudgeAesthetic (NOI20_aesthetic)C++20
100 / 100
689 ms85000 KiB
#include<bits/stdc++.h> #include<ext/pb_ds/assoc_container.hpp> #include<ext/pb_ds/tree_policy.hpp> #define F first #define S second #define ALL(x) x.begin(),x.end() #define random(l, r) (l + rand() % (r - l + 1)) #define int long long #define maxn 300005 #define bit(x, i) ((x >> i) & 1) #define pii pair<int, int> #define MOD 1000000000000000007 #define Task "A" using namespace std; vector<pair<int, pii> > v[maxn]; vector<int> T[maxn],W[maxn]; int d1[maxn],dn[maxn], f[maxn], g[maxn],ea[maxn],eb[maxn],ec[maxn], par[maxn],path[maxn],wh[maxn]; multiset<pair<int,int> > S; int n,m; void ad(int x) { g[x] = 1; for(auto E : v[x]) { int y = E.F, l = E.S.F, u= E.S.S; auto it= S.find({dn[y] + l + d1[x], u}); if(g[y] == 1) S.erase(it); if(g[y] == 0) S.insert({dn[x] + l + d1[y], u}); } } void dfs(int x, int p) { if(path[x]) wh[x] = x; else wh[x] = wh[p]; T[wh[x]].push_back(x); for(int y : W[x]) { dfs(y, x); } } int A = 0; signed main() { ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); if(fopen(Task".inp", "r")) { freopen(Task".inp", "r", stdin); freopen(Task".out", "w", stdout); } cin >> n >> m; for(int i = 0; i < m; i++)cin >> ea[i]>>eb[i]>>ec[i]; for(int i = m-1; i >= 0; i--) { int a = ea[i], b = eb[i], c = ec[i]; if(a != b) { v[a].push_back({b, {c,A}}); v[b].push_back({a, {c,A}}); } A = max(A, c); } for(int i = 1; i <= n; i++)d1[i] = dn[i] = MOD; d1[1] = 0; dn[n] = 0; priority_queue<pii > q; q.push({0, 1}); while(q.size()) { int x = q.top().S; q.pop(); if(f[x]) continue; f[x] = 1; for(auto E: v[x]) { int y = E.F, l = E.S.F; if(!f[y] && d1[y] > d1[x] + l) { d1[y] = d1[x] + l; par[y] = x; q.push({-d1[y], y}); } } } q.push({0, n}); for(int i = 1; i <= n; i++)f[i] = 0; while(q.size()) { int x = q.top().S; q.pop(); if(f[x]) continue; f[x] = 1; for(auto E: v[x]) { int y = E.F, l = E.S.F; if(!f[y] && dn[y] > dn[x] + l) { dn[y] = dn[x] + l; q.push({-dn[y], y}); } } } int ans = d1[n]; int X = n; while(1) { path[X] = 1; if(X == 1) break; X = par[X]; } for(int i = 1; i <= n; i++)W[par[i]].push_back(i); dfs(1,0); int x = n; while(1) { for(int y : T[x])ad(y); if(x == 1) break; x = par[x]; if(S.size() == 0) continue; int U = S.begin()->F + S.begin()->S; auto it = S.begin(); it++; if(it != S.end()) U = min(U, it->F); ans = max(ans, U); } cout<<ans<<endl; }

Compilation message (stderr)

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