題解:既然只有5個點,那就無限亂搞,我的做法是不斷取出當前點集兩兩之間的lca插入點集,直到所有兩兩之間的lca都已經在點集中了。
這一步的時間複雜度我感覺是乙個調和級數,是可以被忽略的。
然後對每個點儲存它的最深父親,然後對點集建一棵樹,對這棵樹算邊權貢獻即可。
#includeusingnamespace
std;
const
int maxn=2e5+100
;int
n,q;
struct
node edge[maxn
<<1
];int
head[maxn],tot;
void addedge (int u,int v,int
w)
int father[30
][maxn];
inth[maxn],d[maxn];
void dfs (int
x) }
int lca (int x,int
y)
return father[0
][x];
}int getdis (int x,int
y) int geth (int x,int
y) int
x[maxn],ans,f[maxn];
vector
g[maxn];
void dfs1 (int x,int
f) }
intmain ()
h[1]=1
; dfs(1);
for (int i=1;i<=20;i++) for (int j=1;j<=n;j++) father[i][j]=father[i-1][father[i-1
][j]];
scanf("%d
",&q);
while (q--)
while (1
) }
}if (f) break
; }
for (int i=1;i<=m;i++) f[x[i]]=0
,g[x[i]].clear();
for (int i=1;i<=m;i++)
}else
if (tt==x[j]) }}
}int rt=0
;
for (int i=1;i<=m;i++)
g[f[x[i]]].push_back(x[i]);
}ans=0
; dfs1(rt,0);
printf(
"%d\n
",ans);}}
昔我往矣 樹上亂搞 lca,樹鏈剖分
原做法 樹上倍增 lca,可能生成樹的時候複雜度太高,用的是類似並查集的合併方式。oj上的大佬 樹鏈剖分 lca 先補乙個變數vector 跟著別人的程式修改,發現連續re那麼多次,差別竟在 int dfs與void dfs。re可能是子程式用了函式。按照別人的思路改完了。樹鏈剖分。樹鏈剖分是用子樹...
「昔之善戰者,先為不可勝,以待敵之可勝」的理解
理論 孫子兵法 形篇 孫子曰 昔之善戰者,先為不可勝,以待敵之可勝。不可勝在己,可勝在敵。故善戰者,能為不可勝,不能使敵之必可勝。故曰 勝可知,而不可為。譯文 孫子說 以前善於用兵作戰的人,總是首先創造自己不可戰勝的條件,並等待可以戰勝敵人的機會。使自己不被戰勝,其主動權掌握在自己手中 敵人能否被戰...
昔憂 CEU 驗證碼識別引擎v1 2重大更新
新增 黑白化,新增4種黑白化方式,畫素最多置為黑色 畫素最多置為背景色 非白色畫素置為黑色 自動處理。點 線處理,新增了2大濾鏡,去除干擾線 提取字元。形態學變化,新增了自定義配置功能。新增清除背景色濾鏡,提供了按色值,亮度,以及自動去背景色功能。支援滑鼠自動取色。新增了常規配置,快速去除干擾1 雜...