题目链接

题意:给你一棵树,然后连接两个有公共邻居的点,问你连完后,任意两点的距离之和。

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

  1. #include <set>
  2. #include <map>
  3. #include <queue>
  4. #include <stack>
  5. #include <math.h>
  6. #include <bitset>
  7. #include <vector>
  8. #include <stdio.h>
  9. #include <stdlib.h>
  10. #include <string.h>
  11. #include <iostream>
  12. #include <algorithm>
  13. #define MAXN 1010100
  14. #define LL long long
  15. #define fi first
  16. #define se second
  17. #define mp make_pair
  18. #define pb push_back
  19. #define ll __int64
  20. #define INF 0x7fffffff
  21. #define cs(s) freopen(s,"r",stdin)
  22. #define mem(x) memset(x,0,sizeof(x))
  23. #define PI acos(-1)
  24. #define eps 1e-10
  25. using namespace std;
  26. int gcd(int a,int b){return b?gcd(b,a%b):a;}
  27. int lcm(int a,int b){return a/gcd(a,b)*b;}
  28. 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;}
  29. //head
  30. const int N=2e5+11;
  31. vector<int>v[N];
  32. int n,dp[N][3];
  33. void dfs(int now,int pre,int sta){
  34. dp[now][1]++;
  35. dp[now][2]=sta;
  36. for(int k:v[now]){
  37. if(k==pre)continue;
  38. dfs(k,now,sta^1);
  39. dp[now][1]+=dp[k][1];
  40. }
  41. }
  42. int main(){
  43. ios::sync_with_stdio(false);
  44. cin>>n;
  45. for(int i=1;i<n;i++){
  46. int s,t;
  47. cin>>s>>t;
  48. v[s].pb(t);
  49. v[t].pb(s);
  50. }
  51. dfs(1,0,0);
  52. LL ans,res;
  53. ans=res=0;
  54. for(int i=1;i<=n;i++){
  55. ans+=dp[i][1]*(n-dp[i][1]);
  56. res+=dp[i][2];
  57. }
  58. ans+=res*(n-res);
  59. cout<<ans/2;
  60. return 0;
  61. }

CF 1060E. Sergey and Subway的更多相关文章

  1. 1060E Sergey and Subway(思维题,dfs)

    题意:给出一颗树,现在,给哪些距离为2的点对,加上一条边,问所有点对的距离和 题解:如果没有加入新的边,距离和就会等于每条边的贡献,由于是树,我们用点来代表点上面的边,对于每条边,它的贡献将是(子树大 ...

  2. 【非原创】codeforces 1060E Sergey and Subway 【树上任意两点距离和】

    学习博客:戳这里 本人代码: 1 #include <bits/stdc++.h> 2 using namespace std; 3 typedef long long ll; 4 con ...

  3. [CF1060E]Sergey and Subway[树dp]

    题意 给出 \(n\) 个点的树,求 \(\sum_{i=1}^n{\sum_{j=i}^n{\lceil \frac{dis(i,j)}{2} \rceil}}\) . \(n\leq 2 \tim ...

  4. CF1060E Sergey and Subway 思维

    分两种情况讨论 一种为奇数长为$L$的路径,在经过变化后,我们需要走$\frac{L}{2} + 1$步 一种为偶数长为$L$的路径,在变化后,我们需要走$\frac{L}{2}$步 那么,我们只需要 ...

  5. cf1060E. Sergey and Subway(树形dp)

    题意 题目链接 Sol 很套路的题 直接考虑每个边的贡献,最后再把奇数点的贡献算上 #include<bits/stdc++.h> #define Pair pair<int, in ...

  6. E. Sergey and Subway

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

  7. CF1060E Sergey and Subway(点分治)

    给出一颗$N$个节点的树,现在我们**在原图中**每个不直接连边但是中间只间隔一个点的两个点之间连一条边. 比如**在原图中**$u$与$v$连边,$v$与$w$连边,但是$u$与$w$不连边,这时候 ...

  8. CF上部分树形DP练习题

    本次 5 道题均来自Codeforce 关于树形DP的算法讲解:Here 791D. Bear and Tree Jumps 如果小熊每次能跳跃的距离为1,那么问题变为求树上任意两点之间距离之和. 对 ...

  9. [CF]Round513

    A Phone Numbers 题意:定义"电话号码"为开头为'8',长度为11的字符串.给定一些字符,每个字符只能用一次,求可以拼出多少个电话号码(可以重复). 直接min(st ...

随机推荐

  1. TYVJ1266 费解的开关

    恩,这题...... 看看题面想到了啥?炮兵阵地! 再仔细一思考:炮兵阵地是求放置最多,而这个显然可以递推得出. 由于每个格子至多点一次,那么我们发现: 在第一行点击状态确定的情况下,后面每个格子的点 ...

  2. jokes

    先看效果如下 目录如下 //index.html <!DOCTYPE html> <html lang="zh-CN"> <head> < ...

  3. Codeforces Round #525 (Div. 2)

    Codeforces Round #525 (Div. 2) 哎,忍不住想吐槽一下,又要准备训练,又要做些无聊的事,弄得我都想退出了. 好好的训练不好么???? 只能做出两道水题,其实C题,感觉做出来 ...

  4. macs安卓工程创建

    第一个 1.创建工程后先修改xml文件. 然后主程序中编写代码. center :如果图片比imageview大则显示中片中心部分 image大小  把view填满 匹配父控件 ,父控件多大它就多大. ...

  5. 在gitlab新建空项目,将本地的git仓库的内容上传

    gitlab新建了这个项目. 按照官网的步骤上传代码 一:将本地代码上传到本地仓库 1.进入项目文件夹 git init 2.项目代码添加到本地git git add . 3.提交到stage区域 g ...

  6. 多文件协作,extern、static、头文件

    多个cpp文件协同工作.使用外部函数.变量时,必须先声明再使用.声明外部函数(一般在main.cpp中),extern可省略(主函数中默认可访问外部函数)extern void RectArea(); ...

  7. Constructor >> @Autowired >> @PostConstruct

    从依赖注入的字面意思就可以知道,要将对象p注入到对象a,那么首先就必须得生成对象p与对象a,才能执行注入.所以,如果一个类A中有个成员变量p被@Autowired注解,那么@Autowired注入是发 ...

  8. eclipse 中新建文件报错The superclass "javax.servlet.http.HttpServlet" was not found on the Java Buil

    在eclipse中新建文件报错错误提示如下: The superclass "javax.servlet.http.HttpServlet" was not found on th ...

  9. Qt ------ excel 操作

    写 excel // step1:连接控件 QAxObject* excel = new QAxObject(this); excel->setControl("Excel.Appli ...

  10. java虚拟机的内存模型

    一.为什么要了解java虚拟机的内存模型 java虚拟机作为java代码运行的平台,是java技术的基石.了解java虚拟机的内存模型也就变得十分必要.它能帮助我们更好的了解java代码的运行机制,更 ...