把兩種顏色的點,看成兩顆樹做合併,
所以答案就是合併之後的直徑。
所以我們需要維護直徑,然後直接就只和原樹的兩個點有關,直接預處理即可。
一般有兩種方法:先求深度最大的點,必然在直徑上,然後找另乙個。或者一直維護直徑的兩個端點。
注釋的地方是第一種方法。常數更小。
ac**:
#pragma gcc optimize("-ofast","-funroll-all-loops")
#include
//#define int long long
using namespace std;
const
int n=
1e5+10;
int n,q,c[n]
,f[n][20
],dep[n]
; unordered_map<
int,
int> mp;
vector<
int> g[n]
,v,vec[n]
;inline
intadd
(int a,
int b)
inline
intget
(int x)
void
dfs(
int x,
int fa)
inline
intlca
(int x,
int y)
inline
intdis
(int x,
int y)
signed
main()
// sort(vec[i].begin(),vec[i].end(),(int a,int b));
// for(int j=2;j// if(dis(vec[i][j],vec[i][0])>dis(vec[i][0],vec[i][1])) vec[i][1]=vec[i][j];
}for
(int i=
1,x,y,res;i<=q;i++
) x=
get(x)
,y=get
(y); res=0;
for(
int j=
0;j<
min(2,
(int
)vec[x]
.size()
);j++
)for
(int k=
0;k<
min(2,
(int
)vec[y]
.size()
);k++
) res=
max(res,
dis(vec[x]
[j],vec[y]
[k]));
printf
("%d\n"
,res);}
return0;
}
侏羅紀公園
既然一切都是 設計 出來的,在1裡面,明明是個人的錯誤 那個白痴胖子偷胚胎 卻被擴充套件成整個系統的錯誤 這部電影主要是宣揚這個主題。就像世貿大廈被 襲擊了,然後我們不怪罪 卻怪罪樓蓋得不結實,如果也拍一部電影宣揚這個主題,我們大家怕是都要笑導演弱智,奇怪的是好像沒有人笑史匹柏在這部片裡表現的弱智。...
小白逛公園
描述 小新經常陪小白去公園玩,也就是所謂的遛狗啦 在小新家附近有一條 公園路 路的一邊從南到北依次排著n個公園,小白早就看花了眼,自己也不清楚該去哪些公園玩了。一開始,小白就根據公園的風景給每個公園打了分 小新為了省事,每次遛狗的時候都會事先規定乙個範圍,小白只可以選擇第a個和第b個公園之間 包括a...
小白逛公園
小白逛公園 time limit 20000ms memory limit 65536k case time limit 2000ms description 小新經常陪小白去公園玩,也就是所謂的遛狗啦 在小新家附近有一條 公園路 路的一邊從南到北依次排著n個公園,小白早就看花了眼,自己也不清楚該去...