Submission #1048117

#TimeUsernameProblemLanguageResultExecution timeMemory
1048117shjeongClosing Time (IOI23_closing)C++17
35 / 100
1061 ms42244 KiB
#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 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...