树剖求救样例都过不去

P3384 【模板】重链剖分/树链剖分

```cpp int main() { cin>>n>>m>>root>>mod; for(int i=1;i<=n;i++) { cin>>val[i]; } for(int i=1;i<=n-1;i++) { int x,y; cin>>x>>y; v[x].push_back(y); v[y].push_back(x); } dfs1(root,0,1); dfs2(root,root); //puts("adsdas"); while(m--) { int op; cin>>op; if(op==1)//操作一 { int x,y,k; cin>>x>>y>>k; upRange(x,y,k); } if(op==2) { int x,y; res=0; cin>>x>>y; cout<<queryRange(x,y)<<endl; } if(op==3) { int x,k; cin>>x>>k; upson(x,k); } if(op==4) { int x; cin>>x; cout<<queryson(x)<<endl; } } return 0; //system("pause"); } ```
by Miss_dijkstra @ 2019-05-26 12:05:38


为什么我感觉你的代码很长。 就是史诗级工业题的那种感觉。
by redegg @ 2019-05-26 13:37:04


@[redegg](/space/show?uid=34663) ~~猪国杀~~
by Miss_dijkstra @ 2019-05-26 14:05:34


@[托儿索](/space/show?uid=107689) 为什么我的树剖和你的不太一样? ```cpp #include <bits/stdc++.h> #define int LL #define lowbit(i) ((i)&(-(i))) using namespace std; typedef long long LL; const int MAX_N=100005; int n,m,root,Mod; vector <int> g[MAX_N]; int bel[MAX_N]; int siz[MAX_N]; int depth[MAX_N]; int A[MAX_N]; int A_[MAX_N]; int sum[MAX_N]; int dfn[MAX_N]; int Index; int f[MAX_N][21]; int dfs_(int v,int fa) { f[v][0]=fa; depth[v]=depth[fa]+1; siz[v]=1; for(int i=0;i<(int)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<(int)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<(int)g[v].size();i++) { int u=g[v][i]; if(depth[u]==depth[v]+1 && u!=k)dfs(u,u); } } struct BIT { int d1[MAX_N]; int d2[MAX_N]; void add(int *arr,int i,int x) { while(i<=n) { arr[i]+=x; arr[i]%=Mod; i+=lowbit(i); } } void modify(int l,int r,int x) { add(d1,l,x); add(d1,r+1,-x); add(d2,l,x*l); add(d2,r+1,-x*(r+1)); } int get_sum(int *arr,int i) { int res=0; while(i>0) { res+=arr[i]; res%=Mod; i-=lowbit(i); } return res; } int pre_sum(int i) { return (sum[i]+(i+1)*get_sum(d1,i)-get_sum(d2,i))%Mod; } int query(int l,int r) { return pre_sum(r)-pre_sum(l-1); } }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]; } signed main() { cin>>n>>m>>root>>Mod; for(int i=1;i<=n;i++) { cin>>A[i]; } for(int i=1;i<n;i++) { int u,v; cin>>u>>v; g[u].push_back(v); g[v].push_back(u); } dfs_(root,0); dfs(root,root); for(int j=1;j<=20;j++) { for(int i=1;i<=n;i++) { f[i][j]=f[f[i][j-1]][j-1]; } } for(int i=1;i<=n;i++) { A_[dfn[i]]=A[i]; } for(int i=1;i<=n;i++) { sum[i]=sum[i-1]+A_[i]; sum[i]%=Mod; } while(m--) { int opt; cin>>opt; // cout<<"opt "<<opt<<":"; if(opt==1) { int u,v,w; cin>>u>>v>>w; int t=lca(u,v); while(bel[u]!=bel[t]) { bit.modify(dfn[bel[u]],dfn[u],w); u=f[bel[u]][0]; } bit.modify(dfn[t],dfn[u],w); while(bel[v]!=bel[t]) { bit.modify(dfn[bel[v]],dfn[v],w); v=f[bel[v]][0]; } bit.modify(dfn[t],dfn[v],w); bit.modify(dfn[t],dfn[t],-w); } else if(opt==2) { int u,v; cin>>u>>v; int t=lca(u,v); int ans=0; while(bel[u]!=bel[t]) { ans+=bit.query(dfn[bel[u]],dfn[u]); ans%=Mod; u=f[bel[u]][0]; } ans+=bit.query(dfn[t],dfn[u]); while(bel[v]!=bel[t]) { ans+=bit.query(dfn[bel[v]],dfn[v]); ans%=Mod; v=f[bel[v]][0]; } ans+=bit.query(dfn[t],dfn[v]); ans-=bit.query(dfn[t],dfn[t]); ans%=Mod; if(ans<0)ans+=Mod; cout<<ans<<endl; } else if(opt==3) { int v,w; cin>>v>>w; bit.modify(dfn[v],dfn[v]+siz[v]-1,w); } else { int v; cin>>v; int ans=bit.query(dfn[v],dfn[v]+siz[v]-1); ans%=Mod; if(ans<0)ans+=Mod; cout<<ans<<endl; } } return 0; } ```
by Smile_Cindy @ 2019-05-26 14:09:03


@[Alpha](/space/show?uid=87058) 不知道也许是我比较特殊
by Miss_dijkstra @ 2019-05-26 14:34:38


在线%机房dalao
by foxdemon @ 2019-05-26 19:04:25


|