乙個樹上有若干點上有人,找出乙個集合點,使得所有人都到達這個點的時間最短(無碰撞)
就是找樹的直徑,找直徑的時候記得要找有人的點
#include#include#includeusing namespace std;
#define pb push_back
#define f first
#define s second
#define mkp make_pair
const int maxn=1e5+5;
typedef long long ll;
const int inf=1e10;
int n,k,id,x,y,vis[maxn],head[maxn];
struct nodeedge[maxn*4];
int cnt=0;
void add(int x,int y)
int a[maxn];
int now=0;
void dfs(int x,int fa,int dep)
for(int i=head[x];i!=-1;i=edge[i].next)
}int main()
for(int i=1;i<=k;i++)
scanf("%d",&a[i]),vis[a[i]]=1;
dfs(1,0,0);
now=0;
dfs(id,0,0);
printf("%d\n",(now+1)/2);
return 0;
}
2019牛客多校第四場 D triples I
對於二進位制每一位上的1進行考慮,2 0 3 1 2 1 3 2 2 2 3 1 2 3 3 2 那麼我們可以想到把a轉化為二進位制,然後他 3 1的位數有cnt1個,3 2的位數有cnt2個。我們可以想到每個數字最多由2個數字組成,下面給出證明。那麼 sum a 3,如果sum 0,那麼直接乙個數...
2019牛客多校第四場 A meeting
考場上寫了一大坨樹形dp,寫的時候就感覺我這不是跟求樹的最長鏈寫的一毛一樣 然後考後看題解,果然是k個ren所連成的子樹的最長鏈的一半 可以利用反證法證明,如果在長度為d的最長鏈的中間放乙個中心,如果有另外乙個點到這個點的長度 d 1 2,那麼這個點到對面的那個點的長度大於d,所以不存在這樣乙個點。...
2019牛客多校第四場A K
a.給你一張n個點n 1條邊的圖,和k個關鍵點。求乙個點到所有關鍵點距離最大值的最小為多少。乍一看像是對答案二分,但是考慮兩個相距最遠的關鍵點,假設他們的距離為d,那麼答案肯定為 d 1 2 如果有一點到中心點的距離超過了 d 1 2 那麼這個點會成為最遠關鍵點對中的乙個。矛盾。所以題目就變成了如何...