Submission #1205864

#TimeUsernameProblemLanguageResultExecution timeMemory
1205864PacybwoahClosing Time (IOI23_closing)C++20
8 / 100
141 ms55828 KiB
#include "closing.h"
#include<iostream>
#include<vector>
#include<algorithm>
#include<utility>
using namespace std;
typedef long long ll;
namespace{
    vector<vector<pair<int, ll>>> graph;
    int n;
    ll k;
    int sz;
    int a, b;
    vector<pair<ll, ll>> dists;
    vector<int> p, vec, szs, inp;
    vector<vector<ll>> cost, rc;
    void dfs1(int node, int parent, int day){
        p[node] = parent;
        for(auto &[x, l]: graph[node]){
            if(x == parent) continue;
            if(day == 0) dists[x].first = dists[node].first + l;
            else dists[x].second = dists[node].second + l;
            dfs1(x, node, day);
        }
    }
    void dfs2(int node, int parent, int rt){
        for(auto &[x, l]: graph[node]){
            if(x == parent) continue;
            if(inp[x]) continue;
            cost[rt].push_back(dists[x].first);
            dfs2(x, node, rt);
        }
    }
}
int max_score(int N, int X, int Y, long long K, std::vector<int> U, std::vector<int> V, std::vector<int> W){
    n = N;
    k = K;
    a = X + 1;
    b = Y + 1;
    vector<vector<pair<int, ll>>>().swap(graph);
    vector<pair<ll, ll>>().swap(dists);
    vector<int>().swap(p);
    vector<int>().swap(vec);
    vector<int>().swap(szs);
    vector<int>().swap(inp);
    vector<vector<ll>>().swap(cost);
    vector<vector<ll>>().swap(rc);
    graph.resize(n + 1);
    dists.resize(n + 1);
    p.resize(n + 1);
    inp.resize(n + 1);
    for(int i = 0; i < n - 1; i++){
        graph[U[i] + 1].emplace_back(V[i] + 1, W[i]);
        graph[V[i] + 1].emplace_back(U[i] + 1, W[i]);
    }
    dfs1(a, a, 0);
    int cur = b;
    while(cur != a){
        vec.push_back(cur);
        cur = p[cur];
    }
    vec.push_back(a);
    vec.push_back(0);
    reverse(vec.begin(), vec.end());
    sz = (int)vec.size() - 1;
    szs.resize(sz + 1);
    cost.resize(sz + 1);
    rc.resize(sz + 1);
    dfs1(b, b, 1);
    for(int i = 1; i <= n; i++){
        if(dists[i].first > dists[i].second) swap(dists[i].first, dists[i].second);
    }
    for(int i = 1; i <= sz; i++) inp[vec[i]] = 1;
    for(int i = 1; i <= sz; i++){
        cost[i].push_back(0);
        dfs2(vec[i], vec[i], i);
        szs[i] = (int)cost[i].size() - 1;
        sort(cost[i].begin(), cost[i].end());
        ll diff = dists[vec[i]].second - dists[vec[i]].first;
        rc[i].resize(2 * szs[i] + 1);
        int ptr = 0;
        while(ptr < szs[i] && cost[i][ptr + 1] <= diff){
            ptr++;
            rc[i][ptr] = rc[i][ptr - 1] + cost[i][ptr];
        }
        for(int j = 1; j <= ptr; j++) rc[i][ptr + j] = rc[i][ptr + j - 1] + diff;
        for(int j = ptr + 1; j <= szs[i]; j++){
            rc[i][2 * j - 1] = rc[i][2 * j - 2] + cost[i][j];
            rc[i][2 * j] = rc[i][2 * j - 1] + diff;
        }
    }
    vector<ll> pa(sz + 1), pb(sz + 1);
    for(int i = 1; i <= sz; i++){
        pa[i] = pa[i - 1] + dists[vec[i]].first;
        pb[i] = pb[i - 1] + dists[vec[i]].second - dists[vec[i]].first;
    }
    if(dists[b].second > 2 * k){
        vector<ll> tmp;
        for(int i = 1; i <= n; i++) tmp.push_back(dists[i].first);
        sort(tmp.begin(), tmp.end());
        ll sum = 0;
        for(int i = 0; i < n; i++){
            sum += tmp[i];
            if(sum > k) return i;
        }
        return n;
    }
    return 0;
}
#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...