51nod 省選 模測 A 樹的雙直徑 樹形dp

2022-04-29 20:33:15 字數 1665 閱讀 8830

題目鏈結

比賽結束後才調出來。。不多說啥了,就是因為自己菜。

裸的up-down dp,維護一下乙個點上下的直徑就行,一開始還想了個假的思路寫了半天。。

轉移都在**注釋裡

毒瘤題目卡空間

#include#define pair pair#define mp(x, y) make_pair(x, y)

#define fi first

#define se second

#define ll long long

using namespace std;

const int maxn = 6e5 + 10;

template inline bool chmin(a &a, b b) return 0;}

template inline bool chmax(a &a, b b) return 0;}

template inline void debug(a a)

template inline ll sqr(a x)

inline int read()

while(c >= '0' && c <= '9') x = x * 10 + c - '0', c = getchar();

return x * f;

}void print(__int128 x)

int n, p[maxn * 2], ve[maxn * 2];

long long f[maxn], g[maxn], mxpre[maxn], mxsuf[maxn], dl[maxn], ul[maxn];

__int128 ans;

vectorv[maxn];

void downdfs(int x, int fa)

}void updfs(int x, int fa)

long long mx1 = -1e18, mx2 = -1e18, mx3 = -1e18;

for(int i = 1; i <= cnt; i++)

mx1 = -1e18, mx2 = -1e18, mx3 = -1e18;

for(int i = cnt; i >= 1; i--)

for(int i = 0; i < v[x].size(); i++)

if(v[x][i].fi != fa) updfs(v[x][i].fi, x); }

signed main()

downdfs(1, 0);

updfs(1, 0);

for(int i = 2; i <= n; i++) chmax(ans, (__int128) dl[i] * ul[i]);

for(int i = 1; i <= n; i++) for(auto &tp : v[i]) tp.se = -tp.se;

memset(ul, 0, sizeof(ul));

memset(g, 0, sizeof(g));

downdfs(1, 0);

updfs(1, 0);

for(int i = 2; i <= n; i++) chmax(ans, (__int128) dl[i] * ul[i]);

print(ans);

//cout << ans;

return 0;

}

51Nod 大數階乘 大數取模

1057 n的階乘 基準時間限制 1 秒 空間限制 131072 kb 分值 0 難度 基礎題 輸入n求n的階乘的準確值。input 輸入n 1 n 10000 output 輸出n的階乘input示例 5output示例 120 include define max 1000000 5 using...

多項式 DP 省選模擬51nod抽卡大賽

的dp很容易能想到 定義d p i j k dp i j k dp i j k 表示第i個人選j時,有k個人比它小的概率 然後就能直接算期望了。不過這玩意顯然要t 發現,對於乙個已經固定的i,j,那麼剩下的所有人的所有情況本質上只有2種 比ai,ja ai,j 小,比ai,ja ai,j 大。那麼可...

51 nod 蘋果曼和樹

1500 蘋果曼和樹 基準時間限制 1 秒 空間限制 131072 kb 分值 80 難度 5 級演算法題 收藏 關注 蘋果曼有一棵 n個點的樹。有一些 至少乙個 結點被標記為黑色,有一些結點被標記為白色。現在考慮乙個包含 k 0 k n 條樹邊的集合。如果蘋果曼刪除這些邊,那麼會將這個樹分成 k ...