为什么全wa 找到的衷心感谢!!!

P3178 [HAOI2015] 树上操作

你RP不好吧。。。。。
by ezoixx130 @ 2017-08-16 07:31:01


百度上可能错了
by Henry_he @ 2017-08-16 07:32:31


你RP不好吧。。。。。
by gzh01 @ 2017-08-16 07:57:30


树剖套线段树代码太恶心长。我的50也调不出来
by MifuneShioriko @ 2017-10-03 16:25:46


树的初值不能这样赋值的说。。。 代码给你,看看我的内个a[real[l]]的赋值 ···cpp ```cpp #include <cstdlib> #include <cstdio> #include <cstring> #include <algorithm> using namespace std; #define lson k<<1 #define rson k<<1|1 #define lt(k) tree[k].left #define rt(k) tree[k].right #define vl(k) tree[k].value #define ct(k) tree[k].cnt #define hd(k) node[k].head #define fa(k) node[k].father #define sn(k) node[k].son #define id(k) node[k].index #define dp(k) node[k].deep #define sz(k) node[k].size #define tp(k) node[k].top #define fr(k) edge[k].from #define to(k) edge[k].to #define nx(k) edge[k].next void init(); void work(); void addedge(long long ,long long ,long long ); void dfs1(long long ,long long ); void dfs2(long long ,long long ); void build(long long ,long long ,long long ); void update(long long ,long long ,long long ,long long); void solve2(long long ,long long ,long long ); void pushdown(long long ); void pushup(long long ); long long query(long long ,long long ,long long); long long solve1(long long ,long long ); const long long maxn=100010; long long n,m,r,p,a[maxn],real[maxn],x,y,v,flag,total=0; struct tree { long long left,right,cnt,value; }tree[maxn<<2]; struct node { long long head,deep,size,father,son,top,index; }node[maxn]; struct edge { long long from,to,next; }edge[maxn<<1]; long long read() { char ch=getchar(); long long f=1,x=0; while (ch<'0' || ch>'9') { if (ch=='-') f=-1; ch=getchar(); } while (ch>='0' && ch<='9') { x=x*10+ch-'0'; ch=getchar(); } return x*f; } void init() { memset(node, 0, sizeof(node)); memset(edge, 0, sizeof(edge)); memset(tree, 0, sizeof(tree)); n=read(); m=read(); for (long long i=1;i<=n;i++) a[i]=read(); for (long long i=1;i<n;i++) { x=read(); y=read(); addedge(x,y,i); addedge(y,x,i+n); } dfs1(1,1); dfs2(1,1); } void addedge(long long x,long long y,long long k) { fr(k)=x; to(k)=y; nx(k)=hd(x); hd(x)=k; } void dfs1(long long k,long long _dp) { dp(k)=_dp; sz(k)=1; for (long long i=hd(k);i;i=nx(i)) { if (sz(to(i))) continue; fa(to(i))=k; dfs1(to(i),_dp+1); sz(k)+=sz(to(i)); if (sz(sn(k))<sz(to(i))) sn(k)=to(i); } } void dfs2(long long k,long long _tp) { tp(k)=_tp; id(k)=++total; real[total]=k; if (sn(k)) dfs2(sn(k),_tp); for (long long i=hd(k);i;i=nx(i)) if (!id(to(i))) dfs2(to(i),to(i)); } void work() { build(1,1,n); for (long long i=1;i<=m;i++) { flag=read(); if (flag==3) { x=read(); printf("%lld\n",solve1(1,x)); } else if (flag==1) { x=read(); y=read(); update(1,id(x),id(x),y); } else { x=read(); y=read(); update(1,id(x),id(x)+sz(x)-1,y); } } } void pushup(long long k) { vl(k)=vl(lson)+vl(rson); } void pushdown(long long k) { if (ct(k)) { ct(lson)+=ct(k); ct(rson)+=ct(k); vl(lson)+=ct(k)*(rt(lson)-lt(lson)+1); vl(rson)+=ct(k)*(rt(rson)-lt(rson)+1); ct(k)=0; } } void build(long long k,long long l,long long r) { lt(k)=l; rt(k)=r; ct(k)=0; if (l==r) { vl(k)=a[real[l]]; return; } long long mid=(l+r)>>1; build(lson,l,mid); if (r>mid) build(rson,mid+1,r); pushup(k); } void update(long long k,long long l,long long r,long long v) { if (l<=lt(k) && rt(k)<=r) { ct(k)+=v; vl(k)+=v*(rt(k)-lt(k)+1); return; } pushdown(k); if (l<=rt(lson)) update(lson,l,r,v); if (r>=lt(rson)) update(rson,l,r,v); pushup(k); } long long query(long long k,long long l,long long r) { if (l<=lt(k) && rt(k)<=r) return vl(k); pushdown(k); long long ans=0; if (l<=rt(lson)) ans+=query(lson,l,r); if (r>=lt(rson)) ans+=query(rson,l,r); return ans; } long long solve1(long long u,long long v) { long long f1=tp(u),f2=tp(v),ans=0; while (f1!=f2) { if (dp(f1)<dp(f2)) { swap(f1,f2); swap(u,v); } ans+=query(1,id(f1),id(u)); u=fa(f1); f1=tp(u); } if (dp(u)<dp(v)) swap(u,v); return ans+query(1,id(v),id(u)); } void solve2(long long u,long long v,long long w) { long long f1=tp(u),f2=tp(v); while (f1!=f2) { if (dp(f1)<dp(f2)) { swap(f1,f2); swap(u,v); } update(1,id(f1),id(u),w); u=fa(f1); f1=tp(u); } if (dp(u)<dp(v)) swap(u,v); update(1,id(v),id(u),w); } int main() { init(); work(); return 0; } … ```
by 如我西沉 @ 2017-11-07 01:59:45


|