题目链接
题意:给你一棵树,然后连接两个有公共邻居的点,问你连完后,任意两点的距离之和。
一开始看这种题,还不怎么会做,借鉴了这位大佬的博客,get到了新技能,当我们求树上任意俩点的距离之时,可以转化问题,不看点,而看边,每条边的使用次数是固定的,每条边使用的次数为:这条边左边的顶点数*右边的顶点数,而由于我们可以将相隔一个点的两个点连起来,所以,如果是偶数的距离,我们可以2个2个跳,就是距离的一半,奇数呢就是(距离+1)/2,而奇数的距离只能在偶数和奇数层产生,所以用 d p [ n o w ] [ 2 ] dp[now][2] dp[now][2]记录当前节点 n o w now now的层数, d p [ n o w ] [ 1 ] dp[now][1] dp[now][1]表示由上一个节点pre出发,要经过 n o w now now才能到的点数(包括自己),那么 ( n − d p [ n o w ] [ 1 ] ) ∗ d p [ n o w ] [ 1 ] (n-dp[now][1])*dp[now][1] (n−dp[now][1])∗dp[now][1]就表示 p r e − > n o w pre->now pre−>now这条边的使用次数。

#include<bits/stdc++.h>#define fi first
#define se second
#define pb push_back
#define mp make_pair
#define LL long long
#define SZ(X) X.size()
#define pii pair<int,int>
#define ALL(X) X.begin(),X.end()using namespace std;LL gcd(LL a, LL b) {return b ? gcd(b, a % b) : a;}
LL lcm(LL a, LL b) {return a / gcd(a, b) * b;}
LL powmod(LL a, LL b, LL MOD) {LL ans = 1; while (b) {if (b % 2)ans = ans * a % MOD; a = a * a % MOD; b /= 2;} return ans;}
const int N = 2e5 + 11;
vector<int>v[N];
int n, dp[N][3];
void dfs(int now, int pre, int sta) {dp[now][1]++;dp[now][2] = sta;for (int k : v[now]) {if (k == pre)continue;dfs(k, now, sta ^ 1);dp[now][1] += dp[k][1];}
}
int main() {ios::sync_with_stdio(false);cin >> n;for (int i = 1; i < n; i++) {int s, t;cin >> s >> t;v[s].pb(t);v[t].pb(s);}dfs(1, 0, 0);LL ans, res;ans = res = 0;for (int i = 1; i <= n; i++) {ans += 1ll*dp[i][1] * (n - dp[i][1]);res += dp[i][2];}ans += 1ll*res * (n - res);cout << ans / 2;return 0;
}

