[关闭]
@994495jj 2017-07-16T13:23:02.000000Z 字数 1231 阅读 987

2017杭电ACM集训队单人排位赛 - 6 [Problem 1001]

201707 (ACM)思维


题意

题解

代码

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. typedef long long ll;
  4. typedef pair<int, int> pii;
  5. typedef vector<int> vi;
  6. #define fi first
  7. #define se second
  8. #define mp make_pair
  9. #define pb push_back
  10. #define rep(i, a, b) for(int i=(a); i<(b); i++)
  11. #define sz(a) (int)a.size()
  12. //---------------
  13. const int N=100005;
  14. int fa[N],w[N],dis[N],tson[N];
  15. ll clca[N],sclca[N];
  16. vector<int> son[N];
  17. void dfs(int u) {
  18. dis[u]=dis[fa[u]]+w[u];
  19. tson[u]=1;
  20. rep(i,0,sz(son[u])) {
  21. int v=son[u][i];
  22. dfs(v);
  23. tson[u]+=tson[v];
  24. }
  25. }
  26. void dfs2(int u) {
  27. clca[u]=tson[u];
  28. rep(i,0,sz(son[u])) {
  29. int v=son[u][i];
  30. clca[u]=clca[u]+1ll*tson[v]*(tson[u]-tson[v]);
  31. dfs2(v);
  32. }
  33. }
  34. int main() {
  35. int T;scanf("%d",&T);
  36. while(T--) {
  37. ///
  38. int n;scanf("%d",&n);
  39. ///init
  40. rep(i,0,n+1) son[i].clear();
  41. memset(sclca,0,sizeof(sclca));
  42. memset(fa,0,sizeof(fa));
  43. memset(w,0,sizeof(w));
  44. memset(dis,0,sizeof(dis));
  45. memset(tson,0,sizeof(tson));
  46. memset(clca,0,sizeof(clca));
  47. ///read
  48. rep(i,2,n+1) {
  49. int x;scanf("%d",&x);
  50. fa[i]=x;
  51. son[x].pb(i);
  52. }
  53. rep(i,1,n+1) scanf("%d",w+i);
  54. ///get dis tson
  55. dfs(1);
  56. ///get clca
  57. dfs2(1);
  58. ///get sclca
  59. rep(i,1,n+1) sclca[fa[i]]+=clca[i];
  60. ///solve
  61. ll ans=0;
  62. rep(i,1,n+1) {
  63. ans=ans-1ll*dis[i]*sclca[i];
  64. }
  65. sort(dis+1,dis+1+n);
  66. rep(i,1,n+1) {
  67. ans=ans+1ll*dis[i]*(2*i-1);
  68. }
  69. ///print
  70. printf("%lld\n",ans);
  71. }
  72. return 0;
  73. }
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注