洛谷P4374
又是一个板子题。
边权转点权注意要去除lca,修改时直接将id[x]加一即可。
注意若此时x==y,则直接返回。
代码如下:
#include<bits/stdc++.h> using namespace std; #define inf 2147483647 const int maxn=1e6; int n,m; inline int read(){ int x=0,f=1; char c=getchar(); while(c<'0'||c>'9'){ if(c=='-')f=-1; c=getchar(); } while(c>='0'&&c<='9'){ x=(x<<1)+(x<<3)+c-'0'; c=getchar(); } return x*f; } int beg[maxn],nex[maxn],to[maxn],e; inline void add(int x,int y){ e++;nex[e]=beg[x]; beg[x]=e;to[e]=y; } int xx[maxn],yy[maxn]; int son[maxn],size[maxn],dep[maxn],fa[maxn]; inline void dfs1(int x,int anc){ dep[x]=dep[anc]+1; fa[x]=anc; size[x]=1; for(int i=beg[x];i;i=nex[i]){ int t=to[i]; if(t==anc)continue; dfs1(t,x); size[x]+=size[t]; if(size[t]>size[son[x]]) son[x]=t; } } int id[maxn],top[maxn],cnt; inline void dfs2(int x,int topc){ id[x]=++cnt; top[x]=topc; if(!son[x])return; dfs2(son[x],topc); for(int i=beg[x];i;i=nex[i]){ int t=to[i]; if(t==fa[x]||t==son[x]) continue; dfs2(t,t); } } int tr[maxn],lazy[maxn]; inline void pushup(int h,int z){ tr[h]=min(tr[h],z); lazy[h]=min(lazy[h],z); } inline void pushdown(int h){ if(lazy[h]==inf)return; pushup(h<<1,lazy[h]); pushup(h<<1|1,lazy[h]); lazy[h]=inf; } inline void modify(int h,int l,int r,int x,int y,int z){ if(l>y||r<x)return; if(l>=x&&r<=y){ pushup(h,z); return; } pushdown(h); int mid=(l+r)>>1; modify(h<<1,l,mid,x,y,z); modify(h<<1|1,mid+1,r,x,y,z); //tr[h]=min(tr[h<<1],tr[h<<1|1]); } inline void mc(int x,int y,int z){ while(top[x]!=top[y]){ if(dep[top[x]]<dep[top[y]])swap(x,y); modify(1,1,n,id[top[x]],id[x],z); x=fa[top[x]]; } if(x==y)return; if(dep[x]>dep[y])swap(x,y); modify(1,1,n,id[x]+1,id[y],z); } /* inline void build(int h,int l,int r){ tr[h]=lazy[h]=inf; if(l==r)return; int mid=(l+r)>>1; build(h<<1,l,mid); build(h<<1|1,mid+1,r); } */ inline int query(int h,int l,int r,int x){ if(l==r)return tr[h]; int mid=(l+r)>>1; pushdown(h); if(mid>=x)return query(h<<1,l,mid,x); else return query(h<<1|1,mid+1,r,x); } int main(){ //freopen("p.in","r",stdin); n=read(),m=read(); for(int i=0;i<=10*n;i++) tr[i]=lazy[i]=inf; for(int i=1;i<n;i++){ xx[i]=read(); yy[i]=read(); add(xx[i],yy[i]); add(yy[i],xx[i]); } dfs1(1,0); dfs2(1,1); //build(1,1,n); int x,y,z; for(int i=1;i<=m;i++){ x=read(),y=read(),z=read(); mc(x,y,z); } int AC=0,WA=0; for(int i=1;i<n;i++){ if(dep[xx[i]]<dep[yy[i]])swap(xx[i],yy[i]); int tmp=query(1,1,n,id[xx[i]]); tmp=(tmp==inf)?-1:tmp; printf("%d\n",tmp); /*x=read(); if(x==tmp)AC++; else WA++,printf("%d %d\n",x,tmp); //printf("%d\n",tmp==inf?-1:tmp); */ } //printf("%d %d\n",AC,WA); return 0; }