社区讨论
自带两倍常数求救
P3379【模板】最近公共祖先(LCA)参与者 2已保存回复 2
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 2 条
- 当前快照
- 1 份
- 快照标识符
- @miempypt
- 此快照首次捕获于
- 2025/11/25 21:46 3 个月前
- 此快照最后确认于
- 2025/11/25 23:02 3 个月前
我同学随便一写就2s-,也是树剖,结果我这个就跑4s。没招了。
CPP#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define pb push_back
#define mpr make_pair
#define ld double
#define sdn cout
#define vi vector<int>
#define ull unsigned long long
#define fi first
#define se second
#define pii pair<int,int>
mt19937_64 rnd(time(nullptr));
const int N = 2e6 + 10,M = 1e6 + 10,INF1 = 1e9 + 7;
const ll INF2 = 1e18 + 7,MOD = 998244353;
const ull base = 131;
int n,m,k,q,T,rt,a[N],dfn[N],id[N],f[N],tp[N],siz[N],bson[N],dep[N],cnt;
vi lk[N];
ll ans;
void dfs1(int u,int fa){
siz[u] = 1;f[u] = fa;
dep[u] = dep[fa] + 1;
for(auto v : lk[u]){
if(v == fa) continue;
dfs1(v,u);
siz[u] += siz[v];
if(!bson[u] || siz[v] > siz[bson[u]]) bson[u] = v;
}
}
void dfs2(int u,int fa,int top){
tp[u] = top;
dfn[u] = ++cnt;
id[cnt] = u;
if(bson[u]) dfs2(bson[u],u,top);
for(auto v : lk[u]){
if(v == fa || v == bson[u]) continue;
dfs2(v,u,v);
}
}
int lca(int x,int y){
while(tp[x] != tp[y]){
if(dep[tp[x]] < dep[tp[y]]) swap(x,y);
x = f[tp[x]];
}
return id[dfn[dep[x]>dep[y]?y:x]];
}
int main(){
ios::sync_with_stdio(0),cin.tie(0);
cin>>n>>m>>rt;
for(int i = 1;i < n;i ++){
int u,v;cin>>u>>v;
lk[u].pb(v),lk[v].pb(u);
}
dfs1(rt,rt);
dfs2(rt,0,rt);
for(int i = 1;i <= m;i ++){
int x,y;cin>>x>>y;
sdn<<lca(x,y)<<endl;
}
return 0;
}
回复
共 2 条回复,欢迎继续交流。
正在加载回复...