Submission #1071266

#TimeUsernameProblemLanguageResultExecution timeMemory
1071266GrindMachineClosing Time (IOI23_closing)C++17
75 / 100
1030 ms46144 KiB
#include <bits/stdc++.h> #include <ext/pb_ds/assoc_container.hpp> #include <ext/pb_ds/tree_policy.hpp> using namespace std; using namespace __gnu_pbds; template<typename T> using Tree = tree<T, null_type, less<T>, rb_tree_tag, tree_order_statistics_node_update>; typedef long long int ll; typedef long double ld; typedef pair<int,int> pii; typedef pair<ll,ll> pll; #define fastio ios_base::sync_with_stdio(false); cin.tie(NULL) #define pb push_back #define endl '\n' #define sz(a) (int)a.size() #define setbits(x) __builtin_popcountll(x) #define ff first #define ss second #define conts continue #define ceil2(x,y) ((x+y-1)/(y)) #define all(a) a.begin(), a.end() #define rall(a) a.rbegin(), a.rend() #define yes cout << "Yes" << endl #define no cout << "No" << endl #define rep(i,n) for(int i = 0; i < n; ++i) #define rep1(i,n) for(int i = 1; i <= n; ++i) #define rev(i,s,e) for(int i = s; i >= e; --i) #define trav(i,a) for(auto &i : a) template<typename T> void amin(T &a, T b) { a = min(a,b); } template<typename T> void amax(T &a, T b) { a = max(a,b); } #ifdef LOCAL #include "debug.h" #else #define debug(x) 42 #endif /* refs: https://codeforces.com/blog/entry/121499 */ const int MOD = 1e9 + 7; const int N = 2e5 + 5; const int inf1 = int(1e9) + 5; const ll inf2 = ll(1e18) + 5; #include "closing.h" vector<pll> adj[N]; ll dis[N][2]; void dfs1(ll u, ll p, ll t){ for(auto [v,w] : adj[u]){ if(v == p) conts; dis[v][t] = dis[u][t]+w; dfs1(v,u,t); } } vector<bool> on_path(N); vector<ll> path; vector<ll> curr_path; void dfs2(ll u, ll p, ll des){ curr_path.pb(u); if(u == des){ path = curr_path; trav(v,curr_path){ on_path[v] = 1; } } for(auto [v,w] : adj[u]){ if(v == p) conts; dfs2(v,u,des); } curr_path.pop_back(); } int max_score(int n, int X, int Y, long long K, std::vector<int> U, std::vector<int> V, std::vector<int> W) { rep(i,n){ adj[i].clear(); on_path[i] = 0; } rep(i,n-1){ ll u = U[i], v = V[i], w = W[i]; adj[u].pb({v,w}), adj[v].pb({u,w}); } dis[X][0] = dis[Y][1] = 0; dfs1(X,-1,0); dfs1(Y,-1,1); dfs2(X,-1,Y); vector<ll> a(n), b(n); rep(i,n){ ll dx = dis[i][0], dy = dis[i][1]; a[i] = min(dx,dy); b[i] = max(dx,dy)-a[i]; } ll ans = 0; // only 1s { vector<ll> vals; rep(i,n) vals.pb(a[i]); sort(all(vals)); ll sum = 0; ll guys = 0; rep(i,n){ sum += vals[i]; if(sum > K) break; guys++; } amax(ans,guys); } // 1s and 2s // all guys on path from X to Y must be at least 1 vector<ll> dp1(2*n+5,inf2), dp2(2*n+5); dp1[0] = 0; rep(i,n){ if(on_path[i]) conts; fill(all(dp2),inf2); rep(j,2*n+1){ // 0 amin(dp2[j],dp1[j]); // 1 amin(dp2[j+1],dp1[j]+a[i]); // 2 amin(dp2[j+2],dp1[j]+a[i]+b[i]); } dp1 = dp2; } ll path_cost1 = 0; rep(i,sz(path)){ ll u = path[i]; path_cost1 += min(dis[u][0],dis[u][1]); } vector<ll> smn(2*n+5,inf2); rev(j,2*n,0) smn[j] = min(smn[j+1],dp1[j]); rep(i,sz(path)){ ll cost = path_cost1; ll val = sz(path); for(int j = i; j < sz(path); ++j){ ll u = path[j]; cost += max(dis[u][0],dis[u][1])-min(dis[u][0],dis[u][1]); val++; if(cost > K) break; ll mx_allowed = K-cost; ll lo = 0, hi = 2*n; ll best = -1; while(lo <= hi){ ll mid = (lo+hi) >> 1; if(mx_allowed >= smn[mid]){ best = mid; lo = mid+1; } else{ hi = mid-1; } } assert(best != -1); amax(ans,val+best); } } 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...