树剖裸题?(复习练练手)
1 // luogu-judger-enable-o2 2 #include <bits/stdc++.h> 3 using namespace std; 4 5 int n,vis[100005],size[100005],dep[100005],fa[100005][20],val[100005],wson[100005],t1,t2,t3,t4,ind; 6 int tid[100005],sid[100005],top[100005],eg1[100005],eg2[100005]; 7 vector <pair<int,int> > g[100005]; 8 char str[105]; 9 10 void dfs1(int p){ 11 vis[p]=1; 12 size[p]=1; 13 for(int i=0;i<g[p].size();i++) { 14 if(vis[g[p][i].first]==0) { 15 dep[g[p][i].first]=dep[p]+1; 16 fa[g[p][i].first][0]=p; 17 val[g[p][i].first]=g[p][i].second; 18 dfs1(g[p][i].first); 19 size[p]+=size[g[p][i].first]; 20 if(size[g[p][i].first]>size[wson[p]]) 21 wson[p]=g[p][i].first; 22 } 23 } 24 } 25 26 void dfs2(int p){ 27 vis[p]=1; 28 tid[++ind]=p; 29 sid[p]=ind; 30 if(wson[p]) { 31 top[wson[p]]=top[p]; 32 dfs2(wson[p]); 33 } 34 for(int i=0;i<g[p].size();i++) { 35 if(vis[g[p][i].first]==0) { 36 top[g[p][i].first]=g[p][i].first; 37 dfs2(g[p][i].first); 38 } 39 } 40 } 41 42 void lca_presolve() { 43 for(int i=1;i<=17;i++) 44 for(register int j=1;j<=n;j++) 45 fa[j][i]=fa[fa[j][i-1]][i-1]; 46 } 47 48 inline int lca(int p,int q){ 49 if(dep[p]<dep[q]) swap(p,q); 50 for(register int i=17;i>=0;i--) 51 if(dep[fa[p][i]]>=dep[q]) p=fa[p][i]; 52 for(register int i=17;i>=0;i--) 53 if(fa[p][i]-fa[q][i]) p=fa[p][i],q=fa[q][i]; 54 if(p-q) p=fa[p][0], q=fa[q][0]; 55 return max(p,q); 56 } 57 58 int a[500005],sq[500005]; 59 60 void pushup(int p) { 61 a[p]=max(a[p*2],a[p*2+1]); 62 } 63 64 void build(int p,int l,int r) { 65 if(l==r) a[p]=sq[l]; 66 else build(p*2,l,(l+r)/2), build(p*2+1,(l+r)/2+1,r), pushup(p); 67 } 68 69 void modify(int p,int l,int r,int pos,int k) { 70 if(l==r) { 71 a[p]=k; 72 sq[pos]=k; 73 } 74 else { 75 if(pos<=(l+r)/2) modify(p*2,l,(l+r)/2,pos,k); 76 else modify(p*2+1,(l+r)/2+1,r,pos,k); 77 pushup(p); 78 } 79 } 80 81 int query(int p,int l,int r,int ql,int qr) { 82 if(l>qr||r<ql) return 0; 83 if(l>=ql&&r<=qr) return a[p]; 84 return max(query(p*2,l,(l+r)/2,ql,qr),query(p*2+1,(l+r)/2+1,r,ql,qr)); 85 } 86 87 void readin() { 88 scanf("%d",&n); 89 for(int i=1;i<n;i++) { 90 scanf("%d%d%d",&t1,&t2,&t3); 91 eg1[i]=t1; 92 eg2[i]=t2; 93 g[t1].push_back(make_pair(t2,t3)); 94 g[t2].push_back(make_pair(t1,t3)); 95 } 96 } 97 98 void init() { 99 dep[1]=1; 100 dfs1(1); 101 memset(vis,0x00,sizeof vis); 102 dfs2(1); 103 lca_presolve(); 104 for(int i=1;i<=n;i++) 105 sq[i]=val[tid[i]]; 106 build(1,1,n); 107 } 108 109 void tmodify(int pos,int key){ 110 modify(1,1,n,sid[pos],key); 111 } 112 113 int lquery(int anc,int son) { 114 int ans=0; 115 while(dep[top[son]]>dep[anc]) 116 ans=max(ans,query(1,1,n,sid[top[son]],sid[son])), 117 son=fa[top[son]][0]; 118 ans=max(ans,query(1,1,n,sid[anc]+1,sid[son])); 119 return ans; 120 } 121 122 int tquery(int p,int q) { 123 int l=lca(p,q); 124 return max(lquery(l,p),lquery(l,q)); 125 } 126 127 int main(){ 128 readin(); 129 init(); 130 for(int i=1;1;i++) { 131 scanf("%s",&str); 132 if(str[0]==‘D‘) return 0; 133 scanf("%d%d",&t2,&t3); 134 if(str[0]==‘C‘) tmodify((dep[eg1[t2]]>dep[eg2[t2]])?eg1[t2]:eg2[t2],t3); 135 else printf("%d\n",tquery(t2,t3)); 136 } 137 }