1. #include<cstdio>
  2. #include<cstdlib>
  3. #include<cstring>
  4. #include<iostream>
  5. #include<algorithm>
  6. using namespace std;
  7.  
  8. const int N=;
  9. int n,m,len;
  10. struct node{
  11. int x,y,d,next;
  12. }a[*N];
  13. int first[N],f0[N],f1[N][],g0[N],g1[N][],tot[N];
  14. /*
  15. 若m=0,
  16. f[x]:x的子树的节点到x的距离的总和
  17. g[x]:不是x的子树上的点到x的距离的总和
  18. f[x]=f[y]+d(x,y)*tot[y] y=all son[x]
  19. g[x]=f[fa]+g[fa] - (f[x]+tot[x]*d(x,fa)) + (n-tot[x])*d(x,fa)
  20.  
  21. 因为m<=15,异或只会影响最后四位数
  22. 则将f[x]拆分为f0[x]:f[x]除去最后四位数的部分:xx0000
  23. f1[x][0~15]:f1[x][j]表示f[x]中有多少个最后四位为j的距离(不能像原来一样直接加进去,因为最后要异或)
  24. g[x]同理。
  25. */
  26.  
  27. void ins(int x,int y,int d)
  28. {
  29. len++;
  30. a[len].x=x;a[len].y=y;a[len].d=d;
  31. a[len].next=first[x];first[x]=len;
  32. }
  33.  
  34. void dfs1(int x,int fa)
  35. {
  36. f1[x][]=;//debug
  37. tot[x]=;
  38. for(int i=first[x];i;i=a[i].next)
  39. {
  40. int y=a[i].y;
  41. if(y!=fa)
  42. {
  43. dfs1(y,x);
  44. tot[x]+=tot[y];
  45. // f[x]+=f[y]+a[i].d*tot[y];
  46. int now=a[i].d;
  47. f0[x]+=f0[y]+tot[y]*(now-(now%));
  48. for(int j=;j<=;j++)
  49. {
  50. int t=j+now%;
  51. f1[x][t%]+=f1[y][j];
  52. f0[x]+=(t-(t%))*f1[y][j];
  53. }
  54. }
  55. }
  56. }
  57.  
  58. void dfs2(int x,int fa)
  59. {
  60. for(int i=first[x];i;i=a[i].next)
  61. {
  62. int y=a[i].y;
  63. if(y!=fa)
  64. {
  65. // g[y]=f[x]+g[x]-f[y]+(n-2*tot[y])*a[i].d;
  66. // g[y]=f[x]+g[x] - (f[y]+tot[y]*a[i].d) + (n-tot[y])*a[i].d
  67.  
  68. /*
  69. 减法不会出现不够减:
  70. 因为减的东西之前一定加过(所以要考虑它的实际意义)
  71. */
  72.  
  73. //z c f[y]+tot[y]*a[i].d
  74. int z=,c[];
  75. memset(c,,sizeof(c));
  76. int now=a[i].d;
  77. z+=f0[y]+tot[y]*(now-(now%));
  78. for(int j=;j<=;j++)
  79. {
  80. int t=j+now%;
  81. c[t%]+=f1[y][j];//以y为根的子树中每个点都要加d(x,y),j变为t%16
  82. z+=(t-(t%))*f1[y][j];
  83. }
  84.  
  85. //g[y]=f[x]+g[x]-(f[y]+tot[y]*a[i].d)
  86. g0[y]+=f0[x]+g0[x]-z;
  87. for(int j=;j<=;j++) g1[y][j]+=f1[x][j]+g1[x][j]-c[j];
  88.  
  89. //g[y]+=(n-tot[y])*a[i].d
  90. for(int j=;j<=;j++) c[j]=g1[y][j];
  91. for(int j=;j<=;j++)
  92. {
  93. int t=j+now;
  94. g1[y][t%]=c[j];
  95. g0[y]+=(t-(t%))*c[j];
  96. }
  97. dfs2(y,x);
  98. }
  99. }
  100. }
  101.  
  102. int main()
  103. {
  104. // freopen("a.in","r",stdin);
  105. freopen("warehouse.in","r",stdin);
  106. freopen("warehouse.out","w",stdout);
  107. len=;
  108. memset(first,,sizeof(first));
  109. scanf("%d%d",&n,&m);
  110. for(int i=;i<n;i++)
  111. {
  112. int x,y,d;
  113. scanf("%d%d%d",&x,&y,&d);
  114. ins(x,y,d),ins(y,x,d);
  115. }
  116. memset(f0,,sizeof(f0));
  117. memset(f1,,sizeof(f1));
  118. memset(g0,,sizeof(g0));
  119. memset(g1,,sizeof(g1));
  120. dfs1(,);dfs2(,);
  121. int ans=;
  122. for(int i=;i<=n;i++)
  123. {
  124. ans=f0[i]+g0[i];
  125. for(int j=;j<=;j++)
  126. {
  127. int now=j^m;
  128. ans+=(f1[i][j]+g1[i][j])*now;
  129. }
  130. ans-=m;
  131. printf("%d\n",ans);
  132. }
  133. return ;
  134. }

