Submission #334229

# Submission time Handle Problem Language Result Execution time Memory
334229 2020-12-08T17:15:30 Z talant117408 Hard route (IZhO17_road) C++17
0 / 100
9 ms 12140 KB
/*
    Code written by Talant I.D.
*/
  
#include <bits/stdc++.h>
  
using namespace std;
  
typedef long long ll;
typedef pair <int, int> pii;
typedef pair <ll, ll> pll;
  
#define precision(n) fixed << setprecision(n)
#define pb push_back
#define ub upper_bound
#define lb lower_bound
#define mp make_pair
#define eps (double)1e-9
#define PI 2*acos(0.0)
#define endl "\n"
#define sz(v) int((v).size())
#define all(v) v.begin(),v.end()
#define rall(v) v.rbegin(),v.rend()
#define do_not_disturb ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
#define OK cout << "OK" << endl;
  
inline bool isvowel(char ch){
    ch = tolower(ch);
    return (ch == 'a' || ch == 'e' || ch == 'i' || ch == 'o' || ch == 'u');
}
  
inline bool isprime(int n){
    if(n < 2 || (n%2 == 0 && n != 2)) return false;
    for(int i = 3; i*i <= n; i++)
        if(n%i == 0) return false;
    return true;
}
 
class Union{
    private:
        vector <int> saizu, link;
    public:
        Union(int n){
            saizu.assign(n, 1); link.resize(n); 
            iota(all(link), 0);
        }
        int find(int n){
            if(link[n] == n) return n;
            return link[n] = find(link[n]);
        }
        int same(int a, int b){
            return find(a) == find(b);
        }
        void unite(int a, int b){
            if(same(a, b)) return;
             
            a = find(a); b = find(b);
            if(saizu[a] < saizu[b]) swap(a, b);
             
            saizu[a] += saizu[b];
            link[b] = a;
        }
        int getsize(int a){
            return saizu[find(a)];
        }
};
 
const int mod = 1e9+7;
 
ll mode(ll a){
    a %= mod;
    if(a < 0) a += mod;
    return a;
}
 
ll subt(ll a, ll b){
    return mode(mode(a)-mode(b));
}
 
ll add(ll a, ll b){
    return mode(mode(a)+mode(b));
}
 
ll mult(ll a, ll b){
    return mode(mode(a)*mode(b));
}
 
ll binpow(ll a, ll b){
    ll res = 1;
    while(b){
        if(b&1) res = mult(res, a);
        a = mult(a, a);
        b >>= 1;
    }
    return res;
}

const int N = 5e5+7;
vector <vector <ll>> graph(N);
ll d_first, d_second, dist[N], on_diameter[N];
ll tmp, ind, cnt;
pll farthest[N];
vector <ll> d_ver;

void find_dends(ll v, ll p){
    dist[v] = dist[p] + 1;
    if(dist[v] > tmp){
        ind = v;
        tmp = dist[v];
    }
    for(auto to : graph[v]){
        if(to != p){
            find_dends(to, v);
        }
    }
}

void find_d(ll v, vector <ll> vec, ll p = -1){
    vec.pb(v);
    if(v == d_second){
        d_ver = vec;
        return;
    }
    for(auto to : graph[v]){
        if(to != p){
            find_d(to, vec, v);
        }
    }
    vec.pop_back();
}

void find_far(ll v, ll p){
    dist[v] = dist[p] + 1;
    if(tmp < dist[v]){
        tmp = dist[v];
        cnt = 1;
    }
    else if(tmp == dist[v]){
        cnt++;
    }
    for(auto to : graph[v]){
        if(to != p && !on_diameter[to]){
            find_far(to, v);
        }
    }
}

