一棵树,如果有序点对(x,y)之间路径的长度取模于3==0,那么ans0便加上这个长度;

  如果取模于3==1,那么ans1便加上这个长度;

  如果取模于3==2,那么ans2便加上这个长度;

让你求ans0,ans1,ans2;

输入格式:

第一行包括一个整数n,表示一共有n个点

下面n-1行,每一行分别输入三个整数a,b,v,代表从a到b有一条长度为v的路径,输入保证不出现环和重边

输出格式:

输出包含三个整数分别为三个答案里存的路径长度之和模1e9+7;

样例:

5

0  1  2

0  2  3

0  3  7

0  4  6

54  60  30

显然,这是一个树形DP,只要记录这个点的子树到这个点的距离的模数就好了;

注意状态转移时的边界;

#include <bits/stdc++.h>
#pragma GCC optimize(2)
#pragma GCC optimize(3)
#define p 1000000007
#define inc(i,a,b) for(register int i=a;i<=b;i++)
#define dec(i,a,b) for(register int i=a;i>=b;i--)
using namespace std;
template<class nT>
inline void read(nT& x)
{
char c; while(c=getchar(),!isdigit(c));
x=c^48; while(c=getchar(),isdigit(c)) x=x*10+c-48;
}
int head[2000010],cnt;
class littlestar{
public:
int to;
int nxt;
int w;
void add(int u,int v,int gg){
to=v;
nxt=head[u];
w=gg;
head[u]=cnt;
}
}star[2000010];
int g[1000010][4];
void dfs(int u,int fa)
{
g[u][0]=1;
for(int i=head[u];i;i=star[i].nxt){
int v=star[i].to;
if(v==fa) continue;
dfs(v,u);
inc(j,0,2) g[u][(j+star[i].w%3)%3]+=g[v][j];
}
}
long long ans[5],f[1000010][4];
long long tmp[5],tot[5];
void dp(int u,int fa)
{
for(int i=head[u];i;i=star[i].nxt){
int v=star[i].to;
if(v==fa) continue;
dp(v,u);
tmp[0]=tmp[1]=tmp[2]=0;
tot[0]=tot[1]=tot[2]=0;
inc(j,0,2){
tmp[(j+star[i].w)%3]=(tmp[(j+star[i].w)%3]+f[v][j])%p;
tmp[(j+star[i].w)%3]=(tmp[(j+star[i].w)%3]+g[v][j]*star[i].w%p)%p;
tot[(j+star[i].w)%3]=(tot[(j+star[i].w)%3]+g[v][j])%p;
}
inc(j,0,2){
inc(k,0,2){
ans[(j+k)%3]=(ans[(j+k)%3]+tmp[j]*(g[u][k]-tot[k]))%p;
}
}
inc(j,0,2){
f[u][j]=(f[u][j]+tmp[j])%p;
}
}
}
int main()
{
int n; read(n);
inc(i,1,n-1){
int u,v,w; read(u); read(v); read(w);
++u; ++v;
star[++cnt].add(u,v,w);
star[++cnt].add(v,u,w);
}
dfs(1,0);
dp(1,0);
cout<<ans[0]*2%p<<" "<<ans[1]*2%p<<" "<<ans[2]*2%p;
}

