题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3743 一开始想到了树形DP,处理一下子树中的最小值,向上的最小值,以及子树中的最长路和向上的最长路,就可以得到答案,可以DP: 然而写着写着写不下去了,不会求向上最小值和最长路: 于是看看TJ,原来要再记录一个次长路! 然而写挫了,写不下去了... #include<iostream> #include<cstdio> #include<cstring> #inc…
题目链接:BZOJ - 4033 题目分析 使用树形DP,用 f[i][j] 表示在以 i 为根的子树,有 j 个黑点的最大权值. 这个权值指的是,这个子树内部的点对间距离的贡献,以及 i 和 Father[i] 之间的边对答案的贡献(比如这条边对黑点对距离和的贡献就是子树内部的黑点数 * 子树外部的黑点数 * 这条边的权值). 然后DFS来求,枚举 i 的每个儿子 j,现在的 f[i][] 是包含了 [1, j-1] 子树,然后两重循环枚举范围是 [1, j - 1] 的子树总 Size 和…
[BZOJ 3992] [SDOI 2015] 序列统计(DP+原根+NTT) 题面 小C有一个集合S,里面的元素都是小于质数M的非负整数.他用程序编写了一个数列生成器,可以生成一个长度为N的数列,数列中的每个数都属于集合S.小C用这个生成器生成了许多这样的数列.但是小C有一个问题需要你的帮助:给定整数x,求所有可以生成出的,且满足数列中所有数的乘积mod M的值等于x的不同的数列的有多少个.小C认为,两个数列{Ai}和{Bi}不同,当且仅当至少存在一个整数i,满足Ai≠Bi.另外,小C认为这个…
[BZOJ 4455] [ZJOI 2016] 小星星 (树形dp+容斥原理+状态压缩) 题面 给出一棵树和一个图,点数均为n,问有多少种方法把树的节点标号,使得对于树上的任意两个节点u,v,若树上u,v之间有一条边,图上u,v对应的点之间也有一条边. \(n \leq 17\) 分析 看到\(n \leq 17\),我们应该想到状态压缩.但直接用子集dp的时间复杂度为\(O(3^nn^3)\),会TLE.所以我们压缩的状态可能有问题,考虑优化. 显然题目给了两个限制: 原树中的每条边都要在图中…
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3743 树形dp+换根. “从根出发又回到根” 减去 “mx ” . 注意dfsx里真的要改那些dp[cr],为了下一层的调用.而且还要改回来!为了其他孩子下一层的调用! 注意dfsx里真的要改那些dp[v],为了下一层的调用.而且还要改回来!为了本层的继续调用! #include<iostream> #include<cstdio> #include<cstring&g…
[BZOJ3743][Coci2015]Kamp Description 一颗树n个点,n-1条边,经过每条边都要花费一定的时间,任意两个点都是联通的. 有K个人(分布在K个不同的点)要集中到一个点举行聚会. 聚会结束后需要一辆车从举行聚会的这点出发,把这K个人分别送回去. 请你回答,对于i=1~n,如果在第i个点举行聚会,司机最少需要多少时间把K个人都送回家. Input 第一行两个数,n,K. 接下来n-1行,每行三个数,x,y,z表示x到y之间有一条需要花费z时间的边. 接下来K行,每行一…
kamp Description jz 市的云台山是个很美丽的景区,小 x 暑期到云台山打工,他的任务是开景区的大巴. 云台山景区有 N 个景点,这 N 个景点由 N-1 条道路连接而成,我们保证这 N 个景点之 间有且仅有一条路径相连,并且每条道路开车经过的时间不一定相同. 现在小 x 会提前知道有 K 个人要坐车,并且每个人都有一个景点作为目标景点,小 x 必须要把每个人送到他们要去的景点. 不过,小 x 可以指定这 K 个人去某个景点集合,这样他就从这个集合点出发,分别去 送这 K 个的人…
给出一个n节点的无向树,每条边都有一个边权,给出m个询问,每个询问询问ki个点,问切掉一些边后使得这些顶点无法与顶点1连接.最少的边权和是多少.(n<=250000,sigma(ki)<=500000) 考虑树形DP,我们令mn[i]表示i节点无法与1节点相连切除的最小权值.显然有mn[i]=min(E(fa,i),mn[fa]).大致就是i到1的简单路径上的最小边.我们对于每个询问.把询问的点不妨称为关键点.令dp[i]表示i节点不能与子树的关键点连接切掉的最小权值.那么有,如果son[i]…
一看到这道题觉得很水,打了递归树形DP后RE了一组,后来发现必须非递归(BFS) 递归版本84分: #include<cstdio> #include<cstring> #include<algorithm> using namespace std; ],next[],v[],c[],cnt=,f[]; ]; ; void insect(int x,int y,int z){next[cnt]=point[x];point[x]=cnt;v[cnt]=y;c[cnt]=…
一棵树的话直接树形dp(求出往下走和往上走的期望长度). 假如是环套树, 环上的每棵树自己做一遍树形dp, 然后暴力枚举(环上的点<=20)环上每个点跑经过环上的路径就OK了. --------------------------------------------------------------------------------------------- #include<cstdio> #include<cstring> #include<algorithm&…
树形dp... dp(x, 0)表示结点x不放士兵, 由父亲控制: dp(x, 1)表示结点x不放士兵, 由儿子控制: dp(x, 2)表示结点x放士兵. ------------------------------------------------------------------------------------- #include<cstdio> #include<cstring> #include<algorithm>   using namespace…
3566: [SHOI2014]概率充电器 题意:一棵树,每个点\(q[i]\)的概率直接充电,每条边\(p[i]\)的概率导电,电可以沿边传递使其他点间接充电.求进入充电状态的点期望个数 糖教题解传送门 每个充电的点贡献1,就是求每个点充电的概率的和 考虑树形DP ,分别求子树内的影响和父亲的影响 \(g[i]\)表示i被子树i里的点充电的概率,\(f[i]\)表示i被充电的概率 因为被子树充电时子树里的点不可能被i充电, \[g[i] = q_i \bigcup g_v : (i,v) \i…
4455: [Zjoi2016]小星星 题意:一个图删掉一些边形成一棵树,告诉你图和树的样子,求让图上的点和树上的点对应起来有多少方案 看了很多题解又想了一段时间,感觉题解都没有很深入,现在大致有了自己的想法吧 如果直接上树形DP的话,必须要保存当前子树对应了图上的点的集合才行,要不然做不到1对1.但这样复杂度就炸掉了至少需要\(3^n\)枚举子集 我们可以用容斥原理来弱化这个限制,使得允许多对1 \[ 树上n个点对应图上n个点的方案数\ = \\ \] \[ n个点对应\le n个点\ -\…
题目链接 树形DP,考虑子节点对父节点的贡献. 设f[x][i][j]表示当前为x,用i个x去合成上一层装备,花费为j的最大价值. 由子节点转移时 是一个分组背包,需要一个辅助数组g[i][j]表示前i棵子树花费为j能贡献给x的最大价值. 那么 \(g[i][j] = max{g[i-1][j-k]+f[v][l*need[x]][k]}\).\(need[x]\)为x需要子节点v的个数,\(l\)为合成x的个数,这个同样需要枚举. 那么对于每个\(l\),可以枚举用多少个x合成上一层,更新f,…
4726: [POI2017]Sabota? Time Limit: 20 Sec  Memory Limit: 128 MBSec  Special JudgeSubmit: 128  Solved: 49[Submit][Status][Discuss] Description 某个公司有n个人, 上下级关系构成了一个有根树.其中有个人是叛徒(这个人不知道是谁).对于一个人, 如果他下属(直接或者间接, 不包括他自己)中叛徒占的比例超过x,那么这个人也会变成叛徒,并且他的所有下属都会变成叛徒…
给出一颗n个点带边权的树(n<=20000),求随机选择两个点,使得它们之间的路径边权是3的倍数的概率是多少. 首先总的对数是n*n,那么只需要统计路径边权是3的倍数的点对数量就行了. 考虑将无根树化为有根树,令dp[x][i]表示以x点为路径起点,x的某个子孙为路径终点的边权值模3为i的点对数量. 那么显然有dp[x][i]+=dp[son[x]][(i-w)%3]. 考虑点对之间的路径,要么是它们的LCA是点对中的一个点,要么不在点对中,因此统计一下以每个点x为LCA时的路径边权值%3为i的…
题目链接:https://www.lydsy.com/JudgeOnline/problem.php?id=4557 题意概述: 给出一棵树,每个点付出代价w[i]可以控制距离和它不超过d的点,现在给出一些点,问控制这些点的最小代价是多少. 分析: 观察一下数据范围发现算算法的复杂度可能和d有关.横看竖看这像是一个树形dp,所以我们就把d搞到状态方程里面去嘛怎么就完全没有想到呢...... 既然要用树形dp,就要先分析一下性质. 一个点如果被选择成为控制点,那么它可以控制的点有:子树中深度不超过…
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4711 就是树形DP,然而也想了半天才把转移想清楚: f[x][j][0] 表示 x 去上面 j 步的仓库,f[x][j][1] 表示 x 去子树内下去 j 步的仓库而且整个子树都算好了: f[x][j][0] 就是 d[j] 加上儿子们的 f[u][...][1] 与 f[u][j+1][0] 的最小值: f[x][j][1] 就是选一个儿子加它的 f[u][j-1][1],其它儿子是 f…
4033: [HAOI2015]树上染色 我写的可是\(O(n^2)\)的树形背包! 注意j倒着枚举,而k要正着枚举,因为k可能从0开始,会使用自己更新一次 #include <iostream> #include <cstdio> #include <cstring> #include <algorithm> #include <cmath> using namespace std; typedef long long ll; const in…
BZOJ LOJ 洛谷 老年退役选手,都写不出普及提高DP= = 在儿子那统计贡献,不是在父亲那统计啊!!!(这样的话不写这个提高DP写记忆化都能过= =) 然后就令\(f[x][a][b]\)表示在\(x\)节点上面有\(a\)条不修的公路\(b\)条不修的铁路的最小花费,在叶节点处统计贡献,转移的时候枚举不修哪个即可. 对于\(f\)数组第一维可以卡卡空间,把不用的标号回收,同一时刻只会有\(80+\)个有用节点. 注意如果叶子节点设成负值,用数组\(id[x]\)的时候要注意!!!(访问数…
要点 是树形的考虑dfs 分为取一枝,取两枝两种情况,将它们的合法情况进行暴举取最好答案即可,貌似我乱搞得相当冗-- 顺手记忆化 正解应该是树上背包 #include <cstdio> #include <cstring> #include <algorithm> #include <functional> #include <vector> #define pb push_back using namespace std; int N, Q,…
通过一次dfs求出dp(x)表示节点x考虑了x和x的子树都没成功充电的概率, dp(x) = (1-p[x])π(1 - (1-dp[son])*P(edge(x, son)).然后再dfs一次考虑节点x子树以外对节点x的贡献, 通过x的father算一算就可以了.O(N) ----------------------------------------------------------------------------------- #include<cstdio> #include&l…
考试的时候打了个树链剖分,而且还审错题了,以为是每天找所有点的最长路,原来是每天起点的树上最长路径再搞事情.. 先用dfs处理出来每个节点以他为根的子树的最长链和次长链.(后面会用到) 然后用类似dp的方法把每个节点的最长路径求出来. 下面是具体解释,请思考 以一个节点为例(w为它与父亲节点道路的权值) 一.如果它父亲节点的最长路径不过它 那么它最长路径等于它父亲最长路径+w(自己画图即可理解,往上走的) 它的次长路径等于它的最长链(只能往下走) 二.如果过它 那么它的最长路径有两种可能 ①它的…
4835: 遗忘之树 题意:点分治,选标号最小的重心,上一次重心向下一次重心连有向边,求原树方案数. md我真不知道当初比赛时干什么去了...现在一眼秒啊... \(size[v]=\frac{size[u]}{2}\)时原树只能向编号\(>u\)的点连边,\(O(nlogn)\) #include <iostream> #include <cstdio> #include <cstring> #include <algorithm> #include…
题目链接: https://www.lydsy.com/JudgeOnline/problem.php?id=1040 题目大意: Z国的骑士团是一个很有势力的组织,帮会中汇聚了来自各地的精英.他们劫富济贫,惩恶扬善,受到社会各界的赞扬.最近发生了一件可怕的事情,邪恶的Y国发动了一场针对Z国的侵略战争.战火绵延五百里,在和平环境中安逸了数百年的Z国又怎能抵挡的住Y国的军队.于是人们把所有的希望都寄托在了骑士团的身上,就像期待有一个真龙天子的降生,带领正义打败邪恶.骑士团是肯定具有打败邪恶势力的能…
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=1564 [题意] 给定一个Treap,总代价为深度*距离之和.可以每次以K的代价修改权值,问最小代价. [思路] 数据值是不变的,因此Treap的中序遍历是唯一的.先将数据按照数据值排序,得到其中序遍历. 然后将权值离散化到[1,n]区间内. 设f[l][r][w]为区间[l,r]内的权值都比w大时的最小代价,则有转移式: f[l][r][w]=min { f[l][k-1][w]+f…
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=1131 [题目大意] 给出一个N个点的树,找出一个点来,以这个点为根的树时,所有点的深度之和最大 [题解] 我们记dp[i]为所有点到i的深度之和,我们发现对于定根树, dp[x]=dp[fx]+n-2*size[x],那么我们随意定根,先算出dp[root], 递归计算每个dp[x],对于计算每个节点的不同链时,回溯消除链上影响. [代码] #include <cstdio> #i…
可以去UOJ看出题人的题解. 这样的合并,每一个点对只在lca处被考虑到,复杂度$O(n^2)$ #include <map> #include <ctime> #include <cmath> #include <queue> #include <cstdio> #include <cstring> #include <iostream> #include <algorithm> using namespac…
坑爹...数据是错的..详见discuss  http://www.lydsy.com/JudgeOnline/wttl/wttl.php?pid=1060 先求根到叶子的距离最大值x, 然后把所有叶子到根的距离变成x. 要使增加的最少, 就要利用不同叶子到根的路径的重复部分...然后各种乱搞就可以了.. ----------------------------------------------------------------------------------- #include<bit…
Description 给定一个正整数序列 \(a_1,a_2,\cdots,a_n\),求 \[ \sum_{i=1}^n\sum_{j=i}^n(j-i+1)\min(a_i,a_{i+1},\cdots,a_j)\max(a_i,a_{i+1},\cdots,a_j) \] Input 第 \(1\) 行,一个整数 \(n\): 第 \(2\dots n+1\) 行,每行一个整数表示序列 \(a\). Output 输出答案对 \(10^9\) 取模后的结果. Sample Input 4…