2019 沈阳网络赛 Fish eating fruit
这题看了三个月,终于过了,第一次看的时候没学树形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的更多相关文章
- 2019ICPC沈阳网络赛-D-Fish eating fruit(树上DP, 换根, 点分治)
链接: https://nanti.jisuanke.com/t/41403 题意: State Z is a underwater kingdom of the Atlantic Ocean. Th ...
- 2019 沈阳网络赛 D Fish eating fruit ( 树形DP)
题目传送门 题意:求一颗树中所有点对(a,b)的路径长度,路径长度按照模3之后的值进行分类,最后分别求每一类的和 分析:树形DP \(dp[i][j]\) 表示以 i 为根的子树中,所有子节点到 i ...
- 2019沈阳网络赛B.Dudu's maze
https://www.cnblogs.com/31415926535x/p/11520088.html 啊,,不在状态啊,,自闭一下午,,都错题,,然后背锅,,,明明这个简单的题,,, 这题题面不容 ...
- [2019沈阳网络赛D题]Dawn-K's water(点分治)
题目链接 题意为求出树上任意点对的距离对3取余的和. 比赛上听到题意就知道是点分治了,但是越写越不对劲,交之前就觉得会T,果不其然T了.修修改改结果队友写了发dp直接就过了Orz. 赛后想了想维护的东 ...
- 【2019沈阳网络赛】G、Special necklace——自闭的物理题
这道题让我差点怀疑自己高考没考过物理 题意中 he measures the resistance of any two endpoints of it, the resistance values ...
- 2019沈阳网赛树形dp
https://nanti.jisuanke.com/t/41403 2019沈阳网络赛D题 树形dp.一棵树,求任意两个点的距离之和.u-v和v-u算两次.两点之间的距离分为三类,模3等于0,1,2 ...
- Fish eating fruit 沈阳网络赛(树形dp)
Fish eating fruit \[ Time Limit: 1000 ms \quad Memory Limit: 262144 kB \] 题意 大体的题意就是给出一棵树,求每一对点之间的距离 ...
- 2018 ICPC 沈阳网络赛
2018 ICPC 沈阳网络赛 Call of Accepted 题目描述:求一个算式的最大值与最小值. solution 按普通算式计算方法做,只不过要同时记住最大值和最小值而已. Convex H ...
- 2019南昌网络赛I:Yukino With Subinterval(CDQ) (树状数组套主席树)
题意:询问区间有多少个连续的段,而且这段的颜色在[L,R]才算贡献,每段贡献是1. 有单点修改和区间查询. 思路:46min交了第一发树套树,T了. 稍加优化多交几次就过了. 不难想到,除了L这个点, ...
随机推荐
- 前端基础☞CSS
css的四种引入方式 1.行内式 行内式是在标记的style属性中设定CSS样式.这种方式没有体现出CSS的优势,不推荐使用. <p style="background-color: ...
- 使用Laravel5做权限管理
https://www.imooc.com/article/18250 关于权限管理的思考 最近在用laravel设计后台,后台需要有个权限管理.权限管理实质上分为两个部分,首先是认证,然后是权限.认 ...
- 解决ArcMap绘图错误
这几天在用ArcMap对shapefile做矢量化的过程中,遇到一件特别蛋疼的事,ArcMap竟然会出现绘图错误.如下所示: 纠结了许久之后,终于在Esri社区找到了解决办法:帮助文档中说 “检查属性 ...
- JVM 调优 —— GC 长时间停顿问题及解决方法
零. 简介 垃圾收集器长时间停顿,表现在 Web 页面上可能是页面响应码 500 之类的服务器错误问题,如果是个支付过程可能会导致支付失败,将造成公司的直接经济损失,程序员要尽量避免或者说减少此类情况 ...
- 2019-8-31-dotnet-使用-MessagePack-序列化对象
title author date CreateTime categories dotnet 使用 MessagePack 序列化对象 lindexi 2019-08-31 16:55:58 +080 ...
- offsetheight 和clientheight、scrollheight、scrollTop区别
clientHeight:元素客户区的大小,指的是元素内容及其边框所占据的空间大小(经过实践取出来的大多是视口大小) scrollHeight: 滚动大小,指的是包含滚动内容的元素大小(元素内容的总高 ...
- List of open source software
List of open source software https://www.ibm.com/developerworks/community/wikis/home?lang=en#!/wiki/ ...
- RequestMapping中produces属性作用
注解RequestMapping中produces属性可以设置返回数据的类型以及编码,可以是json或者xml: @RequestMapping(value="/xxx",prod ...
- 2018-10-15-Winforms-可能遇到的-1000-个问题
title author date CreateTime categories Winforms 可能遇到的 1000 个问题 lindexi 2018-10-15 09:35:15 +0800 20 ...
- C++第三次作业:友元类
友元类 将数据与处理数据的函数封装在一起,构成类,即实现了数据的共享又实现了隐藏,无疑是面向程序设计的一大优点,但是封装并不总是完美的,一旦需要涉及到一个类的两个对象的数据处理问题该怎么办?无论是设计 ...