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占用,右击 ...
随机推荐
- hdoj-2647-Reward(拓扑排序)
题目链接: /* Name:hdoj-2647-Reward Copyright: Author: Date: 2018/4/11 15:59:18 Description: */ #include ...
- CodeForces - 803F: Coprime Subsequences(莫比乌斯&容斥)
Let's call a non-empty sequence of positive integers a1, a2... ak coprime if the greatest common div ...
- hdu 1937 Finding Seats
Time Limit: 5000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission( ...
- 寻找数组中第K大数
1.寻找数组中的第二大数 using System; using System.Collections.Generic; using System.Linq; using System.Text; u ...
- LOJ2542. 「PKUWC2018」随机游走
LOJ2542. 「PKUWC2018」随机游走 https://loj.ac/problem/2542 分析: 为了学习最值反演而做的这道题~ \(max{S}=\sum\limits_{T\sub ...
- Kerberos的启动和关闭
Kerberos概念 1.Kerberos用户 Kerberos的本质是维护一套自己的用户:或者说是核心用户映射,比如你的系统用户里面有hdfs,那么我将会在KDC中创建一套基于机器(假设我们有三台安 ...
- SVN 命令使用-***
1.检出到某一版本: svn checkout -r 974 svn://220.231.xx.xx/仓库名 svn checkout svn://220.231.xx.xx/仓库名 svn ex ...
- [转载]嵌入式linux下操作GPIO
本文转自:http://blog.csdn.net/mirkerson/article/details/8464231 在嵌入式设备中对GPIO的操作是最基本的操作.一般的做法是写一个单独驱动程序,网 ...
- svn-clearup 报错的处理(Cleanup failed to process the following paths...)
在使用 svn 客户端执行操作失败后,执行 Clean up 操作也报错:Cleanup failed to process the following paths... ,一直不知道是什么原因.通常 ...
- MySQL/InnoDB tips & tricks
本文讨论的是 MySQL 5.7. 1.混用 * 和列名会产生解析错误,要避免这个错误,要使用 tbl_name.* 的格式. 2.where 子句中不能使用 select 中定义的别名,因为 SQL ...