#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. mac 安装php redis扩展

    git clone git://github.com/nicolasff/phpredis.git cd ./phpredis phpize 如果报 Cannot find autoconf. Ple ...

  2. php-configure错误解决

    configure: error: libjpeg.(a|so) not foundconfigure: error: libjpeg.(a|so) not foundln -sf libjpeg.s ...

  3. Android中StackOverflow的问题

    最近出现了一个让人抓狂的问题. 现在的项目中,制作了一个界面非常复杂.Fragment中嵌套下拉刷新的Listview 这样一个布局,在3.0以上的手机上都表现良好问题!但是在2.x的比较弱爆的手机上 ...

  4. 「题目代码」P1007~P1012(Java)

    1007 C基础-计负均正 import java.util.*; import java.io.*; public class Main { public static void main(Stri ...

  5. MySQL☞between ... and ...

    between  初值  and  终值:求出该列列值在初值和终值之间所有的数据 格式如下: select 列名/* from 表名 where 列名 between 初值 and 终值 如下图:

  6. Linux-ls,cd,type命令

    windows: dll:dynamic link library,动态链接库 Linux: .so:shared object,共享对象 操作系统: kernel:内核: 1.进程管理 2.内核管理 ...

  7. 在阿里云上遇见更好的Oracle(四)

    2016.5.13,北京,第七届数据库技术大会. 从最初的itpub社区,到后来被it168收购,DBA社区的线下聚会发展成2010年第一届数据库技术大会(DTCC).第一届大会汇聚了社区内活跃的各位 ...

  8. React错误总结解决方案(二)

    1.React native: Cannot add a child that doesn't have a YogaNode or parent node 该错误一般是因为render方法中注释语句 ...

  9. POJ 2168 Joke with Turtles(DP)

    Description There is a famous joke-riddle for children: Three turtles are crawling along a road. One ...

  10. 玩Vim

    1)我一个脚本中粘贴的都是当年在vim下粘的东西,都是带行号的,我现在想把所有的行号都换成回车键,要怎么办呢? %s/[0-9]/^M/g 注:其中回车在vim的输入方法是ctrl+V,会得到^,此时 ...