树剖模板题全wa求助

P3178 [HAOI2015] 树上操作

@[JBLee](/space/show?uid=108746) emmm……Update1的pushdown呢?
by x义x @ 2019-07-28 17:27:15


@[JBLee](/space/show?uid=108746) emmm…… 给您我封装的线段树,您换进去试试 ```cpp struct Tree{ long long ans[100005<<2],tag[100005<<2],a[100005]; inline long long lson(long long p){return p<<1;} inline long long rson(long long p){return (p<<1)|1;} inline void push_up(long long p){ans[p]=ans[lson(p)]+ans[rson(p)];} inline void build(long long p,long long l,long long r){ if (l==r){ans[p]=a[l];return ;} long long mid=(l+r)>>1; build(lson(p),l,mid); build(rson(p),mid+1,r); push_up(p); tag[p]=0; } inline void lazy_tag(long long p,long long l,long long r,long long k){ans[p]+=(r-l+1)*k;tag[p]+=k;} inline void push_down(long long p,long long l,long long r){ long long mid=(l+r)>>1; lazy_tag(lson(p),l,mid,tag[p]); lazy_tag(rson(p),mid+1,r,tag[p]); tag[p]=0; } inline void change(long long p,long long nl,long long nr,long long l,long long r,long long k){ if (nl<=l&&nr>=r){ans[p]+=(r-l+1)*k,tag[p]+=k;return;} if (nl>r||nr<l)return; long long mid=(l+r)>>1; push_down(p,l,r); change(lson(p),nl,nr,l,mid,k); change(rson(p),nl,nr,mid+1,r,k); push_up(p); } inline long long ask(long long p,long long nl,long long nr,long long l,long long r){ if (nl<=l&&nr>=r)return ans[p]; if (nl>r||nr<l)return 0; long long mid=(l+r)>>1,res=0; push_down(p,l,r); res+=ask(lson(p),nl,nr,l,mid); res+=ask(rson(p),nl,nr,mid+1,r); return res; } }tree; ``` 以及我的AC代码 ```cpp #include<bits/stdc++.h> #pragma GCC optimize(3) using namespace std; #define int long long const int N=4e5+1; struct node{ int v,nex; }t[N<<1]; int las[N],n,m,gg[N<<2],lazy[N<<2],W[N],w[N],dep[N],fa[N],son[N],siz[N],top[N],id[N],cnt,len; inline void update(int now,int l,int r,int x){ gg[now]+=1LL*(r-l+1)*x; lazy[now]+=x; return; } inline void down(int now,int l,int r){ int mid=(l+r)>>1; update(now<<1,l,mid,lazy[now]),update(now<<1|1,mid+1,r,lazy[now]); lazy[now]=0; return; } inline void dfs1(int x,int d){ dep[x]=d,siz[x]=1; int maxe=-1; for(int i=las[x];i;i=t[i].nex){ int v=t[i].v; if(!dep[v]){ fa[v]=x; dfs1(v,d+1); siz[x]+=siz[v]; if(siz[v]>maxe)son[x]=v,maxe=siz[v]; } } } inline void dfs2(int x,int topf){ id[x]=++cnt; w[cnt]=W[x]; top[x]=topf; if(!son[x])return; dfs2(son[x],topf); for(int i=las[x];i;i=t[i].nex){ int v=t[i].v; if(dep[v]>dep[x]&&v!=son[x])dfs2(v,v); } } inline void add(int u,int v){ t[++len].v=v; t[len].nex=las[u],las[u]=len; t[++len].v=u; t[len].nex=las[v],las[v]=len; } inline void build(int now,int l,int r){ if(l==r){gg[now]=w[l];return;} int mid=(l+r)>>1; build(now<<1,l,mid),build(now<<1|1,mid+1,r); gg[now]=gg[now<<1]+gg[now<<1|1]; } inline void change_point(int now,int l,int r,int x,int e){ down(now,l,r); if(l==r){gg[now]+=e;return;} int mid=(l+r)>>1; if(x<=mid)change_point(now<<1,l,mid,x,e); else change_point(now<<1|1,mid+1,r,x,e); gg[now]=gg[now<<1]+gg[now<<1|1]; } inline void change(int now,int l,int r,int lc,int rc,int e){ down(now,l,r); if(lc<=l&&r<=rc){update(now,l,r,e);return;} int mid=(l+r)>>1; if(lc<=mid)change(now<<1,l,mid,lc,rc,e); if(rc>mid)change(now<<1|1,mid+1,r,lc,rc,e); gg[now]=gg[now<<1]+gg[now<<1|1]; } inline long long find(int now,int l,int r,int lc,int rc){ down(now,l,r); if(lc<=l&&r<=rc)return gg[now]; int mid=(l+r)>>1; if(rc<=mid)return find(now<<1,l,mid,lc,rc); if(lc>mid)return find(now<<1|1,mid+1,r,lc,rc); return find(now<<1,l,mid,lc,mid)+find(now<<1|1,mid+1,r,mid+1,rc); } inline long long find_to(int x,int y){ long long res=0; while(top[x]!=top[y]){ if(dep[top[x]]<dep[top[y]])x^=y^=x^=y; res+=find(1,1,n,id[top[x]],id[x]); x=fa[top[x]]; } if(dep[x]>dep[y])x^=y^=x^=y; res+=find(1,1,n,id[x],id[y]); return res; } main(){ scanf("%lld%lld",&n,&m); for(int i=1;i<=n;++i)scanf("%lld",&W[i]); for(int i=1;i<n;++i){ int u,v; scanf("%lld%lld",&u,&v); add(u,v); } dfs1(1,1); dfs2(1,1); build(1,1,n); int opt,x,a; while(m--){ scanf("%lld%lld",&opt,&x); if(opt==1){ scanf("%lld",&a); change_point(1,1,n,id[x],a); continue; } if(opt==2){ scanf("%lld",&a); change(1,1,n,id[x],id[x]+siz[x]-1,a); continue; } printf("%lld\n",find_to(1,x)); } return 0; } ```
by 引领天下 @ 2019-07-28 17:34:28


记得取模……
by Smile_Cindy @ 2019-07-28 17:40:13


@[JBLee](/space/show?uid=108746) 你们为什么都问这些代码极其复杂(连我自己都敲了2个小时+的题目),问问A+B不好吗。。。
by AK_Automata @ 2019-07-28 17:44:06


|