題解 洛谷 P4886 快遞員

2022-05-06 20:03:10 字數 1234 閱讀 1311

考慮乙個節點成為根節點後,如何判斷其為最優的。

若最長距離的路徑中的任意一條滿足兩個端點在當前根節點的兩個不同的兒子中,則當前根節點為最優的。因為若將其調整為不在該路徑上的點,最長路徑的值會變大,將其調整為該路徑上別的點,可能會產生更長的路徑,因此該根節點為最優的。

若存在兩條最長距離的路徑的端點不來自同乙個兒子,則當前根節點為最優的。這也是可以用調整來證明的。

因此可以考慮點分治,當前根節點若是最優的就直接結束分治,否則就到最長距離的路徑端點對應的那個兒子中,以該子樹的重心作為下次的分治中心。

#include#define maxn 200010

#define inf 1000000000

using namespace std;

templateinline void read(t &x)

while(isdigit(c))

if(flag)x=-x;

}int n,m,ans=inf,root,tot,top;

int mx[maxn],siz[maxn],d[maxn],bel[maxn],st[maxn];

bool vis[maxn];

struct edge

e[maxn];

int head[maxn],edge_cnt;

void add(int from,int to,int val)

,head[from]=edge_cnt;

}struct query

q[maxn];

void dfs_root(int x,int fa)

mx[x]=max(mx[x],tot-siz[x]);

if(mx[x]val) val=v,st[top=1]=i;

else if(v==val) st[++top]=i;

}ans=min(ans,val),p=bel[q[st[top]].x];

if(vis[p]) return;

for(int i=1;i<=top;++i)

root=0,tot=siz[p],dfs_root(p,x),solve(root);

}int main()

for(int i=1;i<=m;++i) read(q[i].x),read(q[i].y);

tot=mx[0]=n,dfs_root(1,0),solve(1),printf("%d",ans);

return 0;

}

洛谷4886 快遞員 點分治

題目鏈結 題意 給你一棵n個點的樹,有m個點對,你要在樹上找乙個點x,使得對於所有的點對 u,v dis x,u dis x,v 最小,輸出這個最小值。n,m 100000 題解 感覺之前點分治學得不好,所以最近想補一下。這個題其實拿到題想過點分治,但是好像並不滿足分治常見的子問題結構,就沒想好怎麼...

洛谷 P1101 題解

這道題可以用深搜 回溯 來寫,相信大部分人都是這麼想的,但是有些人可能在一些地方饒了半天,所以這裡就貼一下我的思路,個人覺得自己的很好懂,除了tx和ty那裡,但是tx和ty的那種用法對於輸出路徑的題目一般很實用 這個算是比較簡單的吧,題目裡給出了具體要找的字串,我們要做的就是對它進行8個方向的搜尋,...

洛谷 P1169 題解

請你在乙個黑白矩陣中選出乙個長方形 含正方形 和正方形的子矩陣,使得所有相鄰的點顏色不一樣。矩陣大小 兩條邊都 2000 2000 2 000輸入 3 31 0 1 0 1 0 1 0 0輸出4 6解釋給定矩陣 正方形 長方形 我的控制台是萌萌噠 ffc0cb粉色 乙個小技巧 如果您的控制台是像我的...