标签:line ++ com 连接方式 print lin 编写 tar 通过
1 #include <cstdio> 2 #include <iostream> 3 #define ll long long 4 using namespace std; 5 const int N=6e5+10; 6 int n,m,tot,dis[N],d[N],fa[N],t[N]; 7 ll sum,w[N]; 8 struct tree{ ll v;int l,r; }tr[N]; 9 int merge(int x,int y) 10 { 11 if (!x||!y) return x^y; 12 if (tr[x].v<tr[y].v) swap(x,y); 13 tr[x].r=merge(tr[x].r,y); 14 if (dis[tr[x].l]<dis[tr[x].r]) swap(tr[x].l,tr[x].r); 15 dis[x]=dis[tr[x].r]+1; 16 return x; 17 } 18 int pop(int x){ return merge(tr[x].l,tr[x].r); } 19 int main() 20 { 21 scanf("%d%d",&n,&m); 22 for (int i=2;i<=n+m;i++) scanf("%d%d",&fa[i],&w[i]),sum+=w[i],d[fa[i]]++; 23 for (int i=n+m;i>=2;i--) 24 { 25 ll l=0,r=0; 26 if (i<=n) 27 { 28 while (--d[i]) t[i]=pop(t[i]); 29 l=tr[t[i]].v,t[i]=pop(t[i]),r=tr[t[i]].v,t[i]=pop(t[i]); 30 } 31 tr[++tot].v=l+w[i],tr[++tot].v=r+w[i],t[i]=merge(t[i],merge(tot-1,tot)),t[fa[i]]=merge(t[fa[i]],t[i]); 32 } 33 while (d[1]--) t[1]=pop(t[1]); 34 while (t[1]) sum-=tr[t[1]].v,t[1]=pop(t[1]); 35 printf("%lld",sum); 36 }
标签:line ++ com 连接方式 print lin 编写 tar 通过
原文地址:https://www.cnblogs.com/Comfortable/p/11377513.html