简单建虚树方法

inline bool cmp(int x, int y) {return dfn[x] < dfn[y];}

inline void build()
{
	int K = gi <int> ();
	tmp.clear();
	for (int i = 1; i <= K; i+=1) tmp.pb(gi <int> ());
	sort(tmp.begin(), tmp.end(), cmp);
	int sz = (int)tmp.size();
	for (int i = 0; i < sz - 1; i+=1) tmp.pb(LCA :: getLCA(tmp[i], tmp[i + 1]));
	sort(tmp.begin(), tmp.end(), cmp);
	tmp.erase(unique(tmp.begin(), tmp.end()), tmp.end());
	tp = 0;
	for (auto x : tmp)
	{
		while (tp && low[stk[tp]] < dfn[x]) --tp;
		if (tp) g[stk[tp]].pb(x), g[x].pb(stk[tp]), vis[x] = vis[stk[tp]] = true;
		stk[++tp] = x;
	}
}
posted @ 2021-08-26 14:07  csxsi  阅读(68)  评论(2编辑  收藏  举报