Submission #1078809

#TimeUsernameProblemLanguageResultExecution timeMemory
1078809PoPularPlusPlusClosing Time (IOI23_closing)C++17
9 / 100
111 ms25424 KiB
#include "closing.h"
#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define all(x) x.begin(),x.end()
#define pb(x) push_back(x)
#define mp(x,y) make_pair(x,y)
#define vf first
#define vs second

int max_score(int n, int x, int y, ll k,vector<int> u, vector<int> v, vector<int> w){
    int ans = 2;
    vector<pair<int,ll>> adj[n];
    for(int i = 0; i < n-1; i++){
        adj[u[i]].pb(mp(v[i] , w[i]));
        adj[v[i]].pb(mp(u[i] , w[i]));
    }

    int dis1[n] , dis2[n];
    memset(dis1,-1,sizeof dis1);
    memset(dis2,-1,sizeof dis2);

    queue<int> q;
    q.push(x);
    dis1[x] = 0;
    while(q.size()){
        int node = q.front();
        q.pop();
        for(auto it : adj[node]){
            if(dis1[it.vf] == -1){
                dis1[it.vf] = dis1[node] + it.vs;
                q.push(it.vf);
            }
        }
    }


    dis2[y] = 0;
    q.push(y);

    while(q.size()){
        int node = q.front();
        q.pop();
        for(auto it : adj[node]){
            if(dis2[it.vf] == -1){
                dis2[it.vf] = dis2[node] + it.vs;
                q.push(it.vf);
            }
        }
    }

    bool visx[n] , visy[n];

    for(int i = 0; i < (1 << n); i++){
        int res = 0;
        ll rem = k;
        memset(visx,0,sizeof visx);
        memset(visy,0,sizeof visy);

        if(((1 << x) & i)){
            visx[x] = 0;
            q.push(x);
            while(q.size()){
                int node = q.front();
                q.pop();
                for(auto it : adj[node]){
                    if(!visx[it.vf]){
                        if((i & (1 << it.vf))){
                            visx[it.vf] = 1;
                            q.push(it.vf);
                        }
                    }
                }
            }
        }

        if(((1 << y) & i)){
            visy[x] = 0;
            q.push(x);
            while(q.size()){
                int node = q.front();
                q.pop();
                for(auto it : adj[node]){
                    if(!visy[it.vf]){
                        if((i & (1 << it.vf))){
                            visy[it.vf] = 1;
                            q.push(it.vf);
                        }
                    }
                }
            }
        }

        vector<int> v;
        for(int j = 0; j < n; j++){
            if((i & (1 << j))){
                if(visx[j] && visy[j]){
                    res++;
                    rem -= min(dis1[j] , dis2[j]);
                    v.pb(max(dis1[j] , dis2[j]) - min(dis2[j] , dis1[j]));
                }
                else if(visx[j]){
                    rem -= dis1[j];
                    res++;
                }
                else if(visy[j]){
                    rem -= dis2[j];
                    res++;
                }
            }
        }

        if(rem >= 0){
            sort(all(v));
            for(int i : v){
                if(rem - i >= 0){
                    res++;
                    rem -= i;
                }
            }

            ans = max(ans , res);
        }
    }

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