又咕咕了幾天\(qwq\)
我們先將原問題轉化為\(log_2n\)個判定問題;
如何\(ck(x)\):把所有\(>x\)的路徑在樹上標記(邊差分),然後找到被所有\(>x\)路徑覆蓋的點(邊轉點,邊權下放點權),嘗試把這個點的權值改為零,檢查最長路徑的時間是否\(\leq x\).
若存在這樣的點,\(return\ true\),否則\(return\ false\).
#include#include#include#include#include#define ull unsigned long long
#define ll long long
#define r register int
using namespace std;
#define pause (for(r i=1;i<=10000000000;++i))
#define in freopen("noipak++.in","r",stdin)
#define out freopen("out.out","w",stdout)
namespace fread inline bool isempty(const char& ch)
inline void gs(char* s)
} using fread::g; using fread::gs;
namespace luitaryi e[n];
int n,m,cnt,mx;
int vr[n<<1],nxt[n<<1],w[n<<1],w[n],fir[n],d[n],dis[n],f[n][20],c[n],s[n],lg[n];
inline void add(int u,int v,int ww)
inline void dfs(int u)
}inline int lca(int u,int v)
inline bool ck(int x)
inline bool cmp(const int& a,const int& b)
inline void main() printf("%d\n",l);}}
signed main()
2019.07.25 P2680 運輸計畫(二分 樹上差分)
鏈結分析 二分 樹上差分。首先可以二分乙個答案,那麼所有比這個答案大的路徑,都需要減去些東西才可以滿足這個答案。那麼減去的這條邊一定在所有的路徑的交集上。那麼如果求快速的求出這個交集並判斷呢,樹剖可以,把所有大於的路徑都標記一下,然後判斷,複雜度太大了。於是用到了樹上差分,get新技能。在兩個端點出...
P2680 運輸計畫 二分 LCA 樹上差分
公元20442044 年,人類進入了宇宙紀元。l 國有 nn 個星球,還有 n 1n 1 條雙向航道,每條航道建立在兩個星球之間,這 n 1n 1 條航道連通了 ll 國的所有星球。小 p 掌管一家物流公司,該公司有很多個運輸計畫,每個運輸計畫形如 有一艘物流飛船需要從 u iu i 號星球沿最快的...
洛谷P2680 運輸計畫(樹上差分 二分)
傳送門 考慮樹上亂搞 首先這是滿足二分性質的,如果在某個時間可以完成工作那麼比他更長的時間肯定也能完成工作 然後考慮二分,設當前答案為 mid 如果有一條鏈的長度大於 mid 那麼這條鏈上必須得刪去一條邊。我們可以貪心的刪去所有可以刪去的邊中最長的,然後看看最長邊減去刪去的邊是否小於等於 mid 如...