제출 #1221581

#제출 시각아이디문제언어결과실행 시간메모리
1221581thelegendary08봉쇄 시간 (IOI23_closing)C++17
8 / 100
103 ms33212 KiB
#include "closing.h" #include<bits/stdc++.h> #define f0r(i,n) for(ll i = 0;i<n;i++) #define FOR(i, k, n) for(int i = k;i<n;i++) #define pb push_back #define vi vector<long long int> #define ll long long int using namespace std; int max_score(int N, int X, int Y, long long K, std::vector<int> U, std::vector<int> V, std::vector<int> W) { vector<pair<ll,ll>> adj[N]; f0r(i, N-1){ adj[U[i]].pb({V[i], W[i]}); adj[V[i]].pb({U[i], W[i]}); } vector<vector<ll>>dist(N, vector<ll>(2, 4e18)); vector<bool>vis(N, 0); queue<int>q; q.push(X); vis[X] = 1; dist[X][0] = 0; while(!q.empty()){ int c = q.front(); q.pop(); for(auto u : adj[c]){ if(vis[u.first])continue; vis[u.first] = 1; dist[u.first][0] = min(dist[u.first][0], dist[c][0] + u.second); q.push(u.first); } } f0r(i,N)vis[i] = 0; vis[Y] = 1; dist[Y][1] = 0; q.push(Y); while(!q.empty()){ int c = q.front(); q.pop(); for(auto u : adj[c]){ if(vis[u.first])continue; vis[u.first] = 1; dist[u.first][1] = min(dist[u.first][1], dist[c][1] + u.second); q.push(u.first); } } if(dist[Y][0] > 2 * K){ vector<ll> dists; f0r(i, N){ dists.pb(min(dist[i][0], dist[i][1])); } sort(dists.begin(), dists.end()); int ans = 0; ll s = 0; f0r(i, N){ if(s + dists[i] > K)break; ans++; s += dists[i]; } return ans; } else{ vector<ll> dists; f0r(i, N){ dists.pb(min(dist[i][0], dist[i][1])); } sort(dists.begin(), dists.end()); ll ans = 0; ll s = 0; f0r(i, N){ if(s + dists[i] > K)break; ans++; s += dists[i]; } vi psl; psl.pb(0); ll cur = 0; for(int i = X-1; i>=0; i--){ cur += dist[i][0]; psl.pb(cur); } vi psr; psr.pb(0); cur = 0; for(int i = Y+1; i<N; i++){ cur += dist[i][1]; psr.pb(cur); } vi l2(N+1); FOR(i, 1, N+1){ l2[i] = l2[i-1] + max(dist[i-1][0], dist[i-1][1]); } f0r(i, N){ for(ll j = i; j<N; j++){ if(j < X)continue; if(i > Y)continue; ll cur = l2[j+1] - l2[i]; /* if(i == 1 && j == 2){ cout<<cur<<'\n'; } */ if(cur > K)continue; ll x = i; ll y = j; ll c = 0; vi thing; for(ll i = x-1; i>=0; i--){ c += dist[i][0]; thing.pb(c); } c = 0; for(ll i = y+1; i<N; i++){ c += dist[i][1]; thing.pb(c); } sort(thing.begin(), thing.end()); //last one such that fits ll res = K - cur; ll lo = -1; ll hi = thing.size() - 1; while(lo < hi){ int mid = lo + (hi - lo + 1) / 2; if(thing[mid] <= res){ lo = mid; } else{ hi = mid - 1; } } ans = max(ans, 2 * (j - i + 1) + lo + 1); } } 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...