結果
問題 | No.1976 Cut then Connect |
ユーザー |
|
提出日時 | 2023-12-07 15:21:20 |
言語 | C++14 (gcc 13.3.0 + boost 1.87.0) |
結果 |
AC
|
実行時間 | 252 ms / 2,000 ms |
コード長 | 6,841 bytes |
コンパイル時間 | 1,992 ms |
コンパイル使用メモリ | 190,836 KB |
実行使用メモリ | 27,396 KB |
最終ジャッジ日時 | 2024-09-27 02:10:59 |
合計ジャッジ時間 | 6,262 ms |
ジャッジサーバーID (参考情報) |
judge3 / judge5 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 2 |
other | AC * 31 |
コンパイルメッセージ
main.cpp: In lambda function: main.cpp:222:11: warning: structured bindings only available with '-std=c++17' or '-std=gnu++17' [-Wc++17-extensions] 222 | auto[a,b,c,d]=x; | ^ main.cpp:223:11: warning: structured bindings only available with '-std=c++17' or '-std=gnu++17' [-Wc++17-extensions] 223 | auto[A,B,C,D]=y; | ^ main.cpp: In lambda function: main.cpp:250:11: warning: structured bindings only available with '-std=c++17' or '-std=gnu++17' [-Wc++17-extensions] 250 | auto[a,b,c,d]=x; | ^
ソースコード
#include <bits/stdc++.h>using namespace std;#define repd(i,a,b) for (ll i=(a);i<(b);i++)#define rep(i,n) repd(i,0,n)#define all(x) (x).begin(),(x).end()template<class T> inline bool chmin(T& a, T b) { if (a > b) { a = b; return true; } return false; }template<class T> inline bool chmax(T& a, T b) { if (a < b) { a = b; return true; } return false; }typedef long long ll;typedef pair<ll,ll> P;typedef vector<ll> vec;using Graph = vector<vector<ll>>;const long long INF = 1LL<<60;const long long MOD = 1000000007;//https://nyaannyaan.github.io/library/graph/graph-template.hpptemplate <typename T>struct edge {int src, to;T cost;edge(int _to, T _cost) : src(-1), to(_to), cost(_cost) {}edge(int _src, int _to, T _cost) : src(_src), to(_to), cost(_cost) {}edge &operator=(const int &x) {to = x;return *this;}operator int() const { return to; }};template <typename T>using Edges = vector<edge<T>>;template <typename T>using WeightedGraph = vector<Edges<T>>;using UnweightedGraph = vector<vector<int>>;// Input of (Unweighted) GraphUnweightedGraph graph(int N, int M = -1, bool is_directed = false,bool is_1origin = true) {UnweightedGraph g(N);if (M == -1) M = N - 1;for (int _ = 0; _ < M; _++) {int x, y;cin >> x >> y;if (is_1origin) x--, y--;g[x].push_back(y);if (!is_directed) g[y].push_back(x);}return g;}// Input of Weighted Graphtemplate <typename T>WeightedGraph<T> wgraph(int N, int M = -1, bool is_directed = false,bool is_1origin = true) {WeightedGraph<T> g(N);if (M == -1) M = N - 1;for (int _ = 0; _ < M; _++) {int x, y;cin >> x >> y;T c;cin >> c;if (is_1origin) x--, y--;g[x].emplace_back(x, y, c);if (!is_directed) g[y].emplace_back(y, x, c);}return g;}// Input of Edgestemplate <typename T>Edges<T> esgraph(int N, int M, int is_weighted = true, bool is_1origin = true) {Edges<T> es;for (int _ = 0; _ < M; _++) {int x, y;cin >> x >> y;T c;if (is_weighted)cin >> c;elsec = 1;if (is_1origin) x--, y--;es.emplace_back(x, y, c);}return es;}// Input of Adjacency Matrixtemplate <typename T>vector<vector<T>> adjgraph(int N, int M, T INF, int is_weighted = true,bool is_directed = false, bool is_1origin = true) {vector<vector<T>> d(N, vector<T>(N, INF));for (int _ = 0; _ < M; _++) {int x, y;cin >> x >> y;T c;if (is_weighted)cin >> c;elsec = 1;if (is_1origin) x--, y--;d[x][y] = c;if (!is_directed) d[y][x] = c;}return d;}/*** @brief グラフテンプレート* @docs docs/graph/graph-template.md*///https://nyaannyaan.github.io/library/tree/rerooting.hpp// Rerooting// f1(c1, c2) ... merge value of child node// f2(memo[i], chd, par) ... return value from child node to parent node// memo[i] ... result of subtree rooted i// dp[i] ... result of tree rooted itemplate <typename T, typename G, typename F1, typename F2>struct Rerooting {const G &g;const F1 f1;const F2 f2;vector<T> memo, dp;T I;Rerooting(const G &_g, const F1 _f1, const F2 _f2, const T &I_): g(_g), f1(_f1), f2(_f2), memo(g.size(), I_), dp(g.size(), I_), I(I_) {dfs(0, -1);efs(0, -1, I);}const T &operator[](int i) const { return dp[i]; }void dfs(int cur, int par) {for (auto &dst : g[cur]) {if (dst == par) continue;dfs(dst, cur);memo[cur] = f1(memo[cur], f2(memo[dst], dst, cur));}}void efs(int cur, int par, const T &pval) {// get cumulative sumvector<T> buf;for (auto dst : g[cur]) {if (dst == par) continue;buf.push_back(f2(memo[dst], dst, cur));}vector<T> head(buf.size() + 1), tail(buf.size() + 1);head[0] = tail[buf.size()] = I;for (int i = 0; i < (int)buf.size(); i++) head[i + 1] = f1(head[i], buf[i]);for (int i = (int)buf.size() - 1; i >= 0; i--)tail[i] = f1(tail[i + 1], buf[i]);// updatedp[cur] = par == -1 ? head.back() : f1(pval, head.back());// propagateint idx = 0;for (auto &dst : g[cur]) {if (dst == par) continue;efs(dst, cur, f2(f1(pval, f1(head[idx], tail[idx + 1])), cur, dst));idx++;}}};/*** @brief Rerooting(全方位木DP)* @docs docs/tree/rerooting.md*/// auto mod int// https://youtu.be/L8grWxBlIZ4?t=9858// https://youtu.be/ERZuLAxZffQ?t=4807 : optimize// https://youtu.be/8uowVvQ_-Mo?t=1329 : divisionconst int mod = 1000000007;struct mint {ll x; // typedef long long ll;mint(ll x=0):x((x%mod+mod)%mod){}mint operator-() const { return mint(-x);}mint& operator+=(const mint a) {if ((x += a.x) >= mod) x -= mod;return *this;}mint& operator-=(const mint a) {if ((x += mod-a.x) >= mod) x -= mod;return *this;}mint& operator*=(const mint a) { (x *= a.x) %= mod; return *this;}mint operator+(const mint a) const { return mint(*this) += a;}mint operator-(const mint a) const { return mint(*this) -= a;}mint operator*(const mint a) const { return mint(*this) *= a;}mint pow(ll t) const {if (!t) return 1;mint a = pow(t>>1);a *= a;if (t&1) a *= *this;return a;}// for prime modmint inv() const { return pow(mod-2);}mint& operator/=(const mint a) { return *this *= a.inv();}mint operator/(const mint a) const { return mint(*this) /= a;}};istream& operator>>(istream& is, mint& a) { return is >> a.x;}ostream& operator<<(ostream& os, const mint& a) { return os << a.x;}using F=tuple<ll,ll,ll,ll>;int main(){ios::sync_with_stdio(false);cin.tie(0);ll n;cin>>n;auto g=graph(n,n-1,0,1);auto f1=[&](F x,F y){auto[a,b,c,d]=x;auto[A,B,C,D]=y;chmax(a,A);if(d==0&&D==0){c=B;}else if(d==0&&D==1){chmax(C,b);b=B;c=C;}else if(d==1&&D==0){chmax(c,B);}else{if(b<B){c=max(b,C);b=B;}else{chmax(c,B);}}if(b<c)swap(b,c);return F(a,b,c,1);};map<P,ll> mp;auto f2=[&](F x,ll ch,ll pa){auto[a,b,c,d]=x;chmax(a,b+c);mp[{ch,pa}]=a;b++;if(c>=1)c++;d=0;return F(a,b,c,d);};ll ans=INF;Rerooting<F,decltype(g),decltype(f1),decltype(f2)> dp(g,f1,f2,F(0,0,0,0));rep(i,n){for(ll ni:g[i]){if(i>ni)continue;ll x=mp[{i,ni}];ll y=mp[{ni,i}];ll now=0;chmax(now,x);chmax(now,y);chmax(now,(x+1)/2+(y+1)/2+1);chmin(ans,now);}}cout<<ans<<endl;return 0;}