Submission #1016314

#TimeUsernameProblemLanguageResultExecution timeMemory
1016314AndreyClosing Time (IOI23_closing)C++17
83 / 100
1050 ms38228 KiB
#include "closing.h"
#include<bits/stdc++.h>
#include <vector>
using namespace std;

long long n,x,y,k;
vector<pair<long long,long long>> haha[200001];
vector<long long> bruh(200001);
vector<long long> wow(200001);

void dfs(long long a, long long t, long long d, bool yeah) {
    if(yeah) {
        bruh[a] = d;
    }
    else {
        wow[a] = d;
    }
    for(pair<long long,long long> v: haha[a]) {
        if(v.first != t) {
            dfs(v.first,a,d+v.second,yeah);
        }
    }
}

bool dude(long long a, long long t) {
    if(a == y) {
        if(bruh[a] < wow[a]) {
            k-=bruh[a];
            wow[a]-=bruh[a];
            bruh[a] = 0;
        }
        else {
            k-=wow[a];
            bruh[a]-=wow[a];
            wow[a] = 0;
        }
        return true;
    }
    for(pair<long long,long long> v: haha[a]) {
        if(v.first != t) {
            if(dude(v.first,a)) {
                if(bruh[a] < wow[a]) {
                    k-=bruh[a];
                    wow[a]-=bruh[a];
                    bruh[a] = 0;
                }
                else {
                    k-=wow[a];
                    bruh[a]-=wow[a];
                    wow[a] = 0;
                }
                return true;
            }
        }
    }
    return false;
}

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;
    x = X;
    y = Y;
    k = K;
    for(int i = 0; i < n; i++) {
        haha[i].clear();
    }
    for(long long i = 0; i < n-1; i++) {
        haha[U[i]].push_back({V[i],W[i]});
        haha[V[i]].push_back({U[i],W[i]});
    }
    long long ans = 0;
    dfs(x,-1,0,true);
    dfs(y,-1,0,false);
    vector<long long> wut(n);
    for(long long i = 0; i < n; i++) {
        wut[i] = min(bruh[i],wow[i]);
    }
    sort(wut.begin(),wut.end());
    long long sb = 0;
    for(long long i = 0; i < wut.size(); i++) {
        sb+=wut[i];
        if(sb > k) {
            break;
        }
        ans++;
    }
    dude(x,-1);
    if(k < 0) {
        return ans;
    }
    vector<long long> dp(2*n+1,LLONG_MAX/3);
    dp[0] = 0;
    for(long long i = 0; i < n; i++) {
        long long a = bruh[i],b = wow[i];
        if(a > b) {
            swap(a,b);
        }
        for(int j = 2*n; j >= 0; j--) {
            if(j > 0) {
                dp[j] = min(dp[j],dp[j-1]+a);
            }
            if(j > 1) {
                dp[j] = min(dp[j],dp[j-2]+b);
            }
        }
    }
    for(long long i = 0; i <= 2*n; i++) {
        if(dp[i] <= k) {
            ans = max(ans,i);
        }
    }
    return 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:80:28: warning: comparison of integer expressions of different signedness: 'long long int' and 'std::vector<long long int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   80 |     for(long long i = 0; i < wut.size(); i++) {
      |                          ~~^~~~~~~~~~~~
#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...