結果
問題 |
No.3206 う し た ウ ニ 木 あ く ん 笑
|
ユーザー |
|
提出日時 | 2025-07-18 22:13:18 |
言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
結果 |
AC
|
実行時間 | 245 ms / 3,000 ms |
コード長 | 2,811 bytes |
コンパイル時間 | 1,983 ms |
コンパイル使用メモリ | 207,164 KB |
実行使用メモリ | 94,556 KB |
最終ジャッジ日時 | 2025-07-18 22:13:27 |
合計ジャッジ時間 | 5,863 ms |
ジャッジサーバーID (参考情報) |
judge5 / judge4 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 2 |
other | AC * 30 |
ソースコード
#include <bits/stdc++.h> using namespace std; template<typename T> class Cumulative{ //1次元. private: T op(T a,T b){return max(a,b);} T inv(T a){return -a;} //ない場合はスルー->rangeans使用不可. T e(){return 0;} int n; vector<T> L,R; public: Cumulative(){} Cumulative(vector<T> &A){make(A);} void make(vector<T> &A){ L = A,R = A; n = A.size(); for(int i=1; i<n; i++) L.at(i) = op(L.at(i-1),L.at(i)); for(int i=n-2; i>=0; i--) R.at(i) = op(R.at(i),R.at(i+1)); } T rangeans(int l,int r){ //[l,r]だよL<0も許容 逆元はいる. if(l > r || r < 0) return e(); T ret = L.at(r); if(l > 0) ret = op(ret,inv(L.at(l-1))); return ret; } T skipone(int pos){ //0<=pos<n; T ret = e(); if(pos > 0) ret = L.at(pos-1); if(pos != n-1) ret = op(ret,R.at(pos+1)); return ret; } T skiprange(int l,int r){//l<=r. T ret = e(); if(l > 0) ret = L.at(l-1); if(r != n-1) ret = op(ret,R.at(r+1)); return ret; } T get(int pos){return L.at(pos);} vector<T> allA(){return L;} }; int main(){ ios_base::sync_with_stdio(false); cin.tie(nullptr); int N; cin >> N; vector<vector<int>> Graph(N); for(int i=0; i<N-1; i++){ int u,v; cin >> u >> v; u--; v--; Graph.at(u).push_back(v); Graph.at(v).push_back(u); } vector<int> par(N,-1); vector<vector<int>> kid(N); { auto dfs = [&](auto dfs,int pos,int back) -> int { int ret = 0; for(int i=0; i<Graph.at(pos).size(); i++){ int to = Graph.at(pos).at(i); if(to == back){ kid.at(pos).push_back(-1); par.at(pos) = i; } else{ int k = dfs(dfs,to,pos); kid.at(pos).push_back(k); ret = max(ret,k); } } return ret+1; }; dfs(dfs,0,-1); } int answer = 1; { auto dfs = [&](auto dfs,int pos,int back,int take) -> void { if(back != -1) kid.at(pos).at(par.at(pos)) = take; auto S = kid.at(pos); sort(S.rbegin(),S.rend()); for(int i=0; i<S.size(); i++){ int v = S.at(i); answer = max(answer,v*(i+1)+1); } Cumulative Z(kid.at(pos)); for(int i=0; i<Graph.at(pos).size(); i++){ int to = Graph.at(pos).at(i); if(to == back) continue; int give = Z.skipone(i); dfs(dfs,to,pos,give+1); } }; dfs(dfs,0,-1,-1); } cout << answer << endl; }