2019CCPC-江西省赛 -A Cotree (树形DP,求树上一点到其他点的距离之和)
我是傻逼我是傻逼
#include<bits/stdc++.h>
using namespace std;
const int maxn=4e5+50;
typedef long long ll;
const ll mod=998244353;
int Laxt[maxn],Next[maxn],To[maxn],cnt;
void add(int u,int v){
Next[++cnt]=Laxt[u];
Laxt[u]=cnt;
To[cnt]=v;
Next[++cnt]=Laxt[v];
Laxt[v]=cnt;
To[cnt]=u;
}
ll dp[maxn],sz[maxn];
int vis[maxn];
void dfs(int u,int p){
sz[u]=1;vis[u]=1;
for(int i=Laxt[u];i;i=Next[i]){
int v=To[i];
if(v==p)continue;
dfs(v,u);
sz[u]+=sz[v];
dp[u]+=dp[v]+sz[v];
}
}
ll mi[5],id[5];
void dfs1(int u,int pre,int o){
if(mi[o]>dp[u]){
mi[o]=dp[u];id[o]=u;
}
// cout<<"u="<<u<<" "<<"dp[u]="<<dp[u]<<endl;
for(int i=Laxt[u];i;i=Next[i]){
int v=To[i];
if(v==pre)continue;
dp[u]-=dp[v]+sz[v];
sz[u]-=sz[v];
dp[v]+=dp[u]+sz[u];
sz[v]+=sz[u];
dfs1(v,u,o);
sz[v]-=sz[u];
dp[v]-=dp[u]+sz[u];
sz[u]+=sz[v];
dp[u]+=dp[v]+sz[v];
}
}
ll sum=0;
void dfs2(int u,int pre){
sum+=dp[u];
// cout<<"u="<<u<<" "<<dp[u]<<endl;
for(int i=Laxt[u];i;i=Next[i]){
int v=To[i];
if(v==pre)continue;
dp[u]-=dp[v]+sz[v];
sz[u]-=sz[v];
dp[v]+=dp[u]+sz[u];
sz[v]+=sz[u];
dfs2(v,u);
sz[v]-=sz[u];
dp[v]-=dp[u]+sz[u];
sz[u]+=sz[v];
dp[u]+=dp[v]+sz[v];
}
}
int main(){
std::ios::sync_with_stdio(false);
int n;
cin>>n;
for(int i=1;i<=n-2;i++){
int u,v;
cin>>u>>v;
add(u,v);
}
int tot=0;
for(int i=0;i<4;i++)mi[i]=1e18;
for(int i=1;i<=n;i++){
if(!vis[i]){
dfs(i,0);
/* for(int i=1;i<=n;i++){
cout<<"i="<<i<<" "<<dp[i]<<" "<<sz[i]<<endl;
}*/
dfs1(i,0,++tot);
}
}
add(id[1],id[2]);
memset(dp,0,sizeof(dp));
memset(sz,0,sizeof(sz));
dfs(1,0);
dfs2(1,0);
cout<<sum/2<<endl;
return 0;
}
2019CCPC-江西省赛 -A Cotree (树形DP,求树上一点到其他点的距离之和)的更多相关文章
- hdu6446 网络赛 Tree and Permutation(树形dp求任意两点距离之和)题解
题意:有一棵n个点的树,点之间用无向边相连.现把这棵树对应一个序列,这个序列任意两点的距离为这两点在树上的距离,显然,这样的序列有n!个,加入这是第i个序列,那么这个序列所提供的贡献值为:第一个点到其 ...
- HDU 4514 - 湫湫系列故事——设计风景线 - [并查集判无向图环][树形DP求树的直径]
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4514 Time Limit: 6000/3000 MS (Java/Others) Memory Li ...
- 浅谈关于树形dp求树的直径问题
在一个有n个节点,n-1条无向边的无向图中,求图中最远两个节点的距离,那么将这个图看做一棵无根树,要求的即是树的直径. 求树的直径主要有两种方法:树形dp和两次bfs/dfs,因为我太菜了不会写后者这 ...
- 树形dp - 求树的直径
随着杭州西湖的知名度的进一步提升,园林规划专家湫湫希望设计出一条新的经典观光线路,根据老板马小腾的指示,新的风景线最好能建成环形,如果没有条件建成环形,那就建的越长越好. 现在已经勘探确定了n个位置可 ...
- 2017 Wuhan University Programming Contest (Online Round) B Color 树形dp求染色方法数
/** 题目:Color 链接:https://oj.ejq.me/problem/23 题意:给定一颗树,将树上的点最多染成m种颜色,有些节点不可以染成某些颜色.相邻节点颜色不同.求染色方法数. 思 ...
- HDU - 3899 JLUCPC(树形dp求距离和)
JLUCPC Dr. Skywind and Dr. Walkoncloud are planning to hold the annual JLU Collegiate Programming Co ...
- 4.9 省选模拟赛 圆圈游戏 树形dp set优化建图
由于圆不存在相交的关系 所以包容关系形成了树的形态 其实是一个森林 不过加一个0点 就变成了树. 考虑对于每个圆都求出最近的包容它的点 即他的父亲.然后树形dp即可.暴力建图n^2. const in ...
- 树形DP求树的重心 --SGU 134
令一个点的属性值为:去除这个点以及与这个点相连的所有边后得到的连通分量的节点数的最大值. 则树的重心定义为:一个点,这个点的属性值在所有点中是最小的. SGU 134 即要找出所有的重心,并且找出重心 ...
- CSP模拟赛 Repulsed(树形DP)
题面 ⼩ w ⼼⾥的⽕焰就要被熄灭了. 简便起⻅,假设⼩ w 的内⼼是⼀棵 n − 1 条边,n 个节点的树. 现在你要在每个节点⾥放⼀些个灭⽕器,每个节点可以放任意多个. 接下来每个节点都要被分配给 ...
随机推荐
- Spring Boot教程(三十五)使用MongoDB数据库(1)
MongoDB简介 MongoDB是一个基于分布式文件存储的数据库,它是一个介于关系数据库和非关系数据库之间的产品,其主要目标是在键/值存储方式(提供了高性能和高度伸缩性)和传统的RDBMS系统(具有 ...
- Binary Protocol
A. Binary Protocol 这道题要唯一注意的一点就是数字0的表示--0个"1"来表达,所以字符串"100"所表示的数字就是100 附代码: // C ...
- RabbitAdmin
RabbitAdmin底层实现就是从Spring容器中获取Exchange.Binding.Routingkey以及Queue的@声明然后使用RabbitTemplate的execute方法执行对应的 ...
- Keras学习笔记二:保存本地模型和调用本地模型
使用深度学习模型时当然希望可以保存下训练好的模型,需要的时候直接调用,不再重新训练 一.保存模型到本地 以mnist数据集下的AutoEncoder 去噪为例.添加: file_path=" ...
- 面试准备一个访问一个URL的过程简版
客户端获取URL - > DNS解析 - > TCP连接 - >发送HTTP请求 - >服务器处理请求 - >返回报文 - >浏览器解析渲染页面 - > TC ...
- Python中的OS对路径的操作以及应用
目录处理 OS目录处理目录-->路径,文件夹 文件:html 1. 新建和删除一个目录import os #引入os目录from xx import xxos.mkdir("D:\\P ...
- XPATH了解
特殊标签 找SVG这种特殊标签可以使用[name()='svg'],如//[name()='svg']/[name()='line'][2] 文本 找标签内的文本时可以使用: //*[text()=' ...
- 五、Jmeter中提取JSON响应中数组的长度
json响应如下: { "code":0, "data":{ "data":[ { "amount":50000, &q ...
- js如何获取window.location.href跳转后查询字符串的值?
$("#worked_count").parent().attr("onClick","window.location.href='view/warn ...
- 如何在gradle项目中添加额外非开源jar包并提交代码
前提:项目开发中,遇到一个地方需要用到公司自定义的jar包,然后要放到代码里又不方便提交到私服 具体实施: 首先在项目中增加一个 libs目录,然后把这种非开源又不在私服上的jar包扔进去, 然后打开 ...