洛谷 HNOI AHOI2018 道路

2021-10-01 14:12:54 字數 1339 閱讀 9038

初見安~這裡是傳送門:洛谷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...