70 卡仨点求助

P4114 Qtree1

@[powerfire](/space/show?uid=152323) 树状数组,信我的没错。 ```cpp // luogu-judger-enable-o2 #include <bits/stdc++.h> #define max(a,b) ((a)>(b)?(a):(b)) #define int LL #define lowbit(i) ((i)&(-(i))) using namespace std; typedef long long LL; const int MAX_N=100005; int n,m; vector <int> g[MAX_N]; int bel[MAX_N]; int siz[MAX_N]; int depth[MAX_N]; int W[MAX_N]; int sum[MAX_N]; int dfn[MAX_N]; int Index; int f[MAX_N][21]; int A[MAX_N]; int to[MAX_N]; pair<int,int> edge[MAX_N]; int dfs_(int v,int fa) { f[v][0]=fa; depth[v]=depth[fa]+1; siz[v]=1; for(int i=0;i<g[v].size();i++) { int u=g[v][i]; if(u==fa)continue; siz[v]+=dfs_(u,v); } return siz[v]; } void dfs(int v,int chain) { dfn[v]=++Index; bel[v]=chain; int k=0; for(int i=0;i<g[v].size();i++) { int u=g[v][i]; if(depth[u]==depth[v]+1 && siz[u]>siz[k])k=u; } if(k)dfs(k,chain); for(int i=0;i<g[v].size();i++) { int u=g[v][i]; if(depth[u]==depth[v]+1 && u!=k)dfs(u,u); } } struct BIT { int bit[MAX_N]; void init() { memset(bit,0,sizeof(bit)); } void modify(int i,int x) { A[i]=x; while(i<=n) { bit[i]=A[i]; for(int j=1;j<lowbit(i);j<<=1) { bit[i]=max(bit[i],bit[i-j]); } i+=lowbit(i); } } int query(int l,int r) { if(r<l)return 0; int ans=A[r]; while(true) { ans=max(ans,A[r]); if(r<=l) break; r--; while(r-l>=lowbit(r)) { ans=max(ans,bit[r]); r-=lowbit(r); } } return ans; } }bit; int lca(int u,int v) { if(depth[u]<depth[v])swap(u,v); int t=depth[u]-depth[v]; for(int j=20;j>=0;j--) { if(t&(1<<j))u=f[u][j]; } if(u==v)return v; for(int j=20;j>=0;j--) { if(f[u][j]!=f[v][j]) { u=f[u][j]; v=f[v][j]; } } return f[u][0]; } int read() { char ch=' '; int x=0; bool flag=false; while(!isdigit(ch)) { if(ch=='-')flag=true; ch=getchar(); } while(isdigit(ch)) { x=(x<<3)+(x<<1)+ch-'0'; ch=getchar(); } return flag?-x:x; } signed main() { n=read(); for(int i=1;i<n;i++) { int u=read(),v=read(); edge[i]=make_pair(u,v); g[u].push_back(v); g[v].push_back(u); W[i]=read(); } dfs_(1,0); dfs(1,1); for(int i=1;i<n;i++) { int u,v; u=edge[i].first; v=edge[i].second; if(depth[u]<depth[v])swap(u,v); bit.modify(dfn[u],W[i]); to[i]=u; } for(int j=1;j<=20;j++) { for(int i=1;i<=n;i++) { f[i][j]=f[f[i][j-1]][j-1]; } } while(true) { string opt; cin>>opt; if(opt=="CHANGE") { int u=read(),w=read(); bit.modify(dfn[to[u]],w); } else if(opt=="QUERY") { int u=read(),v=read(); int t=lca(u,v); int ans=0; while(bel[u]!=bel[t]) { ans=max(ans,bit.query(dfn[bel[u]],dfn[u])); u=f[bel[u]][0]; } ans=max(ans,bit.query(dfn[t]+1,dfn[u])); while(bel[v]!=bel[t]) { ans=max(ans,bit.query(dfn[bel[v]],dfn[v])); v=f[bel[v]][0]; } ans=max(ans,bit.query(dfn[t]+1,dfn[v])); printf("%lld\n",ans); } else break; } return 0; } ```
by Smile_Cindy @ 2019-03-03 15:35:24


|