이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#include <cstdio>
#include <cassert>
#include <vector>
#include <bits/stdc++.h>
typedef long long ll;
using namespace std;
vector<pair<ll,ll>> adj[202020];
vector<ll> l;
bool dfs(ll x, ll y, ll prv=-1){
if(x==y){
l.push_back(x);
return 1;
}
for(auto [next,w] : adj[x])if(prv!=next){
if(dfs(next,y,x)){
l.push_back(x);
return 1;
}
}
return 0;
}
ll sum(ll l, ll r, vector<ll> &v){ return l<=r ? v[r] - v[l-1] : 0; }
int max_score(int n, int x, int y, long long K,
std::vector<int> U, std::vector<int> V, std::vector<int> W)
{
l.clear();
for(int i = 0 ; i < n ; i++)adj[i].clear();
for(int i = 0 ; i < n-1 ; i++)adj[U[i]].push_back({V[i], W[i]}), adj[V[i]].push_back({U[i], W[i]});
vector<vector<ll>> dist(2, vector<ll>(n,-1));
queue<ll> q; q.push(x); dist[0][x] = 0;
while(q.size()){
ll cur = q.front(); q.pop();
for(auto [next,w] : adj[cur])if(dist[0][next]<0)dist[0][next] = dist[0][cur]+w, q.push(next);
}
q.push(y); dist[1][y] = 0;
while(q.size()){
ll cur = q.front(); q.pop();
for(auto [next,w] : adj[cur])if(dist[1][next]<0)dist[1][next] = dist[1][cur]+w, q.push(next);
}
vector<ll> res1(n*2+1, 1e18), res2(n*2+1, 1e18);
res1[0]=res2[0] = 0;
//경로 내부
dfs(x,y); reverse(l.begin(),l.end());
vector<ll> a, b;
ll t = l.size();
vector<bool> chk(n);
for(auto i : l)chk[i] = 1;
vector<ll> asum(t+1), bsum(t+1), mxsum(t+1); //1-index
for(int i = 0 ; i < t ; i++){
a.push_back(dist[0][l[i]]);
b.push_back(dist[1][l[i]]);
asum[i+1] += asum[i], bsum[i+1] += bsum[i], mxsum[i+1] += mxsum[i];
asum[i+1] += a[i], bsum[i+1] += b[i], mxsum[i+1] += max(a[i],b[i]);
}
for(int i = 1 ; i <= t ; i++){
res1[i] = min(res1[i], sum(1,i,asum));
res1[i] = min(res1[i], sum(t-i+1,t,bsum));
}
for(int i = 1 ; i <= t ; i++){ //교집합 x
for(int j = i+1 ; j <= t ; j++){
res1[i + (t-j+1)] = min(res1[i + t-j+1], sum(1,i,asum) + sum(j,t,bsum));
}
}
for(int i = 1 ; i <= t ; i++){
for(int j = i ; j <= t ; j++){
res1[t + (j-i+1)] = min<ll>(res1[t + (j-i+1)], sum(1,i-1,asum) + sum(i,j,mxsum) + sum(j+1,t,bsum));
}
}
//경로 외부
for(int i = 0 ; i < n ; i++)if(!chk[i]){
auto newres = res2;
for(int j = 1 ; j <= n*2 ; j++){
if(j>1)newres[j] = min(newres[j], res2[j-2] + max(dist[0][i], dist[1][i]));
newres[j] = min(newres[j], res2[j-1] + min(dist[0][i], dist[1][i]));
}
res2 = newres;
}
ll ret = 0;
for(int i = 0, j = n*2 ; i <= n*2 ; i++){
while(j>=0 and res1[i] + res2[j] > K)j--;
if(j<0)break;
ret = max<ll>(ret, i+j);
}
return ret;
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |