#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std; const int N=;
int n,m,len;
struct node{
int x,y,d,next;
}a[*N];
int first[N],f0[N],f1[N][],g0[N],g1[N][],tot[N];
/*
若m=0,
f[x]:x的子树的节点到x的距离的总和
g[x]:不是x的子树上的点到x的距离的总和
f[x]=f[y]+d(x,y)*tot[y] y=all son[x]
g[x]=f[fa]+g[fa] - (f[x]+tot[x]*d(x,fa)) + (n-tot[x])*d(x,fa) 因为m<=15,异或只会影响最后四位数
则将f[x]拆分为f0[x]:f[x]除去最后四位数的部分:xx0000
f1[x][0~15]:f1[x][j]表示f[x]中有多少个最后四位为j的距离(不能像原来一样直接加进去,因为最后要异或)
g[x]同理。
*/ void ins(int x,int y,int d)
{
len++;
a[len].x=x;a[len].y=y;a[len].d=d;
a[len].next=first[x];first[x]=len;
} void dfs1(int x,int fa)
{
f1[x][]=;//debug
tot[x]=;
for(int i=first[x];i;i=a[i].next)
{
int y=a[i].y;
if(y!=fa)
{
dfs1(y,x);
tot[x]+=tot[y];
// f[x]+=f[y]+a[i].d*tot[y];
int now=a[i].d;
f0[x]+=f0[y]+tot[y]*(now-(now%));
for(int j=;j<=;j++)
{
int t=j+now%;
f1[x][t%]+=f1[y][j];
f0[x]+=(t-(t%))*f1[y][j];
}
}
}
} void dfs2(int x,int fa)
{
for(int i=first[x];i;i=a[i].next)
{
int y=a[i].y;
if(y!=fa)
{
// g[y]=f[x]+g[x]-f[y]+(n-2*tot[y])*a[i].d;
// g[y]=f[x]+g[x] - (f[y]+tot[y]*a[i].d) + (n-tot[y])*a[i].d /*
减法不会出现不够减:
因为减的东西之前一定加过(所以要考虑它的实际意义)
*/ //z c f[y]+tot[y]*a[i].d
int z=,c[];
memset(c,,sizeof(c));
int now=a[i].d;
z+=f0[y]+tot[y]*(now-(now%));
for(int j=;j<=;j++)
{
int t=j+now%;
c[t%]+=f1[y][j];//以y为根的子树中每个点都要加d(x,y),j变为t%16
z+=(t-(t%))*f1[y][j];
} //g[y]=f[x]+g[x]-(f[y]+tot[y]*a[i].d)
g0[y]+=f0[x]+g0[x]-z;
for(int j=;j<=;j++) g1[y][j]+=f1[x][j]+g1[x][j]-c[j]; //g[y]+=(n-tot[y])*a[i].d
for(int j=;j<=;j++) c[j]=g1[y][j];
for(int j=;j<=;j++)
{
int t=j+now;
g1[y][t%]=c[j];
g0[y]+=(t-(t%))*c[j];
}
dfs2(y,x);
}
}
} int main()
{
// freopen("a.in","r",stdin);
freopen("warehouse.in","r",stdin);
freopen("warehouse.out","w",stdout);
len=;
memset(first,,sizeof(first));
scanf("%d%d",&n,&m);
for(int i=;i<n;i++)
{
int x,y,d;
scanf("%d%d%d",&x,&y,&d);
ins(x,y,d),ins(y,x,d);
}
memset(f0,,sizeof(f0));
memset(f1,,sizeof(f1));
memset(g0,,sizeof(g0));
memset(g1,,sizeof(g1));
dfs1(,);dfs2(,);
int ans=;
for(int i=;i<=n;i++)
{
ans=f0[i]+g0[i];
for(int j=;j<=;j++)
{
int now=j^m;
ans+=(f1[i][j]+g1[i][j])*now;
}
ans-=m;
printf("%d\n",ans);
}
return ;
}

【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. 封装一个List集合和datatable相互转换的工具类(可对指定列进行重命名并且指定输出列)

    /// <summary> /// List转换为DataTable对象 /// </summary> public class ListTranTableModel { // ...

  2. samba与apache配置使用

    samba与apache根目录 1.直接将apache用户作为samba用户 2.给apache用户赋宇网站根目录的acl rwx权限 #注意 第一次不要加默认的权限 setfacl -m u:apa ...

  3. Question | 关于Android安全的一二事

    本文来自网易云社区 "Question"为网易云易盾的问答栏目,将会解答和呈现安全领域大家常见的问题和困惑.如果你有什么疑惑,也欢迎通过邮件(zhangyong02@corp.ne ...

  4. js键盘相关知识总结

    一.相应事件 keydown:按下键盘上的任意键都可触发,按着不放则重复触发 keypress:按下键盘上的字符键时触发,按着不放则重复触发 keyup:释放按键时触发 事件顺序:keydown> ...

  5. 第三十五篇 类的内置属性(attr属性),包装和授权,__getattr__

    双下划线开头的attr方法,都是类内置的方法. 一. 如果没有在类里定义这三个方法,调用的时候就调用类内置的默认的方法 class Too: pass # 类没有定义这三个属性,就用系统默认的方法 t ...

  6. SetWindowPos,RegisterHotKey,GlobalAddAtom的用法

    还以为SetWindowPos是给Frm的子框架间编写的,原来是给mainfrm写的,可以把你写的主窗口置顶,置底(看样子应该可以变成桌面了,还没试呢,才忙到现在...) 子窗口的遮挡可以使用窗口的样 ...

  7. chrome提示Adobe Flash Player过期解决

    安装插件:install_flash_player_ppapi.exe

  8. MyBatis实例教程--开发环境搭建

    MyBatis实例教程--开发环境搭建 准备工作: 1.mybatis 的开发环境搭建,选择: eclipse j2ee 版本,mysql 5.1 ,jdk 1.7,mybatis3.2.0.jar包 ...

  9. 在线算法&离线算法

    [在线算法] 定义:指用户每输入一个查询便马上处理一个查询.该算法一般用较长的时间做预处理,待信息充足以后便可以用较少的时间回答每个查询. 常见在线算法:ST算法 [离线算法] 定义:

  10. onkeypress,onkeyup,onkeydown区别

    onkeypress 这个事件在用户按下并放开任何字母数字键时发生.系统按钮(例如,箭头键和功能键)无法得到识别. onkeyup 这个事件在用户放开任何先前按下的键盘键时发生. onkeydown ...