int main(){
    do_not_disturb
    
    // Reading the input
    ll n, i;
    cin >> n;
    for(i = 0; i < n-1; i++){
        ll x, y;
        cin >> x >> y;
        graph[x].pb(y);
        graph[y].pb(x);
    }
    
    // Finding the two diameter ends
    dist[1] = tmp = -1;
    find_dends(1, 1);
    d_first = ind;
    for(i = 1; i <= n; i++)
        dist[i] = 0;
    dist[d_first] = tmp = -1;
    find_dends(d_first, d_first);
    d_second = ind;
    for(i = 1; i <= n; i++)
        dist[i] = 0;
    
    // Finding vertices that lie on the diameter
    vector <ll> vec;
    find_d(d_first, vec);
    for(auto to : d_ver) on_diameter[to]++;
    
    // Finding for each vertex on the diameter the farthest node that doesn't lie on the diameter
    vector <pll> candidates;
    for(i = 1; i < sz(d_ver)-1; i++){
        tmp = cnt = dist[d_ver[i]] = -1;
        find_far(d_ver[i], d_ver[i]);
        if(tmp){ 
            /*
            candidates.pb(mp(tmp*2ll*ll(i), cnt*(cnt-1)/2ll));
            candidates.pb(mp(tmp*2ll*ll(sz(d_ver)-i-1), cnt*(cnt-1)/2ll));
            */
            if(i == tmp && sz(d_ver)-i-1 == tmp){
                candidates.pb(mp(tmp*tmp*2ll, ((cnt+2)*(cnt+1)/2)));
            }
            else if(i == tmp){
                candidates.pb(mp(tmp*2ll*(sz(d_ver)-i-1), (cnt+1)*cnt/2));
                candidates.pb(mp(((sz(d_ver)-i-1)+tmp)*tmp, (cnt+1)*cnt/2));
            }
            else if(sz(d_ver)-i-1 == tmp){
                candidates.pb(mp(tmp*2ll*i, (cnt+1)*cnt/2));
                candidates.pb(mp((i+tmp)*tmp, (cnt+1)*cnt/2));
            }
            else{
                candidates.pb(mp((tmp+i)*(sz(d_ver)-i-1), cnt));
                candidates.pb(mp((tmp+(sz(d_ver)-i-1))*i, cnt));
            }
        }
        else{
            candidates.pb(mp(0, 1));
        }
    }
    //for(auto to : d_ver) cout << to << ' ';
   // cout << endl;
    sort(all(candidates));
    
    //for(auto to : candidates) cout << to.first << ' ' << to.second << endl; 
    
    ll mx = 0, c = 0;
    if(!sz(candidates) || candidates.back().first == 0){
        cout << "0 1" << endl;
        return 0;
    }
    mx = candidates.back().first;
    c = candidates.back().second;
    candidates.pop_back();
    while(sz(candidates) && candidates.back().first == mx){
        c += candidates.back().second;
        candidates.pop_back();
    }
    cout << mx << ' ' << c;
    
    return 0;
}
# Verdict Execution time Memory Grader output
1 Correct 9 ms 12140 KB Output is correct
2 Correct 8 ms 12140 KB Output is correct
3 Correct 8 ms 12140 KB Output is correct
4 Correct 8 ms 12140 KB Output is correct
5 Correct 8 ms 12140 KB Output is correct
6 Correct 8 ms 12140 KB Output is correct
7 Incorrect 8 ms 12140 KB Output isn't correct
8 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 9 ms 12140 KB Output is correct
2 Correct 8 ms 12140 KB Output is correct
3 Correct 8 ms 12140 KB Output is correct
4 Correct 8 ms 12140 KB Output is correct
5 Correct 8 ms 12140 KB Output is correct
6 Correct 8 ms 12140 KB Output is correct
7 Incorrect 8 ms 12140 KB Output isn't correct
8 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 9 ms 12140 KB Output is correct
2 Correct 8 ms 12140 KB Output is correct
3 Correct 8 ms 12140 KB Output is correct
4 Correct 8 ms 12140 KB Output is correct
5 Correct 8 ms 12140 KB Output is correct
6 Correct 8 ms 12140 KB Output is correct
7 Incorrect 8 ms 12140 KB Output isn't correct
8 Halted 0 ms 0 KB -