【20160815】noip模拟(未完)的更多相关文章

  1. 【20160811】noip模拟-未完

    T1 T2 T3 小奇回地球 [问题描述] 简单来说,它要从标号为1的星球到标号为n的星球,某一些星球之间有航线.由于超时空隧道的存在,从一个星球到另一个星球时间可能会倒流,而且,从星球a到b耗费的时 ...

  2. NOIP模拟题汇总(加厚版)

    \(NOIP\)模拟题汇总(加厚版) T1 string 描述 有一个仅由 '0' 和 '1' 组成的字符串 \(A\),可以对其执行下列两个操作: 删除 \(A\)中的第一个字符: 若 \(A\)中 ...

  3. NOIP模拟赛20161022

    NOIP模拟赛2016-10-22 题目名 东风谷早苗 西行寺幽幽子 琪露诺 上白泽慧音 源文件 robot.cpp/c/pas spring.cpp/c/pas iceroad.cpp/c/pas ...

  4. 大家AK杯 灰天飞雁NOIP模拟赛题解/数据/标程

    数据 http://files.cnblogs.com/htfy/data.zip 简要题解 桌球碰撞 纯模拟,注意一开始就在袋口和v=0的情况.v和坐标可以是小数.为保险起见最好用extended/ ...

  5. Codeforces Round #395 (Div. 2)(未完)

    2.2.2017 9:35~11:35 A - Taymyr is calling you 直接模拟 #include <iostream> #include <cstdio> ...

  6. 布隆过滤器(Bloom Filter) 未完待续

    布隆过滤器雏形 未完待续..... 计算错误率 现在有一个空额布隆过滤器, 过滤器里的bit array的大小是m. 咱来插入一个元素. 这次插入过程中的第一个hash函数会算出一个位置, 然后把这个 ...

  7. 从Socket入门到BIO,PIO,NIO,multiplexing,AIO(未完待续)

    Socket入门 最简单的Server端读取Client端内容的demo public class Server { public static void main(String [] args) t ...

  8. 【noip模拟赛4】Matrix67的派对 暴力dfs

    [noip模拟赛4]Matrix67的派对   描述 Matrix67发现身高接近的人似乎更合得来.Matrix67举办的派对共有N(1<=N<=10)个人参加,Matrix67需要把他们 ...

  9. Go web编程学习笔记——未完待续

    1. 1).GOPATH设置 先设置自己的GOPATH,可以在本机中运行$PATH进行查看: userdeMacBook-Pro:~ user$ $GOPATH -bash: /Users/user/ ...

  10. NOIP模拟赛-2018.11.7

    NOIP模拟赛 如果用命令行编译程序可以发现没加头文件之类的错误. 如果用命令行编译程序可以发现没加头文件之类的错误. 如果用命令行编译程序可以发现没加头文件之类的错误. 编译之前另存一份,听说如果敲 ...

随机推荐

  1. ORB-SLAM 代码笔记(五)Frame类

    Frame类的成员变量主要包含从摄像头获取的图像的 1. 特征点信息(关键点+描述字) 2. 尺寸不变特征所用金字塔信息,这些都定义在ORBextractor对象中 3. 词袋模型参数,用于跟踪失败情 ...

  2. java反射操作类方法与属性

    package com.fanshe.test; public class User { private int age; private String email; private String u ...

  3. React实现最完整的百度搜索框

    import React,{Component} from 'react' import ReactDOM,{render} from 'react-dom' import 'bootstrap/di ...

  4. javac、jar使用实录

    因项目管理部署需要,记录一下过程,以免下次忘记了,再次使用又需要重头再来,只记录正确的操作方式,可能会提到某些错误 建立项目所在目录F:\www 案例一 其下建立项目的java源文件的包目录结构.ja ...

  5. 项目总结(二)->一些常用的工具浅谈

    程序员是否应该沉迷于一个编程的世界,为了磨砺自己的编程技能而两耳不闻窗外事,一心只为写代码:还是说要做到各有涉猎,全而不精.关于这点每个人心中都有一套自己的工作体系和方法体系. 我一直认为,程序员你首 ...

  6. OpenCV入门:(四:混合两张图片)

    1. 原理 对两张图片使用如下公式可以得到两张图片的混合图片, 其中f0(x),f1(x)分别是图片1和图片2同一位置的像素点. 2. OpenCV中的AddWeight函数 函数和参数说明: ) s ...

  7. CAS单点登录(一):单点登录与CAS理论介绍

    一.什么是单点登录(SSO) 单点登录主要用于多系统集成,即在多个系统中,用户只需要到一个中央服务器登录一次即可访问这些系统中的任何一个,无须多次登录. 单点登录(Single Sign On),简称 ...

  8. 序列化---fastjson使用

    该文章主要介绍com.alibaba.fastjson的使用. 首先创建maven工程,导入fastjson.挑个热度高的版本就好了. 首先考虑下,我们通常什么时候会使用序列化和反序列化: 1.将ja ...

  9. python3.x 编码问题

  10. PostgreSQL 建库建表脚本

    1.创建角色(create_role.sql) drop role if exists "kq_acs";create role "kq_acs" login ...