Submission #170215

#TimeUsernameProblemLanguageResultExecution timeMemory
170215andrewHard route (IZhO17_road)C++17
52 / 100
2037 ms131012 KiB
#include <bits/stdc++.h>

#pragma GCC optimize("-O3")
#pragma GCC optimize("Ofast")
#pragma GCC optimize("unroll-loops")

#define fi first
#define se second
#define p_b push_back
#define pll pair<ll,ll>
#define pii pair<int,int>
#define m_p make_pair
#define all(x) x.begin(),x.end()
#define sset ordered_set
#define sqr(x) (x)*(x)
#define pw(x) (1ll << x)
#define sz(x) (int)x.size()

using namespace std;
typedef long long ll;
typedef long double ld;
const ll MAXN = 1123456;
const ll N = 1e6;
const ll inf = 3e18;
mt19937_64 rnd(chrono::system_clock::now().time_since_epoch().count());

template <typename T> void vout(T s){cout << s << endl;exit(0);}

vector <ll> v[MAXN];
bool is_leaf[MAXN];
vector <ll> leaves;
ll Mx[MAXN], kol[MAXN];

ll mx = 0, ans = 0;

void build(ll x, ll pr = 0){
    Mx[x] = 0;
    kol[x] = 1;
    for(auto to : v[x])if(to != pr){
        build(to, x);
        Mx[x] = max(Mx[x], Mx[to] + 1);
        kol[x] += kol[to];
    }
}

void calc(ll x, ll pr = 0, ll Sum = 0, ll deep = 0){
    ll mb = 0;
    if(is_leaf[x] && pr != 0){
        ll t = deep * Sum;
        if(t > mx){
            mx = t;
            ans = 0;
        }
        if(mx == t)ans++;
        return;
    }

    vector <ll> ver, suf, pref;

    for(auto to : v[x])if(to != pr){
        ver.p_b(to);
    }

    ll nn = sz(ver);
    pref.resize(nn);
    suf.resize(nn);

    for(int i = 0; i < nn; i++){
        pref[i] = max(Mx[ver[i]] + 1, (i == 0 ? 0 : pref[i - 1]));
    }

    for(int i = nn - 1; i >= 0; i--){
        suf[i] = max(Mx[ver[i]] + 1, (i == nn - 1 ? 0 : suf[i + 1]));
    }

    for(int i = 0; i < nn; i++){
        calc(ver[i], x, max(Sum, max((i == 0 ? 0 : pref[i - 1]), (i == nn - 1 ? 0 : suf[i + 1]))), deep + 1);

    }

}

int main(){
    ios_base :: sync_with_stdio(0);
    cin.tie(0);

    #ifdef LOCAL
        freopen("input.txt", "r", stdin);
        freopen("output.txt", "w", stdout);
    #endif // LOCAL


    ll n;

    cin >> n;

    for(int i = 1; i < n; i++){
        ll a, b;
        cin >> a >> b;
        v[a].p_b(b);
        v[b].p_b(a);
    }

    for(int i = 1; i <= n; i++){
        if(sz(v[i]) == 1){
            is_leaf[i] = 1;
            leaves.p_b(i);
        }
    }

    for(auto root : leaves){
        build(root);
        calc(root);
    }

    cout << mx << " " << ans / 2 << "\n";

    return 0;
}

Compilation message (stderr)

road.cpp: In function 'void calc(ll, ll, ll, ll)':
road.cpp:47:8: warning: unused variable 'mb' [-Wunused-variable]
     ll mb = 0;
        ^~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...