JSOI2013 哈利波特和死亡聖器

2022-05-02 02:06:12 字數 1087 閱讀 5807

傳送門

首先二分,這沒什麼好說的。

然後就成了乙個恆成立問題,就是說我們需要滿足最壞情況下的需求。

那麼顯然在最壞情況下伏地魔是不會走回頭路的 因為這顯然是白給

那麼我們肯定需要在所有它可能去的下乙個點都設定防禦。

也就是說要對當前ta所在點的所有葉子設防。

那麼我們就可以考慮 \(\text\) ,設 \(dp_i\) 表示在以 \(i\) 為根的子樹中設防(注意這裡不包括 \(i\) )還需要多少成員。

那麼轉移就是:\(dp_u = \max\ dp_v + son_u - mid, 0\}\)

其中 \(son_u\) 表示 \(u\) 的兒子個數,方程的意思就是說我們需要在 \(i\) 的所有孩子中設防並且要在孩子的子樹裡設防,顯然我們不會需要負數的人(其實就是表示人多了)所以減掉 \(mid\) 後對 \(0\) 取個 \(\max\) 。

#include #define rg register

#define file(x) freopen(x".in", "r", stdin), freopen(x".out", "w", stdout)

template < class t > inline t max(t a, t b)

template < class t > inline void read(t& s)

const int _ = 3e5 + 5;

int tot, head[_]; struct edge edge[_ << 1];

inline void add_edge(int u, int v) , head[u] = tot; }

int n, son[_], dp[_];

inline void dfs(int u, int f) }

inline void dfs(int u, int f, int mid)

dp[u] = max(dp[u], 0);}

inline bool check(int mid)

int main()

printf("%d\n", l);

return 0;

}

題解 JSOI2013 哈利波特與死亡聖器

轉化問題,即乙個點從根節點往下走,到達任意乙個點時,保證每乙個與他直接連通的點都被覆蓋了 沒有必要向上走,因為這只會留更多時間來修復 所以我們討論只下不上的情況 二分乙個 mid 代表當前共有 mid 個人 設 f i 為到了 i 點,且 i 的兒子全部未被覆蓋,需要之前多少次額外的來覆蓋 有 f ...

JSOI2013 旅行時的困惑

傳送門 由於我們的圖不僅是乙個 text 而且在形態上還是一棵樹,也就是說我們為了實現節點之間互相可達,就必須把每條邊都覆蓋一次,因為兩個點之間的路徑是唯一的。那麼題意就變成了 每次在圖上選出一條路徑,覆蓋上面的邊,求最小的路徑數使得所有邊都被覆蓋至少一次。看到這裡我不禁聯想起這道題 那麼對於這道題...

JSOI2013 快樂的 JYY 題解

題面傳送門 我們一句話題意 求兩個字串的公共回文子串的數量 首先對於每個串構造乙個回文自動機,然後由pam的定義可知 對於pam上從根節點轉移方式相同所到達的點代表的回文串是相同的 這樣對於兩個pam同時dfs,每次dfs到的節點的數值 在其原串中的出現數量 相乘,然後累加到答案裡 注意 要從偶原點...