답안 #533580

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
533580 2022-03-06T10:36:57 Z Slavita Parkovi (COCI22_parkovi) C++14
10 / 110
268 ms 20464 KB
#include <bits/stdc++.h>
/*#pragma optimize("O3")
#pragma GCC optimize("-O3")
#pragma GCC optimize("Ofast")
#pragma GCC optimize("unroll-loops")
#pragma GCC optimize("fast-math")*/
//#include <ext/pb_ds/assoc_container.hpp>
//#include <ext/pb_ds/tree_policy.hpp>
#define ve vector<int>
#define pb push_back
#define mp make_pair
#define fi first
#define se second
#define pi pair<int,int>
#define all(v) v.begin(),v.end()
#define si(v) (int)v.size()
#define en '\n'
#define ordered_set tree<int, null_type,less<int>, rb_tree_tag,tree_order_statistics_node_update>
#define ordered_muiltiset tree<int, null_type,less_equal<>, rb_tree_tag,tree_order_statistics_node_update>
#define int long long
using namespace std;
//using namespace __gnu_pbds;
typedef long long ll;
typedef unsigned long long ull;

const int N = 2e5 + 228;
const int big = 1e9 + 228;
const ll llbig = 1e18 + 228;
//ordered_set os; // os.order_of_key(4), (*os.find_by_order(5))
int n, m, ans, k, q, d[N], longest, allsm, pr[N];
ve ansv;
vector<pair<int, int>> g[N];

void dfs(int v, int dist, int pr){
    if (dist <= d[v]){
        d[v] = dist;
    }else return;

    for (int i = 0; i < si(g[v]); i++){
        int u = g[v][i].fi;
        int cost = g[v][i].se;
        if (u == pr) continue;

        dfs(u, dist + cost, v);
    }
}

void dfs2(int v, int dist, int pr){
    longest = max(longest, dist);
    for (int i = 0; i < si(g[v]); i++){
        int u = g[v][i].fi;
        int cost = g[v][i].se;
        if (u == pr) continue;

        dfs(u, dist + cost, v);
    }
}

bool getbit(int mask, int bit){
    bit--;
    return (mask & (1 << bit)) == (1 << bit);
}

#undef int
int main(){
    #define int long long
    iostream::sync_with_stdio(false); cin.tie(0); ios_base::sync_with_stdio(false); cout.tie(0);
    //freopen("input.txt","r",stdin);
    //freopen("output.txt","w",stdout);
    cin >> n >> k;
    vector<pair<int, pair<int, int>>> reb;
    for (int i = 1; i <= n - 1; i++){
        int a, b, d;
        cin >> a >> b >> d;
        g[a].pb({b, d});
        g[b].pb({a, d});
        if (a > b) swap(a, b);
        reb.pb({a, {b, d}});
        allsm += d;
    }

    ans = llbig;
    if (n > 20){
        sort(all(reb));
        for (int i = 1; i <= n; i++){
            pr[i] = pr[i - 1] + reb[i - 1].se.se;
        }
        int ans = llbig, ani;
        for (int i = 1; i <= n - 1; i++){
            int what = max(pr[n - 1] - pr[i - 1], pr[i - 1]);
            if (ans > what){
                ans = what;
                ani = i;
            }
        }
        cout << ans << en << ani;
        return 0;
    }else{
        for (int mask = 1; mask <= (1 << n); mask++){
            ve v;
            for (int i = 1; i <= n; i++){
                if (getbit(mask, i)){
                    v.pb(i);
                }
            }
            if (si(v) != k) continue;

            for (int i = 1; i <= n; i++) d[i] = llbig;
            for (int i = 0; i < si(v); i++){
                dfs(v[i], 0, -1);
            }

            int mx = -llbig;
            for (int i = 1; i <= n; i++){
                mx = max(mx, d[i]);
            }

            if (mx < ans){
                ans = mx;
                ansv = v;
            }
        }
    }

    cout << ans << en;
    for (int i = 0; i < si(ansv); i++){
        cout << ansv[i] << ' ';
    }
    return 0;
}
# 결과 실행 시간 메모리 Grader output
1 Correct 226 ms 5016 KB Output is correct
2 Correct 234 ms 5012 KB Output is correct
3 Correct 227 ms 5008 KB Output is correct
4 Correct 243 ms 5020 KB Output is correct
5 Correct 240 ms 5012 KB Output is correct
6 Correct 226 ms 5016 KB Output is correct
7 Correct 230 ms 5008 KB Output is correct
8 Correct 226 ms 4940 KB Output is correct
9 Correct 268 ms 5012 KB Output is correct
10 Correct 221 ms 5012 KB Output is correct
11 Correct 246 ms 4940 KB Output is correct
12 Correct 260 ms 5012 KB Output is correct
13 Correct 232 ms 5012 KB Output is correct
14 Correct 234 ms 5008 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 67 ms 19628 KB Output is correct
2 Correct 84 ms 20040 KB Output is correct
3 Incorrect 107 ms 20464 KB Output isn't correct
4 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 89 ms 20276 KB Unexpected end of file - int32 expected
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 226 ms 5016 KB Output is correct
2 Correct 234 ms 5012 KB Output is correct
3 Correct 227 ms 5008 KB Output is correct
4 Correct 243 ms 5020 KB Output is correct
5 Correct 240 ms 5012 KB Output is correct
6 Correct 226 ms 5016 KB Output is correct
7 Correct 230 ms 5008 KB Output is correct
8 Correct 226 ms 4940 KB Output is correct
9 Correct 268 ms 5012 KB Output is correct
10 Correct 221 ms 5012 KB Output is correct
11 Correct 246 ms 4940 KB Output is correct
12 Correct 260 ms 5012 KB Output is correct
13 Correct 232 ms 5012 KB Output is correct
14 Correct 234 ms 5008 KB Output is correct
15 Correct 67 ms 19628 KB Output is correct
16 Correct 84 ms 20040 KB Output is correct
17 Incorrect 107 ms 20464 KB Output isn't correct
18 Halted 0 ms 0 KB -