Submission #1078321

#TimeUsernameProblemLanguageResultExecution timeMemory
1078321Dan4LifeClosing Time (IOI23_closing)C++17
83 / 100
506 ms149364 KiB
#include "closing.h"
#include <bits/stdc++.h>
using namespace std;
#define pb push_back
#define sz(a) (int)a.size()
#define all(a) begin(a),end(a)
 
using ll = long long;
using ar = array<ll,2>;
using vi = vector<ll>;
const int mxN = (int)3e5+10;
const ll LINF = (ll)2e18;
ar a[mxN];
ll n, dis[2][mxN], dp[3010][6010];
vector<pair<int,ll>> adj[mxN];
 
void dfs(int s, int p, int t){
	for(auto [u,w] : adj[s]){
		if(u==p) continue; 
		dis[t][u] = dis[t][s]+w; dfs(u,s,t);
	}
}
 
int max_score(int N, int X, int Y, ll K, vector<int> U, vector<int> V, vector<int> W){
	n = N; int ans = 0;
	for(int i = 0; i <= n; i++) adj[i].clear();
	for(int i = 0; i < sz(U); i++){
		auto [a,b,c] = tie(U[i],V[i],W[i]);
		adj[a].pb({b,c}), adj[b].pb({a,c});
	}
	dis[0][X]=dis[1][Y]=0;
	dfs(X,-1,0); dfs(Y,-1,1);
	vi v; v.clear();
	for(int i = 0; i < n; i++){
		ll mn = min(dis[0][i],dis[1][i]);
		ll mx = max(dis[0][i],dis[1][i]);
		a[i][0] = mn, a[i][1] = mx;
		v.pb(mn), v.pb(mx);
	}
	ll D = 0; int i = 0; sort(all(v));
	for(auto u : v){
		D+=u; if(D<=K) ans=i+1;
		i++;
	}
	if(n>3000) return ans;
	
	for(int i = 0; i <= n; i++)
		for(int j = 0; j <= 2*n+4; j++)
			dp[i][j] = LINF;
	dp[0][0] = 0;
	for(int i = 0; i < n; i++){
		for(int j = 0; j <= 2*i; j++){
			if(dis[0][i]+dis[1][i]!=dis[0][Y]) 
				dp[i+1][j] = min(dp[i+1][j], dp[i][j]);
			for(int k : {0,1}) 
				dp[i+1][j+k+1] = min(dp[i+1][j+k+1], dp[i][j]+a[i][k]);
		}
	}
	for(int i = 0; i <= 2*n; i++)
		if(dp[n][i]<=K) ans=max(ans,i);
	return ans;
}
#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...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...