제출 #341602

#제출 시각아이디문제언어결과실행 시간메모리
341602amunduzbaev관광지 (IZhO14_shymbulak)C++14
100 / 100
169 ms20444 KiB
/** made by amunduzbaev **/ #include <bits/stdc++.h> using namespace std; #define ff first #define ss second #define pb push_back #define mp make_pair #define ub upper_bound #define lb lower_bound #define ll long long #define int long long #define ld long double #define pii pair<int, int> #define pll pair<ll, ll> #define sz(x) (int)x.size() #define all(x) x.begin(), x.end() #define rall(x) x.rbegin(),x.rend() #define fastios ios::sync_with_stdio(0);cin.tie(0);cout.tie(0); #define vll vector<ll> #define vii vector<int> #define vpii vector<pii> #define vpll vector<pll> #define cnt(a)__builtin_popcount(a) template<class T> bool umin(T& a, const T& b) {return a > b? a = b, true:false;} template<class T> bool umax(T& a, const T& b) {return a < b? a = b, true:false;} const int N = 2e5+5; const int mod = 1e9+7; const ll inf = 1e18; const ld Pi = acos(-1); int s, n, m, k; pii ans; vii edges[N]; stack<int> ss; bool used[N], cyc[N]; pii mxd[N]; vii cc; void dfs(int u, int p){ if(!cc.empty()) return; if(used[u]){ while(!ss.empty() && ss.top() != u){ cc.pb(ss.top()); ss.pop(); } cc.pb(u);return; } used[u] = 1; ss.push(u); for(auto x:edges[u]) if(x != p) dfs(x, u); if(!ss.empty()) ss.pop(); } pii merge(pii a, pii b){ if(a.ff > b.ff) return a; if(b.ff > a.ff) return b; return mp(a.ff, a.ss + b.ss); } pii find_tree(int u, int p){ vpii tmp; for(auto x:edges[u]){ if(cyc[x] || x == p) continue; pii tt = find_tree(x, u); tmp.pb(tt); mxd[u] = merge(tt, mxd[u]); } sort(all(tmp)); int n = sz(tmp); if(n >= 2){ pii b = tmp[n-2], a = tmp[n-1], c = {a.ff + b.ff, 0}; for(int i=0;i<n;i++){ if(tmp[i].ff == b.ff) c.ss += tmp[i].ss; } if(a.ff != b.ff){ c.ss *= a.ss; ans = merge(ans, c); }else{ c.ss *= c.ss; for(auto x:tmp){ if(x.ff == b.ff) c.ss -= x.ss * x.ss; } c.ss /= 2; ans = merge(c, ans); } }else ans = merge(ans, mxd[u]); return { mxd[u].ff+1, mxd[u].ss}; } void solve(){ cin>>n; for(int i=0;i<n;i++){ int a, b; cin>>a>>b; edges[a].pb(b); edges[b].pb(a); } for(int i=1;i<=n;i++) mxd[i] = {0, 1}; dfs(1, -1); int cyclen = sz(cc); for(auto x:cc) cyc[x] = 1; for(int i=1;i<=n;i++) if(cyc[i]) find_tree(i, -1); int p=0; map<int, int> mm; for(int i=0;i<cyclen-1;i++){ while(p < cyclen && p+p <= cyclen+i+i){ mm[(mxd[cc[p]].ff+p)] += mxd[cc[p]].ss; p++; } mm[mxd[cc[i]].ff+i] -= mxd[cc[i]].ss; if(!mm[mxd[cc[i]].ff+i]) mm.erase(mxd[cc[i]].ff+i); pii tmp = *mm.rbegin(); ans = merge(ans, {mxd[cc[i]].ff+tmp.ff-i, tmp.ss*mxd[cc[i]].ss}); } mm.clear(); p = cyclen-1; for(int i=cyclen-1;i>=0;i--){ while(p+p >= cyclen+i+i){ mm[mxd[cc[p]].ff+cyclen-p] += mxd[cc[p]].ss; p--; } if(mm.size()){ pii tmp = *mm.rbegin(); ans = merge(ans, {mxd[cc[i]].ff+i+tmp.ff, tmp.ss*mxd[cc[i]].ss}); } } cout<<ans.ss<<"\n"; return; } main(){ fastios int t = 0; if(!t) solve(); else { cin>>t; while (t--) solve(); } return 0; }

컴파일 시 표준 에러 (stderr) 메시지

shymbulak.cpp:146:6: warning: ISO C++ forbids declaration of 'main' with no type [-Wreturn-type]
  146 | main(){
      |      ^
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...