友善的树形DP的更多相关文章

  1. poj3417 LCA + 树形dp

    Network Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 4478   Accepted: 1292 Descripti ...

  2. COGS 2532. [HZOI 2016]树之美 树形dp

    可以发现这道题的数据范围有些奇怪,为毛n辣么大,而k只有10 我们从树形dp的角度来考虑这个问题. 如果我们设f[x][k]表示与x距离为k的点的数量,那么我们可以O(1)回答一个询问 可是这样的话d ...

  3. 【BZOJ-4726】Sabota? 树形DP

    4726: [POI2017]Sabota? Time Limit: 20 Sec  Memory Limit: 128 MBSec  Special JudgeSubmit: 128  Solved ...

  4. 树形DP+DFS序+树状数组 HDOJ 5293 Tree chain problem(树链问题)

    题目链接 题意: 有n个点的一棵树.其中树上有m条已知的链,每条链有一个权值.从中选出任意个不相交的链使得链的权值和最大. 思路: 树形DP.设dp[i]表示i的子树下的最优权值和,sum[i]表示不 ...

  5. 树形DP

    切题ing!!!!! HDU  2196 Anniversary party 经典树形DP,以前写的太搓了,终于学会简单写法了.... #include <iostream> #inclu ...

  6. BZOJ 2286 消耗战 (虚树+树形DP)

    给出一个n节点的无向树,每条边都有一个边权,给出m个询问,每个询问询问ki个点,问切掉一些边后使得这些顶点无法与顶点1连接.最少的边权和是多少.(n<=250000,sigma(ki)<= ...

  7. POJ2342 树形dp

    原题:http://poj.org/problem?id=2342 树形dp入门题. 我们让dp[i][0]表示第i个人不去,dp[i][1]表示第i个人去 ,根据题意我们可以很容易的得到如下递推公式 ...

  8. hdu1561 The more, The Better (树形dp+背包)

    题目链接:http://acm.split.hdu.edu.cn/showproblem.php?pid=1561 思路:树形dp+01背包 //看注释可以懂 用vector建树更简单. 代码: #i ...

  9. bzoj2500: 幸福的道路(树形dp+单调队列)

    好题.. 先找出每个节点的树上最长路 由树形DP完成 节点x,设其最长路的子节点为y 对于y的最长路,有向上和向下两种情况: down:y向子节点的最长路g[y][0] up:x的次长路的g[x][1 ...

随机推荐

  1. Tishreen-CPC 2018 G. Colors Overflow(分块)

    Problem G. Colors Overflow Input file: standard input Output file: standard output Balloon Color: Da ...

  2. [Note][深入理解Java虚拟机] 第三章 垃圾收集器与内存分配策略笔记

    书上关于GCTimeRatio的讲解有点难以理解,查看Oracle的文档后重新理解了下 -XX:GCTimeRatio 运行时间 / GC时间 当GCTimeRatio为19时,运行时间是GC时间的1 ...

  3. Centos7下设置MySql自动启动

    原文链接:http://www.cnblogs.com/Sungeek/p/9687565.html 1.将服务文件拷贝到init.d下,并重命名为mysql cp /usr/local/mysql/ ...

  4. Jmeter -- 脚本录制

    步骤如下: 1. 添加http代理服务器(Add -> Non-TestElement -> HTTP(S)Test Script Recorder) 2. 对http代理进行配置,如下图 ...

  5. DRL Hands-on book

    代码:https://github.com/PacktPublishing/Deep-Reinforcement-Learning-Hands-On Chapter 1 What is Reinfor ...

  6. HTTP中GET与POST的区别颠覆式的理解

    关于http中的get和post你轻轻松松的给出了一个“标准答案”: GET在浏览器回退时是无害的,而POST会再次提交请求. GET产生的URL地址可以被Bookmark,而POST不可以. GET ...

  7. leetcode题目11.盛最多水的容器(中等)

    题目描述: 给定 n 个非负整数 a1,a2,...,an,每个数代表坐标中的一个点 (i, ai) .在坐标内画 n 条垂直线,垂直线 i 的两个端点分别为 (i, ai) 和 (i, 0).找出其 ...

  8. 20175214 MySort(选做)

    一.题目要求 模拟实现Linux下Sort -t : -k 2的功能. 要有伪代码,产品代码,测试代码(注意测试用例的设计) 参考 Sort的实现.提交博客链接. 二.设计思路 在命令行中输入需要的参 ...

  9. python3笔记二十二:正则表达式之函数

    一:学习内容 re.match函数 re.search函数 re.findall函数 二:re.match函数 需要导入包:import re 1.格式:match(pattern,string,fl ...

  10. Java - 单链表

    链表是一种常见的基础数据结构,是一种有序的列表,但不会按照线性顺序存储数据,而是在每一个节点里存储下一个节点的指针(next).链表适合插入.删除,不宜过长,否则会导致遍历性能下降. 以节点方式存储: ...