这题看了三个月,终于过了,第一次看的时候没学树形DP,想用点分治但是不会

后来学了二次扫描,就有点想法了。。。。

这东西也真就玄学了吧。。。

#include<iostream>
#include<cstring>
#include<vector>
#include<algorithm>
using namespace std;
typedef long long ll;
const int maxn = 1e5 + 7;
const ll mod = 1e9 + 7;
struct Node {
int p;
ll len;
Node(int _p, ll _len) :p(_p), len(_len) {}
};
int n;
ll dp[maxn][5];
ll cnt[maxn][6];
vector<Node>G[maxn];
void insert(int be, int en, ll len) {
G[be].push_back(Node(en, len));
}
int dfs2(int x, int fa) {
for (int i = 0; i < G[x].size(); i++) {
int p = G[x][i].p;
ll len = G[x][i].len;
if (p == fa) continue;
dfs2(p, x);
for (int a = 0; a < 3; a++) {
dp[x][(a + len) % 3] += (dp[p][a] + cnt[p][a] * len) % mod;
cnt[x][(a + len) % 3] += cnt[p][a];
dp[x][(a + len) % 3] %= mod;
}
dp[x][len % 3] += len;
dp[x][len % 3] %= mod;
cnt[x][len % 3] ++;
}
return 0;
}
ll ans[10];
ll son[10];
int dfs(int x, int fa) {
for (int i = 0; i < G[x].size(); i++) {
int p = G[x][i].p;
ll len = G[x][i].len;
if (p == fa) continue; for (int a = 0; a < 3; a++) {
ans[(a + len) % 3] = (dp[x][(a + len) % 3] - (cnt[p][a] * len + dp[p][a])) % mod; ans[(a + len) % 3] += mod;
ans[(a + len) % 3] %= mod;
son[(a + len) % 3] = cnt[x][(a + len) % 3] - cnt[p][a];
}
son[len % 3]--;
ans[len % 3] = (ans[len % 3] - len + mod) % mod; //删除了多的边
for (int a = 0; a < 3; a++) {
dp[p][(a + len) % 3] += (ans[a] + son[a] * len) % mod;
dp[p][(a + len) % 3] %= mod;
cnt[p][(a + len) % 3] += son[a];
}
cnt[p][len % 3]++;
dp[p][len % 3] += len;
dp[p][len % 3] %= mod; dfs(p, x);
}
return 0;
}
int main() {
while (~scanf("%d", &n)) {
for (int i = 0; i <= n; i++) G[i].clear();
memset(dp, 0, sizeof(dp));
memset(cnt, 0, sizeof(cnt));
int be, en;
ll len;
for (int i = 1; i < n; i++) {
scanf("%d %d %lld", &be, &en, &len);
insert(be, en, len);
insert(en, be, len);
}
dfs2(0, -1);
dfs(0, -1); ll a = 0, b = 0, c = 0;
for (int i = 0; i < n; i++) {
a = (a + dp[i][0]) % mod;
b = (b + dp[i][1]) % mod;
c = (c + dp[i][2]) % mod;
}
printf("%lld %lld %lld\n", a, b, c);
}
return 0;
}

  

