| 比赛 |
寒假集训2 |
评测结果 |
AAAAAAAAAAAAAAAAAAAA |
| 题目名称 |
轻重边 |
最终得分 |
100 |
| 用户昵称 |
zhyn |
运行时间 |
6.473 s |
| 代码语言 |
C++ |
内存使用 |
14.95 MiB |
| 提交时间 |
2026-02-25 12:20:09 |
显示代码纯文本
#include<bits/stdc++.h>
using namespace std;
#define maxn 100005
int t,n,m,tot;
int top[maxn],siz[maxn],son[maxn],f[maxn],dep[maxn],id[maxn];
int lt[maxn*4],rt[maxn*4],num[maxn*4],tag[maxn*4];
vector<int>e[maxn];
struct node{
int l,r,s;
};
void init(){
tot=0;
for(int i=1;i<=n;i++){
e[i].clear();
son[i]=0;
}
}
void dfs1(int u,int fa){
f[u]=fa;
dep[u]=dep[fa]+1;
siz[u]=1;
for(int v:e[u]){
if(v==fa)continue;
dfs1(v,u);
siz[u]+=siz[v];
if(siz[son[u]]<siz[v])son[u]=v;
}
}
void dfs2(int u,int s){
id[u]=++tot;
top[u]=s;
if(!son[u])return;
dfs2(son[u],s);
for(int v:e[u]){
if(v==f[u]||v==son[u])continue;
dfs2(v,v);
}
}
void pushup(int u){
lt[u]=lt[u*2];
rt[u]=rt[u*2+1];
num[u]=num[u*2]+num[u*2+1]+(rt[u*2]==lt[u*2+1]);
}
void pushdown(int u,int l,int r){
if(tag[u]){
int mid=(l+r)/2;
tag[u*2]=tag[u*2+1]=tag[u];
lt[u*2]=rt[u*2]=tag[u];
lt[u*2+1]=rt[u*2+1]=tag[u];
num[u*2]=mid-l;
num[u*2+1]=r-mid-1;
tag[u]=0;
}
}
void build(int u,int l,int r){
tag[u]=0;
if(l==r){
num[u]=0;
lt[u]=rt[u]=-l;
return;
}
int mid=(l+r)/2;
build(u*2,l,mid);
build(u*2+1,mid+1,r);
pushup(u);
}
void update(int u,int l,int r,int ql,int qr,int v){
if(l>=ql&&r<=qr){
tag[u]=v;
lt[u]=rt[u]=v;
num[u]=r-l;
return;
}
pushdown(u,l,r);
int mid=(l+r)/2;
if(ql<=mid)update(u*2,l,mid,ql,qr,v);
if(qr>mid)update(u*2+1,mid+1,r,ql,qr,v);
pushup(u);
}
node query(int u,int l,int r,int ql,int qr){
if(l>=ql&&r<=qr)return {lt[u],rt[u],num[u]};
pushdown(u,l,r);
int mid=(l+r)/2;
if(qr<=mid)return query(u*2,l,mid,ql,qr);
if(ql>mid)return query(u*2+1,mid+1,r,ql,qr);
node a=query(u*2,l,mid,ql,qr),b=query(u*2+1,mid+1,r,ql,qr);
return {a.l,b.r,a.s+b.s+(a.r==b.l)};
}
int getval(int u,int l,int r,int p){
if(l==r)return lt[u];
pushdown(u,l,r);
int mid=(l+r)/2;
if(p<=mid)return getval(u*2,l,mid,p);
return getval(u*2+1,mid+1,r,p);
}
void update_(int x,int y,int v){
while(top[x]!=top[y]){
if(dep[top[x]]<dep[top[y]])swap(x,y);
update(1,1,n,id[top[x]],id[x],v);
x=f[top[x]];
}
if(dep[x]<dep[y])swap(x,y);
update(1,1,n,id[y],id[x],v);
}
int query_(int x,int y){
int res=0;
while(top[x]!=top[y]){
if(dep[top[x]]<dep[top[y]])swap(x,y);
node tmp=query(1,1,n,id[top[x]],id[x]);
res+=tmp.s;
if(tmp.l==getval(1,1,n,id[f[top[x]]]))res++;
x=f[top[x]];
}
if(dep[x]<dep[y])swap(x,y);
res+=query(1,1,n,id[y],id[x]).s;
return res;
}
int main(){
freopen("edge.in","r",stdin);
freopen("edge.out","w",stdout);
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
cin>>t;
while(t--){
cin>>n>>m;
init();
for(int i=1,u,v;i<n;i++){
cin>>u>>v;
e[u].push_back(v);
e[v].push_back(u);
}
dfs1(1,0);
dfs2(1,1);
build(1,1,n);
int op,x,y;
for(int i=1;i<=m;i++){
cin>>op>>x>>y;
if(op==1)update_(x,y,i);
else cout<<query_(x,y)<<"\n";
}
}
return 0;
}