題目鏈結
比賽結束後才調出來。。不多說啥了,就是因為自己菜。
裸的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 ...