2019 沈阳网络赛 Fish eating fruit的更多相关文章

  1. 2019ICPC沈阳网络赛-D-Fish eating fruit(树上DP, 换根, 点分治)

    链接: https://nanti.jisuanke.com/t/41403 题意: State Z is a underwater kingdom of the Atlantic Ocean. Th ...

  2. 2019 沈阳网络赛 D Fish eating fruit ( 树形DP)

    题目传送门 题意:求一颗树中所有点对(a,b)的路径长度,路径长度按照模3之后的值进行分类,最后分别求每一类的和 分析:树形DP \(dp[i][j]\) 表示以 i 为根的子树中,所有子节点到 i ...

  3. 2019沈阳网络赛B.Dudu's maze

    https://www.cnblogs.com/31415926535x/p/11520088.html 啊,,不在状态啊,,自闭一下午,,都错题,,然后背锅,,,明明这个简单的题,,, 这题题面不容 ...

  4. [2019沈阳网络赛D题]Dawn-K's water(点分治)

    题目链接 题意为求出树上任意点对的距离对3取余的和. 比赛上听到题意就知道是点分治了,但是越写越不对劲,交之前就觉得会T,果不其然T了.修修改改结果队友写了发dp直接就过了Orz. 赛后想了想维护的东 ...

  5. 【2019沈阳网络赛】G、Special necklace——自闭的物理题

    这道题让我差点怀疑自己高考没考过物理 题意中 he measures the resistance of any two endpoints of it, the resistance values ...

  6. 2019沈阳网赛树形dp

    https://nanti.jisuanke.com/t/41403 2019沈阳网络赛D题 树形dp.一棵树,求任意两个点的距离之和.u-v和v-u算两次.两点之间的距离分为三类,模3等于0,1,2 ...

  7. Fish eating fruit 沈阳网络赛(树形dp)

    Fish eating fruit \[ Time Limit: 1000 ms \quad Memory Limit: 262144 kB \] 题意 大体的题意就是给出一棵树,求每一对点之间的距离 ...

  8. 2018 ICPC 沈阳网络赛

    2018 ICPC 沈阳网络赛 Call of Accepted 题目描述:求一个算式的最大值与最小值. solution 按普通算式计算方法做,只不过要同时记住最大值和最小值而已. Convex H ...

  9. 2019南昌网络赛I:Yukino With Subinterval(CDQ) (树状数组套主席树)

    题意:询问区间有多少个连续的段,而且这段的颜色在[L,R]才算贡献,每段贡献是1. 有单点修改和区间查询. 思路:46min交了第一发树套树,T了. 稍加优化多交几次就过了. 不难想到,除了L这个点, ...

随机推荐

  1. Revit安装失败怎样卸载重新安装Revit,解决Revit安装失败的方法总结

    技术帖:Revit没有按照正确方式卸载,导致Revit安装失败.楼主也查过网上关于如何解决Revit安装失败的一些文章,是说删除几个Revit文件和Revit软件注册表就可以解决Revit安装失败的问 ...

  2. UVa 10323 【数学】

    UVa 10323 题目:计算阶乘在10000~6227020800之间的值,不在范围对应输出Under或者Over. 分析:简单题.数论.因为13!=6227020800,7!<10000&l ...

  3. jsp中几注释的区别

    1).JSP页面中的HTML注释 SP页面中的HTML注释使用“<!—”和“-->”创建,它的具体形式如下所示: <!-- 注释内容 --> 当它出现在JSP页面时,微蘑菇将不 ...

  4. Alternating Direction Method of Multipliers -- ADMM

    前言: Alternating Direction Method of Multipliers(ADMM)算法并不是一个很新的算法,他只是整合许多不少经典优化思路,然后结合现代统计学习所遇到的问题,提 ...

  5. mysql数据库之工作流程

    MySQL架构总共四层,在上图中以虚线作为划分. 首先,最上层的服务并不是MySQL独有的,大多数给予网络的客户端/服务器的工具或者服务都有类似的架构.比如:连接处理.授权认证.安全等. 第二层的架构 ...

  6. APICloud原生APP中ajax需要用api.ajax

    报错截屏: APICloud原生APP中ajax请求需要用api.ajax(api对象的ajax方法来替代),否则会将引起请求失败. APICloud api.ajax

  7. swiper仿tab栏切换

    转载  https://developers.weixin.qq.com/community/develop/article/doc/000040a5dc4518005d2842fdf51c13 小程 ...

  8. Project Euler Problem 14-Longest Collatz sequence

    记忆化搜索来一发.没想到中间会爆int #include <bits/stdc++.h> using namespace std; const int MAXN = 1000000; in ...

  9. H3C 网络号和主机号

  10. mybatis 嵌套查询与懒加载

    懒加载:对于页面有很多静态资源的情况下(比如网商购物页面),为了节省用户流量和提高页面性能,可以在用户浏览到当前资源的时候,再对资源进行请求和加载. fetchType="lazy" ...