记录编号 587703 评测结果 AAAAAAAAAA
题目名称 [SYOI 2015] Asm.Def的基本算法 最终得分 100
用户昵称 GravatarUntitled 是否通过 通过
代码语言 C++ 运行时间 0.045 s
提交时间 2024-04-18 20:26:24 内存使用 2.06 MiB
显示代码纯文本
  1. #include <bits/stdc++.h>
  2. #define ll long long
  3. using namespace std;
  4. //typedef long long ll;
  5.  
  6. ll const N=100010,mod=1e9+7;
  7. ll n,idx;
  8. ll res,w[N],siz[N];
  9. ll head[N],Next[N],ver[N],fat[N];
  10.  
  11. ll mul(ll a,ll b){
  12. return (a*b)%mod;
  13. }
  14.  
  15. void edge(ll a,ll b){
  16. Next[++idx]=head[a],head[a]=idx,ver[idx]=b;
  17. return;
  18. }
  19.  
  20. void getSiz(ll p){
  21. siz[p]=w[p]%mod;
  22. for (ll i=head[p];i;i=Next[i]){
  23. getSiz(ver[i]);siz[p]+=siz[ver[i]],siz[p]%=mod;
  24. }
  25. return;
  26. }
  27.  
  28. void getRes(ll p){
  29. ll s=siz[p];
  30. res+=mul(mul(w[p],w[p]),s*2-w[p]);
  31. for (ll i=head[p];i;i=Next[i]){
  32. res+=mul(mul(siz[ver[i]],s-siz[ver[i]]-w[p]),w[p]);
  33. getRes(ver[i]);
  34. }
  35. return;
  36. }
  37.  
  38. int main(){
  39. freopen("asm_algo.in","r",stdin);
  40. freopen("asm_algo.out","w",stdout);
  41. ll pt;
  42. ll si;
  43. scanf("%d %lld",&n,&w[1]);
  44. for (ll i=2;i<=n;i++){
  45. scanf("%d %lld",&pt,&si);
  46. edge(pt,i);fat[i]=pt,w[i]=si;
  47. }
  48. getSiz(1);
  49. getRes(1);
  50. printf("%lld",res%mod);
  51. return 0;
  52. }