TYOI Day1 travel:Tree dp【处理重复走边】
题意:
给你一棵树,n个节点,每条边有长度。
然后有q组询问(u,k),每次问你:从节点u出发,走到某个节点的距离mod k的最大值。
题解:
对于无根树上的dp,一般都是先转成以1为根的有根树,然后分别从上到下和从下到上两遍dp。
另一个技巧是:处理重复走边的情况时,可以让dp值表示达到某种状态的方案数。
表示状态:
dp[i][j][k] = max dis
表示从i节点出发,走的距离mod k = j时的方案数
找出答案:
对于每次询问(u,k),答案为:满足dp[u][d][k]>0的最大的d值。
如何转移:
第一遍dfs:
dp[i][(j+len)%k][k] = ∑ dp[son][j][k]
只考虑从上往下的路径。
第二遍dfs:
dp[i][(j+len)%k][k] += dp[par][j][k]
dp[i][(j+len)%k][k] -= old[i][((j-len)%k+k)%k][k]
其中old[i][j][k]代表原来的dp,即只考虑从上往下时的dp。
减去old是因为要将会导致重复走边的方案删去。
边界条件:
dp[i][0][k] = 1
others = 0
复杂度:
Tree dp: O(n*k*k)
Query: O(q*k)
AC Code:
#include <iostream>
#include <stdio.h>
#include <string.h>
#include <vector>
#define MAX_N 3005
#define MAX_K 105 using namespace std; struct Edge
{
int dst;
int len;
Edge(int _dst,int _len)
{
dst=_dst;
len=_len;
}
Edge(){}
}; int n,q;
int dp[MAX_N][MAX_K][MAX_K];
int old[MAX_N][MAX_K][MAX_K];
vector<Edge> edge[MAX_N]; void read()
{
cin>>n;
int x,y,z;
for(int i=;i<n;i++)
{
cin>>x>>y>>z;
edge[x].push_back(Edge(y,z));
edge[y].push_back(Edge(x,z));
}
} void dfs1(int now,int p)
{
for(int i=;i<edge[now].size();i++)
{
Edge temp=edge[now][i];
if(temp.dst!=p) dfs1(temp.dst,now);
}
for(int k=;k<=;k++)
{
for(int i=;i<edge[now].size();i++)
{
Edge temp=edge[now][i];
if(temp.dst!=p)
{
for(int j=;j<k;j++)
{
dp[now][(j+temp.len)%k][k]+=dp[temp.dst][j][k];
}
}
}
}
} void dfs2(int now,int p,int l)
{
if(p!=-)
{
for(int k=;k<=;k++)
{
for(int j=;j<k;j++)
{
old[now][j][k]=dp[now][j][k];
}
}
for(int k=;k<=;k++)
{
for(int j=;j<k;j++)
{
dp[now][(j+l)%k][k]+=dp[p][j][k];
dp[now][(j+l)%k][k]-=old[now][((j-l)%k+k)%k][k];
}
}
}
for(int i=;i<edge[now].size();i++)
{
Edge temp=edge[now][i];
if(temp.dst!=p) dfs2(temp.dst,now,temp.len);
}
} void work()
{
memset(dp,,sizeof(dp));
for(int i=;i<=n;i++)
{
for(int k=;k<=;k++)
{
dp[i][][k]=;
}
}
dfs1(,-);
dfs2(,-,);
cin>>q;
int u,k;
while(q--)
{
cin>>u>>k;
for(int d=k-;d>=;d--)
{
if(dp[u][d][k])
{
cout<<d<<endl;
break;
}
}
}
} int main()
{
read();
work();
}
TYOI Day1 travel:Tree dp【处理重复走边】的更多相关文章
- 96. Unique Binary Search Trees (Tree; DP)
Given n, how many structurally unique BST's (binary search trees) that store values 1...n? For examp ...
- HDU 4359——Easy Tree DP?——————【dp+组合计数】
Easy Tree DP? Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)To ...
- HDU 4359 Easy Tree DP?
Easy Tree DP? Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)To ...
- poj 3230 Travel(dp)
Description One traveler travels among cities. He has to pay for this while he can get some incomes. ...
- Codeforces 442D Adam and Tree dp (看题解)
Adam and Tree 感觉非常巧妙的一题.. 如果对于一个已经建立完成的树, 那么我们可以用dp[ i ]表示染完 i 这棵子树, 并给从fa[ i ] -> i的条边也染色的最少颜色数. ...
- HDU5293(SummerTrainingDay13-B Tree DP + 树状数组 + dfs序)
Tree chain problem Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Other ...
- HDU3534(SummerTrainingDay13-C tree dp)
Tree Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submis ...
- BZOJ.1576.[Usaco2009 Jan]安全路经Travel(树形DP 并查集)
题目链接 BZOJ 洛谷 先求最短路树.考虑每一条非树边(u,v,len),设w=LCA(u,v),这条边会对w->v上的点x(x!=w)有dis[u]+dis[v]-dis[x]+len的距离 ...
- Partial Tree(DP)
Partial Tree http://acm.hdu.edu.cn/showproblem.php?pid=5534 Time Limit: / MS (Java/Others) Memory Li ...
随机推荐
- executable null\bin\winutils.exe in the Hadoop binaries.
在windows 使用eclipse远程调用hadoop集群时抛出下面异常 executable null\bin\winutils.exe in the Hadoop binaries. 这个问题 ...
- spring事务管理实现方式
声明式事务 tx及aop配置,利于管理,耦合性低,可读性低 @Transactional注解,不利管理,耦合性高,可读性高 编程式事务 TransactionTemplate类,spring推荐方法 ...
- iOS 控制器title和tabbar的title设置问题
iOS 设置tabbarItem的title的是通过 controller.tabBarItem.title = @"标题" iOS 设置导航栏控制器title通过 contoll ...
- args *args **kwargs区别
python 函数中的参数类型有两种,分别为 位置参数和关键字参数: 一 .位置参数(该类参数位置固定不变) args: 表示默认位置参数,该参数是具象的,有多少个参数就传递多少参数,且参数位 ...
- 用PreferenceActivity做一个标准的设置界面
最后接触到一个任务,做一个工厂设置,在我看来工厂设置不需要多美观,但是一定要方便修改,添加功能,再就是使用方便,我就想到了用PreferenceActivity,android系统的settings就 ...
- JSP(Java Server Pages,即:Java服务器页面
是一种跨平台的动态网页技术标准,由Sun Microsystems公司倡导.多家公司参与建立. 它在HTML文件中插入Java程序段(Scriptlet)和JSP标记(tag),从而形成JSP文件(* ...
- 如何使CSS--better(系列一)
我们想一下以下问题: 1.什么样子的css代码才是高效的? 2.什么样子的css代码才是便于维护的? 3.什么样子的css才是可扩展的? 带着以下问题咱们简单的说一下css的“性能”问题 虽然我技术不 ...
- 如何通过Git命令行把代码提交到github上
1.http://www.cnblogs.com/leesf456/p/5169765.html 参考博客 背景:最近入手了mac,看见mac上的大神都是在用git命令行推代码,我很羡慕有木有,好 ...
- 九度OJ 1252:回文子串 (字符串处理、DP)
时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:387 解决:224 题目描述: 输入一个字符串,输出该字符串中对称的子字符串的最大长度. 比如输入字符串"google" ...
- centos7 PXE自动安装环境搭建
原理: 要进行自动安装的主机A,加电启动时以网卡为第一启动设备 1.启动时会向网络广播,找到dhcp服务器B请求分配IP地址信息,服务器B除了给其分配基本的IP信息(ip.netmask.getewa ...