Submission #847520

#TimeUsernameProblemLanguageResultExecution timeMemory
847520nvmdavaClosing Time (IOI23_closing)C++17
83 / 100
1036 ms37996 KiB
#include "closing.h"
#include <bits/stdc++.h>
using namespace std;
#define ll long long
const int N = 200'005;

vector<pair<int, ll> > adj[N];

ll dx[N];
int px[N];
int py[N];
ll dy[N];

ll d[N];
int p[N];


void dfs(int v, int par) {
    p[v] = par;
    for(auto& u : adj[v]) {
        if(u.first == par) continue;
        d[u.first] = u.second + d[v];
        dfs(u.first, v);
    }
}


int max_score(int n, int X, int Y, long long k,
              std::vector<int> U, std::vector<int> V, std::vector<int> W)
{
    multiset<ll> q, w;
    // q - solo, w - double

    vector<pair<ll, ll> > help;
    for(int i = 0; i < n; ++i){
        d[i] = dx[i] = dy[i] = p[i] = px[i] = py[i] = 0;
        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]});
    }
    dfs(X, -1);
    swap(d, dx);
    swap(p, px);

    dfs(Y, -1);
    swap(d, dy);
    swap(p, py);

    int res = 0;

    vector<ll> dd(n);
    for(int i = 0; i < n; ++i) dd[i] = min(dx[i], dy[i]);
    sort(dd.begin(), dd.end());
    ll tmp = k;
    for(int i = 0; i < n; ++i) {
        tmp -= dd[i];
        if(tmp >= 0) res = i + 1;
        else break;
    }
    
    int cur = 0;
    ll sum = 0;

    for(int i = 0; i < n; ++i) {
        if(dx[i] + dy[i] == dx[Y]) {
            sum += min(dx[i], dy[i]);
            ++cur;
            q.insert(abs(dx[i] - dy[i]));
            if(sum > k) return res;
        } else {
            help.push_back({min(dx[i], dy[i]), abs(dx[i] - dy[i])});
            q.insert(min(dx[i], dy[i]));
        }
    }
    sort(help.begin(), help.end(), [](const pair<ll, ll>& lhs, const pair<ll, ll>& rhs) {
        return lhs.second == rhs.second ? lhs.first < rhs.first : lhs.second < rhs.second;
    });

    auto qit = q.begin();
    auto wit = w.begin();

    while(qit != q.end() && sum + *qit <= k) {
        ++cur;
        sum += *qit;
        ++qit;
    }

    res = max(res, cur);

    for(auto& e : help) {
        e.second += e.first;

        if(wit == w.end() || *wit > e.second) {
            cur += 2;
            sum += e.second;   
        }
        w.insert(e.second);

        auto fin = q.find(e.first);
        if(qit == q.end() || *qit >= e.first) {
            if(qit != fin) {
                cur -= 1;
                sum -= e.first;
            } else {
                ++qit;
            }
        }
        q.erase(fin);
        if(sum > k) {
            --wit;
            sum -= *wit;
            cur -= 2;
        }

        if(wit != w.end() && sum + *wit <= k) {
            sum += *wit;
            cur += 2;
            ++wit;
        }
        if(qit != q.end() && sum + *qit <= k) {
            sum += *qit;
            cur += 1;
            ++qit;
        }
        if(wit != w.end() && qit != q.begin()) {
            auto q1 = qit;
            q1--;
            if(sum - *q1 + *wit <= k) {
                sum += *wit - *q1;
                ++cur;
                --qit;
                ++wit;
            } else if(q1 != q.begin()){
                auto q2 = q1;
                q2--;
                if(*q1 + *q2 > *wit) {
                    sum += *wit - *q1 - *q2;
                    ++wit;
                    --qit;
                    --qit;
                }
            }
        }
        res = max(res, cur);
    }

    return res;
}
#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...