hdu_5293_Tree chain problem(DFS序+树形DP+LCA)
题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=5293
被这题打蹦了,看着题解写的,很是爆炸,确实想不到,我用的DFS序+LCA+树形DP,当然也可以写树剖,不过这里DFS序更简单,因为都是对点到根的操作
#include<cstdio>
#include<vector>
#include<algorithm>
#pragma comment(linker, "/STACK:102400000,102400000")
#define F(i,a,b) for(int i=a;i<=b;i++)
#define root 1,n,1
#define ls l,m,rt<<1
#define rs m+1,r,rt<<1|1
using namespace std; const int N=1e5+,DEG=;
int t,n,m,x,y,dp[N],sum[N],c1[N*],c2[N*];
struct edge{int u,v,w,lca;}p[N];
vector<int>vec[N];
inline void add(int x,int k,int *c){for(;x<=n*;x+=x&-x)c[x]+=k;}
inline int ask(int x,int *c){int an=;while(x)an+=c[x],x-=x&-x;return an;}
//LCA+dfs序
int ed,g[N],nxt[*N],v[*N],fa[N][DEG],dep[N],idx,l[*N],r[*N];
inline void adg(int x,int y){v[++ed]=y,nxt[ed]=g[x],g[x]=ed;} void LCA_dfs(int u,int pre){
dep[u]=dep[pre]+,fa[u][]=pre,l[u]=++idx;
F(i,,DEG-)fa[u][i]=fa[fa[u][i-]][i-];
for(int i=g[u];~i;i=nxt[i])if(v[i]!=pre)LCA_dfs(v[i],u);
r[u]=++idx;
} int LCA(int a,int b){
if(dep[a]>dep[b])a^=b,b^=a,a^=b;
if(dep[a]<dep[b])F(i,,DEG-)if((dep[b]-dep[a])&(<<i))b=fa[b][i];
if(a!=b)for(int i=DEG-;i<?a=fa[a][]:,i>=;i--)
if(fa[a][i]!=fa[b][i])a=fa[a][i],b=fa[b][i];
return a;
} void fuck(int s,int fa){
dp[s]=sum[s]=;
for(int i=g[s];~i;i=nxt[i])if(v[i]!=fa)fuck(v[i],s),sum[s]+=dp[v[i]];
dp[s]=sum[s];
for(int i=;i<vec[s].size();i++){
int uu=p[vec[s][i]].u,vv=p[vec[s][i]].v;
int tmp=ask(l[uu],c1)+ask(l[vv],c1)-ask(l[uu],c2)-ask(l[vv],c2)+sum[s];
dp[s]=max(dp[s],tmp+p[vec[s][i]].w);
}
add(l[s],sum[s],c1),add(r[s],-sum[s],c1);
add(l[s],dp[s],c2),add(r[s],-dp[s],c2);
}
void init(){
F(i,,n)g[i]=-,vec[i].clear();ed=idx=;
F(i,,n*)c1[i]=c2[i]=;
} int main(){
scanf("%d",&t);
while(t--){
scanf("%d%d",&n,&m);
init();
F(i,,n-)scanf("%d%d",&x,&y),adg(x,y),adg(y,x);
LCA_dfs(,);
F(i,,m){
scanf("%d%d%d",&p[i].u,&p[i].v,&p[i].w);
p[i].lca=LCA(p[i].u,p[i].v);
vec[p[i].lca].push_back(i);
}
fuck(,);
printf("%d\n",dp[]);
}
return ;
}
hdu_5293_Tree chain problem(DFS序+树形DP+LCA)的更多相关文章
- [JSOI2016]最佳团体 DFS序/树形DP
题目 洛谷 P4322 [JSOI2016]最佳团体 Description 茜茜的舞蹈团队一共有\(N\)名候选人,这些候选人从\(1\)到\(N\)编号.方便起见,茜茜的编号是\(0\)号.每个候 ...
- 【bzoj4182】Shopping 树的点分治+dfs序+背包dp
题目描述 给出一棵 $n$ 个点的树,每个点有物品重量 $w$ .体积 $c$ 和数目 $d$ .要求选出一个连通子图,使得总体积不超过背包容量 $m$ ,且总重量最大.求这个最大总重量. 输入 输入 ...
- dfs序+RMQ求LCA详解
首先安利自己倍增求LCA的博客,前置(算不上)知识在此. LCA有3种求法:倍增求lca(上面qwq),树链剖分求lca(什么时候会了树链剖分再说.),还有,标题. 是的你也来和我一起学习这个了qwq ...
- HDU 5296 Annoying problem dfs序 lca
Annoying problem 题目连接: http://acm.hdu.edu.cn/showproblem.php?pid=5296 Description Coco has a tree, w ...
- hdu5293(2015多校1)--Tree chain problem(树状dp)
Tree chain problem Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Other ...
- poj3417 Network 树形Dp+LCA
题意:给定一棵n个节点的树,然后在给定m条边,去掉m条边中的一条和原树中的一条边,使得树至少分为两部分,问有多少种方案. 神题,一点也想不到做法, 首先要分析出加入一条边之后会形成环,形成环的话,如果 ...
- HDU 1520 Anniversary party(DFS或树形DP)
Problem Description There is going to be a party to celebrate the 80-th Anniversary of the Ural Stat ...
- Codeforces 916E(思维+dfs序+线段树+LCA)
题面 传送门 题目大意:给定初始根节点为1的树,有3种操作 1.把根节点更换为r 2.将包含u,v的节点的最小子树(即lca(u,v)的子树)所有节点的值+x 3.查询v及其子树的值之和 分析 看到批 ...
- 【二叉树-最长路径系列(任意路径)】直径、最长同值路径、 最大路径和(DFS、树形DP)
总述 这类题目都是求一个最长路径,这个路径可以不经过根节点. 使用dfs(即递归地遍历树)的方法.维护一个全局最长路径max作为最终结果,而递归方法dfs返回的是含根节点的最长路径.(若不使用全局变量 ...
随机推荐
- FireFox的配置文件的引用
1.firefox的配置文件的实际路径:C:\Users\Administrator\AppData\Roaming\Mozilla\Firefox\Profiles\oviavula.default ...
- cxf 报错:java.lang.NoSuchMethodError: org.apache.ws.commons.schema.XmlSchemaCollection.read(Lorg/w3c/dom/Document;Ljava/lang/String;)
由于没有仔细查看官方提供的文档,由jdk版本不一致导致的出错: http://cxf.apache.org/cxf-316-release-notes.html 自己使用的是jdk1.8. 报Exce ...
- Javaweb 第6天JDBC课程
JDBC课程 两日大纲 ● JDBC基本操作 ● 预设语句对象 ● 自定义数据库工具类 ● JDBC批处理 ● 事务 ● 连接池 *********************************** ...
- NYIST OJ 题目38 布线问题
最小生成树水题,先按最小生成树做,答案最后加上最小的从第i号楼接线到外界供电设施所需要的费用即可. #include<cstdio> #include<cstring> #in ...
- nmon安装(转)
安装说明安装环境:CentOS-6.3安装方式:源码编译安装软件:nmon_linux_14i.tar.gz下载地址:nmon:http://nmon.sourceforge.net/pm ... n ...
- EasyuiAPI:菜单
一.LinkButton(按钮) 1.通过标签创建: <a id="btn" href="#" class="easyui-linkbutton ...
- 一行一行分析JQ源码学习笔记-06
节点类型获取$("span")首先 判断 if(select.nodeType) markarray() 类数组 转化成真正的数组 var adiv = document.getE ...
- Implementing a builder: Combine
原文地址:点击这里 本篇我们继续讨论从一个使用Combine方法的computation expression中返回多值. 前面的故事 到现在为止,我们的表达式建造(builder)类如下 type ...
- Asp.NET路由管道处理过程 【重要】
当ASP.NET处理请求时,路由管道主要由以下几个步骤组成: 1.UrlRoutingModule尝试使用RouteTable中注册的理由匹配当前请求: 2.如果RouteTable中有一个路由成功匹 ...
- web.py 学习(-)Rocket web框架
Rocket是一个轻量级,多线程,符合WSGI规范的web框架. Rocket使用一个线程监听连接,接收到连接之后放到Queue中,有worker线程进行处理. Rocket含有以下属性: metho ...