Submission #1276460

#TimeUsernameProblemLanguageResultExecution timeMemory
1276460HasanV11010238Shymbulak (IZhO14_shymbulak)C++20
100 / 100
128 ms17464 KiB
#include <bits/stdc++.h> #define ll long long #define INF 1000000000000000 #define mod 9929 using namespace std; vector<vector<int>> v; vector<int> ord, bl, al, vis; bool f = 0; void dfs(int x, int p){ vis[x] = 1; ord.push_back(x); for (auto el : v[x]){ if (vis[el] == 0){ dfs(el, x); } else if (vis[el] == 1 && el != p && f == 0){ int cur = (int)ord.size() - 1; f = 1; while (ord[cur] != el){ al.push_back(ord[cur]); cur--; } al.push_back(el); } } ord.pop_back(); } ll de = 0, cnt = 0; vector<ll> dd, cn; void dfs2(int x, int p){ dd[x] = dd[p] + 1; if (dd[x] > de) cnt = 0, de = dd[x]; if (dd[x] == de) cnt += 1; ll d1 = dd[x], ch = 0; for (auto el : v[x]){ if (el != p && bl[el] == 0){ ch++; dfs2(el, x); if (d1 + dd[el] - 2 * dd[x] > de) cnt = 0, de = d1 + dd[el] - 2 * dd[x]; if (d1 + dd[el] - 2 * dd[x] == de) cnt += cn[x] * cn[el]; if (dd[el] > d1) cn[x] = 0, d1 = dd[el]; if (dd[el] == d1) cn[x] += cn[el]; } } if (ch == 0) cn[x] = 1; dd[x] = d1; } int main(){ int n, a, b; cin>>n; v.assign(n + 1, vector<int>()), vis.assign(n + 1, 0), bl.assign(n + 1, 0), dd.assign(n + 1, 0), cn.assign(n + 1, 0); for (int i = 0; i < n; i++){ cin>>a>>b; v[a].push_back(b); v[b].push_back(a); } dd[0] = -1; dfs(1, 0); if (al.size() <= 2) assert(false); for (auto el : al){ bl[el] = 1; } for (auto el : al){ dfs2(el, 0); } int k = al.size(); for (int i = 0; i < k; i++) al.push_back(al[i]); map<ll, ll, greater<ll>> ma; ll si = k / 2; for (int i = k - si; i < k; i++){ ma[dd[al[i]] - i] += cn[al[i]]; } for (ll i = k; i < 2 * k; i++){ while (1){ if (ma.begin()->second != 0) break; ma.erase(ma.begin()); } ll ss = dd[al[i]] + ma.begin()->first + i; if (ss > de) cnt = 0, de = ss; if (ss == de) cnt += ma.begin()->second * cn[al[i]]; ma[dd[al[i]] - i] += cn[al[i]]; ll oth = i - si; ma[dd[al[oth]] - oth] -= cn[al[oth]]; } cout<<cnt; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...