Submission #1209815

#TimeUsernameProblemLanguageResultExecution timeMemory
1209815PagodePaivaClosing Time (IOI23_closing)C++20
75 / 100
520 ms147200 KiB
#include "closing.h"
#include<bits/stdc++.h>

using namespace std;
const long long N = 3010;

long long dp[N][2*N];
vector <pair <long long, long long>> g[N];
long long mark[N];
long long custox[N], custoy[N];
long long l[N], r[N];
int pai[N];
int esp[N];

void dfs_x(int v, int p){
    pai[v] = p;
    for(auto [x, w] : g[v]){
        if(x == p)
            continue;
        custox[x] = custox[v] + w;
        dfs_x(x, v);
    }
    return;
}

void dfs_y(int v, int p){
    for(auto [x, w] : g[v]){
        if(x == p)
            continue;
        custoy[x] = custoy[v] + w;
        dfs_y(x, v);
    }
    return;
}

int max_score(int n, int X, int Y, long long k,
              std::vector<int> U, std::vector<int> V, std::vector<int> W){
    for(int i = 0;i < n;i++){
        g[i].clear();
        mark[i] = 0;
        custox[i] = custoy[i] = 0;
        for(int j = 0;j < 2*n+2;j++)
            dp[i][j] = 0;
        l[i] = r[i] = 0;
        pai[i] = 0;
        esp[i] = 0;
    }
    for(long long i = 0;i < n-1;i++){
        g[U[i]].push_back({V[i], W[i]});
        g[V[i]].push_back({U[i], W[i]});
    }
    priority_queue <pair <long long, long long>> pq;
    pq.push({0, X});
    pq.push({0, Y});
    long long ans = 0, sum = 0;
    while(!pq.empty()){
        auto [w, v] = pq.top();
        pq.pop();
        if(mark[v])
            continue;
        w *= -1;
        if(sum+w > k){
            break;
        }
        sum += w;
        ans++;
        mark[v] = 1;
        for(auto [x, ww] : g[v]){
            if(mark[x])
                continue;
            pq.push({-(ww+w), x});
        }
    }
    dfs_x(X, X);
    dfs_y(Y, Y);
    for(int i = 0;i < n;i++){
        l[i] = min(custox[i], custoy[i]);
        r[i] = max(custox[i], custoy[i]) - l[i];
    }
    long long calc = 0;
    int pref = 0;
    while(Y != X){
        esp[Y] = 1;
        calc += l[Y];
        Y = pai[Y];
        pref++;
    }
    esp[X] = 1;
    pref++;
    if(calc > k)
        return ans;
    //cout << pref << ' ' << calc << '\n';
    k -= calc;
    for(int i = 0;i < n;i++){
        for(int j = 0;j < 2*n+2;j++){
            dp[i][j] = 1e18+10;
        }
    }
    dp[0][0] = 0;
    if(esp[0] == 0){
        dp[0][1] = l[0];
        dp[0][2] = l[0] + r[0];
    }
    else{
        dp[0][1] = r[0];
    }
    for(int i = 1;i < n;i++){
        for(int j = 0;j < 2*n+2;j++){
            if(esp[i] == 0){
                dp[i][j] = min(min(dp[i][j], dp[i-1][j]), min((j > 0 ? dp[i-1][j-1] + l[i] : (long long)(1e18+10)), (j > 1 ? dp[i-1][j-2] + l[i] + r[i] : (long long)(1e18+10))));
            }
            else{
                dp[i][j] = min({dp[i][j], dp[i-1][j], (j > 0 ? dp[i-1][j-1] + r[i] : (long long)(1e18+10))});
            }
        }
    }
    for(int i = 0;i < 2*n+2;i++){
        //cout << dp[n-1][i] << ' '; 
    }
    for(int i = 2*n+1;i >= 0;i--){
        if(dp[n-1][i] <= k){
            return max((long long)(i+pref), ans);
        }
    }
}

Compilation message (stderr)

closing.cpp: In function 'int max_score(int, int, int, long long int, std::vector<int>, std::vector<int>, std::vector<int>)':
closing.cpp:125:1: warning: control reaches end of non-void function [-Wreturn-type]
  125 | }
      | ^
#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...