Submission #1327185

#TimeUsernameProblemLanguageResultExecution timeMemory
1327185simplemind_31Travelling Trader (CCO23_day2problem2)C++20
11 / 25
94 ms31556 KiB
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
int n,k,a,b,val[200000],sig1[200000],pad[200000];
ll solve2[200000];
vector<int> graph[200000];
ll dfs1(int node,int ante){
    ll maxi=0;
    for(auto u:graph[node]){
        if(u==ante)continue;
        pad[u]=node;
        ll temp=dfs1(u,node);
        if(temp>maxi){
            maxi=temp;
            sig1[node]=u;
        }
    }
    if(maxi==0)sig1[node]=node;
    return val[node]+maxi;
}
ll resfinal2;
vector<int> res2,temp2;
void dfs2(int node,int ante,bool dearriba){
    ll maxi=0;
    for(auto u:graph[node]){
        if(u==ante)continue;
        dfs2(u,node,!dearriba);
        maxi=max(maxi,solve2[u]-val[u]);
        solve2[node]+=val[u];
    }
    //solve2=suma de todo directamente y 
    solve2[node]+=maxi;
    resfinal2=max(resfinal2,solve2[node]);

}
void solveraiz(int node,int ante){
    // usar dos caminos distintos;
    vector<int> nums;
    for(auto u:graph[node]){
        if(u==ante)continue;
    }
    dfs2(node,ante,true);
}
int condis=0;
ll suma3;
vector<int> res3;
void dfs3(int node,int ante){
    bool xd=false;
    if(condis==3){
        res3.push_back(node);
        suma3+=val[node];
        condis=0;
        xd=true;
    }
    for(auto u:graph[node]){
        if(u==ante)continue;
        condis++;
        dfs3(u,node);
    }
    if(!xd){
        condis=0;
        suma3+=val[node];
        res3.push_back(node);
    }
    condis++;
}
int main(){
    ios_base::sync_with_stdio(0);
    cin.tie(0);cout.tie(0);
    cin >> n >> k;
    for(int i=1;i<n;i++){
        cin >> a >> b;
        graph[--a].push_back(--b);
        graph[b].push_back(a);
    }
    for(int i=0;i<n;i++)cin >> val[i];
    if(k==1){
        cout << dfs1(0,-1) << '\n';
        vector<int> res;
        int now=0;
        while(now!=sig1[now]){
            res.push_back(now);
            now=sig1[now];
        }
        res.push_back(now);
        cout << res.size() << '\n';
        for(auto u:res)cout << u+1 << ' ';
        return 0;
    }else if(k==2){
        // toda distancia impar es primero hijo luego nodo
        // toda distancia par es nodo luego hijo
        // pueden decidir volver o no

        // op1 elegir un camino recto  y sumar los que estan a distancia <=1 de ese camino
        // para comprobar mi teoria
        solveraiz(0,-1);
    }else{
        condis=3;
        dfs3(0,-1);
        cout << suma3 << '\n';
        cout << res3.size() << '\n';
        for(auto u:res3)cout << u+1 << ' ';
    }
}
#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...