EZOJ #80
分析
经典的树型DP
我们记录dp[i][0/1]表示i的子树中到i的长度分别为偶数和奇数的长度和
dp2[i][0/1]则表示不在i的子树中的点到i的长度分别为偶数和奇数的长度和
然后根据边的长度情况转移一下就可以了
代码
#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<algorithm>
#include<cctype>
#include<cmath>
#include<cstdlib>
#include<queue>
#include<ctime>
#include<vector>
#include<set>
#include<map>
#include<stack>
using namespace std;
long long dp[][],dp2[][];
int sum[][],sum2[][];
int val[],to[],head[];
int nxt[],cnt,n,m;
inline void add(int x,int y,int z){
nxt[++cnt]=head[x];
head[x]=cnt;
to[cnt]=y;
val[cnt]=z;
nxt[++cnt]=head[y];
head[y]=cnt;
to[cnt]=x;
val[cnt]=z;
}
inline void dfs1(int x,int fa){
int i,j,k;
for(i=head[x];i;i=nxt[i]){
if(to[i]==fa)continue;
dfs1(to[i],x);
if(val[i]%){
dp[x][]+=dp[to[i]][];
dp[x][]+=1ll*sum[to[i]][]*val[i];
sum[x][]+=sum[to[i]][];
dp[x][]+=dp[to[i]][]+1ll*val[i];
dp[x][]+=1ll*sum[to[i]][]*val[i];
sum[x][]+=sum[to[i]][]+;
}else {
dp[x][]+=dp[to[i]][]+1ll*val[i];
dp[x][]+=1ll*sum[to[i]][]*val[i];
sum[x][]+=sum[to[i]][]+;
dp[x][]+=dp[to[i]][];
dp[x][]+=1ll*sum[to[i]][]*val[i];
sum[x][]+=sum[to[i]][];
}
}
return;
}
inline void dfs2(int x,int fa){
int i,j,k;
long long t0=,t1=;
int s0=,s1=;
for(i=head[x];i;i=nxt[i]){
if(to[i]==fa)continue;
if(val[i]%){
t0+=dp[to[i]][];
t0+=1ll*sum[to[i]][]*val[i];
s0+=sum[to[i]][];
t1+=dp[to[i]][]+1ll*val[i];
t1+=1ll*sum[to[i]][]*val[i];
s1+=sum[to[i]][]+;
}else {
t0+=dp[to[i]][]+1ll*val[i];
t0+=1ll*sum[to[i]][]*val[i];
s0+=sum[to[i]][]+;
t1+=dp[to[i]][];
t1+=1ll*sum[to[i]][]*val[i];
s1+=sum[to[i]][];
}
}
for(i=head[x];i;i=nxt[i]){
if(to[i]==fa)continue;
long long T0=t0,T1=t1;int S0=s0,S1=s1;
if(val[i]%){
T0-=dp[to[i]][];
T0-=1ll*sum[to[i]][]*val[i];
S0-=sum[to[i]][];
T1-=dp[to[i]][]+1ll*val[i];
T1-=1ll*sum[to[i]][]*val[i];
S1-=sum[to[i]][]+;
dp2[to[i]][]+=dp2[x][]+T1;
dp2[to[i]][]+=1ll*(sum2[x][]+S1)*val[i];
sum2[to[i]][]+=sum2[x][]+S1;
dp2[to[i]][]+=dp2[x][]+1ll*val[i]+T0;
dp2[to[i]][]+=1ll*(sum2[x][]+S0)*val[i];
sum2[to[i]][]+=sum2[x][]++S0;
dfs2(to[i],x);
}else {
T0-=dp[to[i]][]+1ll*val[i];
T0-=1ll*sum[to[i]][]*val[i];
S0-=sum[to[i]][]+;
T1-=dp[to[i]][];
T1-=1ll*sum[to[i]][]*val[i];
S1-=sum[to[i]][];
dp2[to[i]][]+=dp2[x][]+1ll*val[i]+T0;
dp2[to[i]][]+=1ll*(sum2[x][]+S0)*val[i];
sum2[to[i]][]+=sum2[x][]++S0;
dp2[to[i]][]+=dp2[x][]+T1;
dp2[to[i]][]+=1ll*(sum2[x][]+S1)*val[i];
sum2[to[i]][]+=sum2[x][]+S1;
dfs2(to[i],x);
}
}
return;
}
int main(){
int i,j,k,x,y,z;
scanf("%d%d",&n,&m);
for(i=;i<n;i++){
scanf("%d%d%d",&x,&y,&z);
add(x,y,z);
}
dfs1(,);
dfs2(,);
for(i=;i<=m;i++){
scanf("%d",&x);
printf("%lld %lld\n",dp[x][]+dp2[x][],dp[x][]+dp2[x][]);
}
return ;
}
EZOJ #80的更多相关文章
- 80 端口被占用 pid=4
80端口被pid=4的系统进程给占用的解决方法: 一般开发的时候我们都会安装sqlserver ,也会把Sql server Reporting Services 安装上去.原因就是这个服务占用了80 ...
- 使用nginx反向代理,一个80端口下,配置多个微信项目
我们要接入微信公众号平台开发,需要填写服务器配置,然后依据接口文档才能实现业务逻辑.但是微信公众号接口只支持80接口(80端口).我们因业务需求需要在一个公众号域名下面,发布两个需要微信授权的项目,怎 ...
- System进程(pid=4)占用80端口的解决方案
问题 Mail服务器在安装TFS服务(含SQLServer2016)后启动不了网页服务. 排查问题 使用命令查看端口占用情况 netstat -nao | find ":80" n ...
- Linux配置防火墙 开启80端口的方法
命令行输入: vi /etc/sysconfig/iptables 将 -A INPUT -m state --state NEW -m tcp -p tcp --dport 80 -j ACCEPT ...
- 北京54全国80及WGS84坐标系的相互转换
这三个坐标系统是当前国内较为常用的,它们均采用不同的椭球基准.其中北京54坐标系,属三心坐标系,大地原点在苏联的普而科沃,长轴6378245m,短轴6356863,扁率1/298.3:西安80坐标系, ...
- 安装phpstudy之后发现80端口被占用
安装phpstudy之后发现80端口被占用: 进入cmd的界面,在输入"netstat -ano",按回车键后,会显示当前电脑中程序占用的端口和程序ID等等信息:看到第一条就是:0 ...
- Apache报错信息之通常每个套接字地址(协议/网络地址/端口)只允许使用一次(could not bind to address 0.0.0.0:80)
我们常常在执行 httpd –k restart 重启Apache时报错提示: (OS 10048)通常每个套接字地址(协议/网络地址/端口)只允许使用一次. : AH00072: make_soc ...
- wamp 修改默认apache 80端口
wamp server 环境安装包 修改默认80端口 D:\wamp\bin\apache\apache2.4.9\conf\httpd.conf 找到如下代码出修改后,重启apache即可 ## L ...
- phpstudy 80端口被占用,修改端口
搭建mantis,总会出现80端口被占用的情况.看到别的步骤是:1.cmd 运行netstat -ano查看80端口被什么占用,然后在任务管理器找到对应的结束进程.通常情况下是被System占用,右击 ...
随机推荐
- LeetCode OJ:Triangle(三角形)
Given a triangle, find the minimum path sum from top to bottom. Each step you may move to adjacent n ...
- sass进阶篇
@if @if 指令是一个 SassScript,它可以根据条件来处理样式块,如果条件为 true 返回一个样式块,反之 false 返回另一个样式块.在 Sass 中除了 @if 之,还可以配合 @ ...
- C++ 静态常量
#include<iostream> #include<stdexcept> #include <map> using namespace std; class n ...
- map的内存分配机制分析
该程序演示了map在形成的时候对内存的操作和分配. 因为自己对平衡二叉树的创建细节理解不够,还不太明白程序所显示的日志.等我明白了,再来修改这个文档. /* 功能说明: map的内存分配机制分析. 代 ...
- CodeForces - 156D:Clues(矩阵树定理&并查集)
题意:给定N点,M边,求添加最少的边使之变为连通图的方案数. 思路:注意题目给出的M边可能带环,即最后生成的不一定是一棵树.但是影响不大.根据矩阵树定理,我们知道生成树的数量=N^(N-2),即点数^ ...
- IE8提示console未定义
在开发的过程中由于调试的原因,在代码中加入console.info("xxxx"),而未进行删除 在IE8下测试该代码所在的页面报错,如下: 需要注意的是,使用console对象查 ...
- 第二篇 Mysql常用操作记录(转载)
我们在创建网站的时候,一般需要用到数据库.考虑到安全性,建议使用非root用户.常用命令如下: 1.新建用户 //登录MYSQL@>mysql -u root -p@>密码//创建用户my ...
- 机器学习:多项式回归(scikit-learn中的多项式回归和 Pipeline)
一.scikit-learn 中的多项式回归 1)实例过程 模拟数据 import numpy as np import matplotlib.pyplot as plt x = np.random. ...
- Java-API:java.math.BigDecimal
ylbtech-Java-API:java.math.BigDecimal 1.返回顶部 2.返回顶部 3.返回顶部 4.返回顶部 5.返回顶部 1. https://docs.ora ...
- Mycat-server-1.6.5 常见分片方式
Mycat-server-1.6.5 常见分片方式 1 安装 [root@hongquan1 soft]# tar zxvf Mycat-server-1.6.5-release-2018012222 ...