北京集訓D2T3 tvt

2022-02-28 14:03:53 字數 1472 閱讀 9681

首先需要對兩條路徑求交,對給出的四個點的6個lca進行分類討論。易於發現路徑的交就是這六個lca裡面最深的兩個所形成的鏈。

然後即可再分兩種情況進行討論。

對於同向的路徑,我們可以求出到達交的起點的時間差,然後與鏈上的最長邊進行比較,如果大於說明可行。

對於對向的路徑,如果能在時間差內走到交集上,同時不是在乙個頂點相遇那麼一定就是合法情況,否則就是不合法情況。這部分可以用倍增解決。

#include using namespace std;

const int maxn=1e5+7;

#define ll long long

#define ls (rt<<1)

#define rs (rt<<1|1)

#define mid ((l+r)>>1)

struct poedge[maxn<<1];

ll head[maxn],n,m,u1,v1,t1,u2,v2,t2,st[maxn<<2],size[maxn],fa[maxn],dep[maxn],top[maxn],id[maxn],w[maxn],val[maxn],wson[maxn];

ll cnt,num,mx[maxn<<2];

inline void pushup(int rt)

inline void dfs1(int u,int f)

ll query(int l,int r,int l,int r,int rt)

inline int find(int x,int y)

if(dep[x]>dep[y]) return y;

else return x;

}inline ll query_max(int x,int y)

inline ll query(int x,int y)

inline void add_edge(int from,int to,ll dis)

inline ll read()

int main()

else

if(cnt1>cnt2)

if(pass>cnt5)

if(pass==0) puts("no");

else puts("yes");

} else

if(pass==0) puts("no");

else puts("yes");

}} else

if(pass>cnt6)

if(pass==0) puts("no");

else puts("yes");

} else

if(pass==0) puts("no");

else puts("yes");}}

} }return 0;

}

D2T3 運輸計畫

ta sk一棵n節點樹,m個詢問求 a b 路徑距離。改動一條邊距為0,求m個詢問中最大距離的最小值。so luti on方法一 暴力出奇蹟。根據題意 改動一條邊 最樸素的做法是o n 列舉改動哪一條邊,該邊只對路徑中存在該邊的詢問有影響。詢問可以按照是否包含該邊分為兩類,an s ma x 包含的...

FJ省隊集訓DAY3 T2

思路 如果乙個dag要的路徑上只要一條邊去切掉,那麼要怎麼求?很容易就想到最小割,但是如果直接做最小割會走出重複的部分,那我們就這樣 反向邊設為inf,這樣最小割的時候就不會割到了,判斷無解我們直接用tarjan 1 include2 include3 include4 include5 inclu...

D班集訓day1t2 道路分組(貪心)

比較簡單的一道題。因為分組必須連續,故可以直接貪心。能加則加,不能加則不加,更新可以用類似於增廣的思想去做 include using namespace std define rep i,j,k for int i j i k i define repp i,j,k for int i j i k...