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...