CF 1060E. Sergey and Subway相关推荐

  1. CF1060E Sergey and Subway

    CF1060E Sergey and Subway 树上计数dp,考虑每条边的贡献,树上两点距离用深度与LCA表示 长度为2的两点间可以连一条边,所以对于任意两点 i , j i,j i,j, d i ...

  2. E. Sergey and Subway(思维 + dp)

    Problem - E - Codeforces Sergey Semyonovich 是 N 市县的市长,他一直在思考如何进一步改善 Nkers 的生活.不幸的是,几乎所有可以做的事情都已经完成了, ...

  3. cf 1060e 树形dp 树上任意两点的距离和

    题意: 给出一个树,把树上任意两个相隔一个点的点加一条边,问加完边之后任意两点的距离和是多少.   参考博客 :https://blog.csdn.net/Mr_Treeeee/article/det ...

  4. E. Sergey and Subway

    比赛时候写复杂了-- 我写的是 计算每个节点树内所有点到某个点的距离和. #include <bits/stdc++.h> using namespace std; typedef lon ...

  5. 2018.10.04 codeforces1060E. Sergey and Subway(树形dp)

    传送门 一开始把题意读错了. 我们dfs时对于边(p,fa)(p,fa)(p,fa),计算出以ppp为根的子树对子树外连通块的贡献,然后加上漏加的贡献. 这样算出来是答案的两倍. 因为相当于dis(u ...

  6. 杂题记录及简要题解(一)

    一些前几天做过的还不错的但是不是太想专门花一整篇博客的篇幅去写的题就简要地记录在这里. 说是简要题解,其实写得还是挺详细的.之后的杂题记录可能就会写得简略一点. CF1060E Sergey and ...

  7. 【Cf #503 C】Sergey's problem(有趣的构造)

    感觉这种构造题好妙啊,可我就是想不到诶. 给出一张无自环的有向图,回答一个独立集,使得图中任意一点都可以被独立集中的某一点两步之内走到. 具体构造方案如下: 下标从小到大枚举点,如果该点没有任何标记, ...

  8. 『参考』.net CF组件编程(4)——为自定义组件添加工具箱图标!

    前言: 在前三篇的文章中,和大家一起创建了一个用于TCP连接检测的小组件,如果你记不得了,可以通过以下链接去回顾一下: 『参考』.net CF组件编程(1)--基础之后 『参考』.net CF组件编程 ...

  9. 谢尔盖.布林的早期思想_谷歌联合创始人谢尔盖·布林(Sergey Brin)谈人工智能与自动化...

    谢尔盖.布林的早期思想 Here are three links worth your time: 这是三个值得您花费时间的链接: Google cofounder Sergey Brin talks ...

  10. L - Subway POJ - 2502

    L - Subway POJ - 2502 题意: 从 家出发步行与坐 subway 交替进行,问最小的时间花费,最终四舍五入答案为 整数 存图难 四舍五入: double b int a = b + ...

最新文章

  1. Delphi 调用webservice接口
  2. RapidFramework使用Oracle的步骤
  3. 华为服务器bios配置性能,高级电源管理配置 - 华为服务器 Brickland平台 BIOS 参数参考 30 - 华为...
  4. qt数据库有效插件为空的情况
  5. 独家深度 | 一文看懂 ClickHouse vs Elasticsearch:谁更胜一筹?
  6. 计算机类自主招生推荐信,自主招生推荐信范文:中国人民大学自主招生推荐信...
  7. a.使用new关键字产生对象会调用构造方法_JAVA创建对象的几种方式
  8. python类中包含一个特殊的变量、它表示当前对象自身_知到APP教师职场礼仪第七单元章节测试网课答案大学课后答案...
  9. SpringBoot2.x炫酷吊炸天前后端分离的后台管理系统实例
  10. c语言进度,C语言实现动态进度条
  11. 网络工程师考试第一节计算机硬件基础
  12. c++在数组中添加元素_LeetCode 题解 | 1157. 子数组中占绝大多数的元素
  13. BIM模型文件下载——某体育馆项目Revit模型
  14. 清晰的史密斯圆图 wiki上的
  15. 目前总结最新最系统的Java程序员未来职业规划路线,请收藏
  16. oracle的dbv命令,Oracle的DBV命令行工具用法详解
  17. 可能是最详细的Win10+黑苹果双系统安装教程(For Dell 7580)
  18. echarts X轴和Y轴不对应(xAxis type time)的用法
  19. chrome浏览器表单自动填充默认样式-autofill设置
  20. 表白必备 小心心 biubiubiu~

热门文章

  1. Qt 实现3D字体,并字体始终朝向屏幕
  2. 用python实现 斐波那契数列。 3种方法
  3. 计算机毕业设计JAVA社团管理系统mybatis+源码+调试部署+系统+数据库+lw
  4. 每个学数据分析的人,都有这样的血泪史。
  5. 12、空间滤波(2)
  6. 如何使用myEclipse来生成hibernate所需文件
  7. Kudu之SQL操作(KUDUImpala基本操作)
  8. 透彻理解神经机器翻译的原理
  9. eBay词汇表(中/英对照)
  10. 艾美捷内毒素纯化树脂说明书