这题看了三个月,终于过了,第一次看的时候没学树形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. dataframe添加元素指定为列表,不同for循环命名空间下的变量重复问题

    split=pd.DataFrame({'data':[0],'len':0,'count':0},index=[0])for i_t in range(over_128.shape[0]): ct= ...

  2. python 自动登录网页

    语言:python 浏览器:chrome 工具:chrome控制台 #!/usr/bin/python # coding: GBK import urllib,urllib2,httplib,cook ...

  3. redhat6.5安装oracle11_2R

    参照前人一步一步操作: http://leihenzhimu.blog.51cto.com/3217508/1685164 遇到如下错误: This is a prerequisite conditi ...

  4. Laravel 上传excel,读取并写入数据库 (实现自动建表、存记录值

    <?php namespace App\Http\Controllers; use Illuminate\Foundation\Bus\DispatchesJobs; use Illuminat ...

  5. CODE FESTIVAL 2017 qual A C Palindromic Matrix(补题)

    彩笔看到题目后,除了懵逼,没有啥反应了,唯一想的就是 这是不是dp啊?看了题解才发现,原来是这样啊. 画几个矩阵看看就能看出来规律. 思路:先假设这是个M * N的矩阵 如果M和N都是偶数,则每个出现 ...

  6. OP_REQUIRES failed at conv_ops.cc:386 : Resource exhausted: OOM when allocating tensor with shape..

    tensorflow-gpu验证准确率是报错如上: 解决办法: 1. 加入os.environ['CUDA_VISIBLE_DEVICES']='2' 强制使用CPU验证-----慢 2.'batch ...

  7. H3C 物理层

  8. H3C 轮询DCC和共享DCC

  9. mac常用快捷键,Mac文件重命名快捷键,Mac OS快速访问系统根目录, MacOS 10.11重要数据的存储位置大全

    command+r,相当于F5,刷新页面 command+F5,启动voiceover command+q 关闭当前程序 在Finder中command+/ 打开底部状态栏,可以查看剩余磁盘空间大小 ...

  10. 实现三个div,固定左右两边的div宽为200,中间的div宽度自适应的四种方法

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...