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占用,右击 ...
随机推荐
- 201621123014《Java程序设计》第十一周学习总结
1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结多线程相关内容. 2. 书面作业 本次PTA作业题集多线程 1. 源代码阅读:多线程程序BounceThread 1.1 BallR ...
- 简洁的Jquery弹出窗插件
做项目时,很多时候都需要弹窗提示.如果要求不是很严格的项目,直接使用alert就可以搞定.对于需要高度定制化的项目,而且要求比较高的时候,就需要设计符合整体风格的弹出层,这种有美工帮忙,也比较好搞定. ...
- 服务端缓存页面及IIS缓存设置
缓存信息基本概念 我们在看网页的header信息时,经常看到这几个参数:Expires.Cache-Control.Last-Modified.ETag,它们是RFC 2616(HTTP/1.1)协议 ...
- 《Javascript高级程序设计》阅读记录(六):第六章 下
这个系列以往文字地址: <Javascript高级程序设计>阅读记录(一):第二.三章 <Javascript高级程序设计>阅读记录(二):第四章 <Javascript ...
- LeetCode Shortest Unsorted Continuous Subarray
原题链接在这里:https://leetcode.com/problems/shortest-unsorted-continuous-subarray/description/ 题目: Given a ...
- Python函数-all()
all(iterable) 作用: 如果iterable的所有元素不为0.''.False或者iterable为空,all(iterable)返回True,否则返回False:函数等价于: def a ...
- mysql之 Innobackupex全备恢复(原理、演示)
一. Innobackupex恢复原理 After creating a backup, the data is not ready to be restored. There might b ...
- Operating System-进程/线程内部通信-临界区(Critical Regions)
上一篇文章讲述了进程之间的竞争条件:多个进程同时进入一个共享区域,导致了数据的不一致,本文主要介绍如何解决这个问题. 一.临界区介绍 解决这个问题就是阻止多个进程同时进入这个共享区域,换句话说,进程之 ...
- UIButton 不同状态图片来回切换
做百度地图是否显示路况信息,用到两种状态的图片 第一种方法:用Bool进行标记 声明一个 Bool _isRoad; - (void)roadBtnAction:(UIButton *)sender ...
- RazorHelper.cs
完整版 RazorHelper.cs using System; using System.Collections; using System.Collections.Generic; using S ...