这题看了三个月,终于过了,第一次看的时候没学树形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. 巨蟒python全栈开发-第11阶段 ansible_project3

    今日大纲: 1.用户创建 2.前端优化 3.用户编辑 4.用户删除 5.ansible api介绍 1.用户创建 新建一个user_create.html的页面 <form class=&quo ...

  2. java基础部分的一些有意思的东西。

    ${li.key!=''&&li.key!= null}可以直接判断不为空 ${empty li.value}也是不为空. 最近好烦迭代map里的map或者map里的list 后来发现 ...

  3. LeetCode70 Climbing Stairs

    题目: You are climbing a stair case. It takes n steps to reach to the top. Each time you can either cl ...

  4. PyTorch入门学习(二):Autogard之自动求梯度

    autograd包是PyTorch中神经网络的核心部分,简单学习一下. autograd提供了所有张量操作的自动求微分功能. 它的灵活性体现在可以通过代码的运行来决定反向传播的过程, 这样就使得每一次 ...

  5. Mysql 查询一天中每半小时记录的数量

    SELECT HOUR(e.time)as Hour,FLOOR(MINUTE(e.time)/30) as M, COUNT(*) as Count FROM error_log e WHERE e ...

  6. mysql数据库之存储引擎

    mysql存储引擎概述 什么是存储引擎?                                                               MYSQL中的数据用各不相同的技术 ...

  7. 20182019-acmicpc-asia-dhaka-regional F .Path Intersection 树链剖分

    直接进行树链剖分,每次对路径区间内的所有点值+1,线段树进行维护,然后查询线段树的最大值的个数!!! 查询线段树区间最大值个数,可以先维护区间和,在维护区间最值,如果区间和等于区间最值乘以区间长度,那 ...

  8. Laravel 5.3 用户验证源码探究 (一) 路由与注册

    https://blog.csdn.net/realghost/article/details/52558962 简介 Laravel 从 5.2 开始就有了开箱即用的用户验证,5.3 又在 5.2 ...

  9. [转][ASP.NET Core 3框架揭秘] 跨平台开发体验: Windows [下篇]

    由于ASP.NET Core框架在本质上就是由服务器和中间件构建的消息处理管道,所以在它上面构建的应用开发框架都是建立在某种类型的中间件上,整个ASP.NET Core MVC开发框架就是建立在用来实 ...

  10. css超出盒子隐藏

    效果如图1-1. 效果图1-1 css代码: white-space: nowrap;overflow: hidden; text-overflow: ellipsis; display: inlin ...