初見安~這裡是傳送門:洛谷p4438 道路
題目乍一看很複雜, 其實挺簡單的——就是一棵有根的滿二叉樹,要從每個葉子節點出發到根節點,每條路有個性質,公路or鐵路,現在要選n-1條道路翻新,滿足題目所述的條件。
看n的範圍明顯是不能暴力列舉的。但是我們可以抓住一點——樹的深度不超過40。也就是說每個節點到根節點的路徑上,這兩種公路的數量都不會超過40。結合對題目套路的分析可得——樹形dp,設。然後從下往上樹形dp,到每個點都列舉一遍i和j,看當前這個點是修公路還是鐵路,最後即為所求。
上**——
#include#include#include#include#include#define maxn 40004
#define inf 999999999999999
using namespace std;
typedef long long ll;
int read()
while(isdigit(ch)) x = (x << 1) + (x << 3) + ch - '0', ch = getchar();
return x * f;
}int n, lson[maxn], rson[maxn];
ll c[maxn], f[maxn][41][41];
int a[maxn], b[maxn];
void dfs(int u, int fa, int dep) //因為每乙個葉子節點的花費都可以說是從最末端直接上來的,所以直接加沒問題。
}//因為是滿二叉樹,所以這個可以直接用於判斷是否有兒子
else for(int i = 0; i <= dep; i++) for(int j = 0; j <= dep; j++) f[u][i][j] = c[u] * (ll)(a[u] + i) * (ll)(b[u] + j);
}signed main()
for(int i = 1; i <= n; i++) a[n + i] = read(), b[n + i] = read(), c[n + i] = read();
for(int i = 1; i <= n; i++) for(int j = 0; j <= 40; j++) for(int k = 0; k <= 40; k++) f[i][j][k] = inf;
dfs(1, 0, 1);
printf("%lld\n", f[1][0][0]);
}
題解 HNOI AHOI2018 毒瘤
題目傳送門 給出乙個 n 個點 m 條邊的無向圖,問有多少個點集滿足點集中任意兩點均不存在邊相連。n le 10 5,m n le 10 答案對 998244353 取模。妙啊!首先我們從樹的形態開始考慮,你發現答案其實就是獨立集的個數,具體來說我們可以設 f 表示 u 點選或不選的方案數,可以得到...
HNOI AHOI2018 尋寶遊戲
hnoi ahoi2018 尋寶遊戲 思維好題。將每一位領出來,組成 m 個長度為 n 的二進位制數。考慮將操作轉化為 01 序列,lor to0,land to1 觀察之後發現要使得第 j 位運算結果是 1 則最後乙個 lor1 操作的位置一定要在 land0 後面。轉化一下就是就要求 x gt ...
HNOI AHOI2018 轉盤 題解
題目鏈結 好難的題。首先,有等待操作不太好弄。可以發現 在總時間一定的情況下,到每個點越晚越好。所以,可以把所有等待都移到起點處,解不會變差。由於是環,破環為鏈處理。如果在 s 時間在 i 1 i n 出發,那麼到 j i j的時間為 s j i 根據要求,得 s j i t j 即 s max t...