原文链接www.cnblogs.com/zhouzhendong/p/UOJ468.html 前言 毒瘤题 题解 首先,将问题稍加转化,将"等于k"转化为"小于等于k"减去"小于k". 然后,考虑在有一个变化量限制k时,所有的叶子会怎样变化. 我们称原本根的权值对应的节点到根的路径为"主链",那么,只要主链的任何一个节点的权值发生变化,那么根节点权值就发生变化. 我们称一个主链上的节点的在主链上的儿子为"主儿子&qu…
为什么我怎么看都只会10pts?再看还是只会50~70?只会O(n2(R-L+1))/O(nlogn(R-L+1))……一眼看动态DP可还是不会做…… 根节点的答案是叶子传上来的,所以对于L=R的数据,可以直接枚举需要±n的叶子节点个数num,然后答案就是2num,每次枚举时重新扫描一下就是O(n2(R-L+1)).然后发现可以动态DP,不需要每次O(n),于是可以优化到O(nlogn(R-L+1)). 然后可以发现若叶子x为答案,叶子x到根的链上的DP值都为x,而一旦更改,要么更改根的值,要么…
先求出根节点的权值\(w\).根据套路,我们对于每个\(k\),计算\(w(s)\leq k\)的方案数,差分得到答案.为了方便,接下来考虑计算概率而不是方案数. 可以发现,对于一个给定的有解的子集,在最优解下,根节点的权值一定可以是\(w+1\)或\(w-1\).如果我们希望把根节点的权值变为\(w+1\),那么我们一定只会改变点权\(\leq w\)的点,\(w-1\)同理. 我们特殊考虑点权为\(w\)的点.如果控制集合包含这个点,那么答案一定为\(1\)(因为所有点的点权两两不同),所以…
题目传送门 容易想到一种暴力 DP:先转化成对于每个 \(k\) 求出 \(\max_{i\in S}|i-w_i|\le k\) 的方案数,最后差分 然后问题转化成每个叶子的权值有个取值区间,注意这时我们可以把每个点的权值分成 \(<W,=W,>W\)(看作 \(0,1,2\) )三类处理,然后 DP \(f[u][0/1/2]\) 然后你会很快发现这么做不行,因为选取某些叶子集合时,根节点的权值可以小于 \(W\) 也可以大于 \(W\) ,直接用 \(2^m-1\) 减掉 \(f[u][…
LOJ3044. 「ZJOI2019」Minimax 搜索 https://loj.ac/problem/3044 分析: 假设\(w(1)=W\),那么使得这个值变化只会有两三种可能,比\(W\)小的值变成\(W+1\),比\(W\)大的值变成\(W-1\),或直接修改\(W\). 先考虑第一部分,设\(f_{x}\)表示只改变权值\(<W\)的节点,\(x\)节点权值\(\le W\)的概率,这样能推出\(dp\)式子 \(f_x=\prod\limits_{t}f_t​\) \((dep_…
Loj #3044. 「ZJOI2019」Minimax 搜索 题目描述 九条可怜是一个喜欢玩游戏的女孩子.为了增强自己的游戏水平,她想要用理论的武器武装自己.这道题和著名的 Minimax 搜索有关. 可怜有一棵有根树,根节点编号为 \(1\).定义根节点的深度为 \(1\),其他节点的深度为它的父亲的深度加一.同时在叶子节点权值给定的情况下,可怜用如下方式定义了每一个非节点的权值: - 对于深度为奇数的非叶子节点,它的权值是它所有子节点的权值最大值. - 对于深度为偶数的非叶子节点,它的权值…
LOJ#3044. 「ZJOI2019」Minimax 搜索 一个菜鸡的50pts暴力 设\(dp[u][j]\)表示\(u\)用\(j\)次操作能使得\(u\)的大小改变的方案数 设每个点的初始答案是\(S[u]\) 每个数大小只和\(S[1]\)的大小关系有关 于是每个数的状态设为-1(比S[1]小),1(比S[1]大),0(和S[1]一样) 状态里设的改变是指在这三种状态里的一种变为另一种 如果\(S[u] == S[1]\)或者\(u\)点取max但是\(S[u] < S[1]\),\(…
题意 给出 \(n\) 个点的树,每个时刻可能出现一条路径 \(A_i\) 或者之前出现的某条路径 \(A_i\) 消失,每条路径有一个权值,求出在每个时刻过后能够找到的权值最大的路径(指所有和该路径有交的路径 \(A\) 的权值和) \(B\) 的权值是多少. \(n\leq 10^5\) 分析 结论:两条树上路径有交,则一定有一条路径经过另一条路径的 \(lca\). 根据上面的性质我们考虑用树形dp的方式求解. 将一条路径的权值在每个点 \(x\) 关系分成两种: \(a\) :路径的 \…
传送门 动态dp我好像还真没咋做过--通过一个上午的努力光荣的获得了所有AC的人里面的倒数rk3 首先有一个我一点也不觉得显然的定理,如果两条路径相交,那么一定有一条路径的\(LCA\)在另一条路径上 于是我们可以对于每一个点记录两个值,一个\(a_i\)表示\(LCA\)在\(i\)点的所有路径的权值之和,一个是\(b_i\),表示经过点\(i\)且\(LCA\)不在点\(i\)的所有路径的权值之和 那么对于一条路径\((u,v)\),它的权值就是\(b_{LCA(u,v)}+\sum_{i\…
题目:https://www.luogu.org/problemnew/show/P4719 关于动态DP似乎有猫锟的WC2018论文,但找不见:还是算了. http://immortalco.blog.uoj.ac/archive 动态DP大概就是求这样的问题. 把轻儿子对自己的转移值写进矩阵 g 里,重新定义一下乘法运算,自己的值矩阵 f 就是重儿子的 f 乘上自己的 g 了. 树剖的线段树维护区间内的那些 g 的连乘积,则从自己开始到自己所在重链的底端这一段的 g 连乘就是自己的 f 了(…
目录 前置知识 全局平衡二叉树 大致介绍 建图过程 修改过程 询问过程 时间复杂度的证明 板题 前置知识 在学习如何使用全局平衡二叉树之前,你首先要知道如何使用树链剖分解决动态DP问题.这里仅做一个简单的回顾,建议在有一定基础的情况下看. 首先,维护序列的动态DP我们就不说了,这里只讨论树上的动态DP问题. 然后,目前个人感觉,动态DP往往有一些奇怪的特征. 一般问题是支持动态修改某一个点的权值,以及询问根节点的(也就是全局的)或者是某一个子树的DP值. 而通常是从静态的情况下入手,写出一个结构…
题目链接 Luogu P4643 题解 猫锟在WC2018讲的黑科技--动态DP,就是一个画风正常的DP问题再加上一个动态修改操作,就像这道题一样.(这道题也是PPT中的例题) 动态DP的一个套路是把DP转移方程写成矩阵乘法,然后用线段树(树上的话就是树剖)维护矩阵,这样就可以做到修改了. 注意这个"矩阵乘法"不一定是我们常见的那种乘法和加法组成的矩阵乘法.设\(A * B = C\),常见的那种矩阵乘法是这样的: \[C_{i, j} = \sum_{k = 1}^{n} A_{i,…
我们经常会遇到一些问题,是一些dp的模型,但是加上了什么待修改强制在线之类的,十分毒瘤,如果能有一个模式化的东西解决这类问题就会非常好. 给定一棵n个点的树,点带点权. 有m次操作,每次操作给定x,y,表示修改点x的权值为y. 你需要在每次操作之后求出这棵树的最大权独立集的权值大小. 如果不带修改,那就是一个最简单是树形dp问题. 我们设一个dp[i][0],dp[i][1]表示以i为根的子树 动态dp能够使用的一个前提就是它的转移是线性的,这样我们就可以用矩阵乘法实现快速转移了. 注意:这里的…
动态DP其实挺简单一个东西. 把DP值的定义改成去掉重儿子之后的DP值. 重链上的答案就用线段树/lct维护,维护子段/矩阵都可以.其实本质上差不多... 修改的时候在log个线段树上修改.轻儿子所在重链的线段树的根拿去更新父亲的DP值. #include <cstdio> #include <algorithm> , INF = 0x3f3f3f3f; template <class T> inline void read(T &x) { x = ; char…
不得不承认,去年提高组 D2T3 对动态 DP 起到了良好的普及效果. 动态 DP 主要用于解决一类问题.这类问题一般原本都是较为简单的树上 DP 问题,但是被套上了丧心病狂的修改点权的操作.举个例子,我们来看一道例题. [模板]动态 DP 给定一棵 \(n\) 个点的树.\(i\) 号点的点权为 \(a_i\).有 \(m\) 次操作,每次操作给定 \(u, w\),表示修改点 \(u\) 的权值为 \(w\).你需要在每次操作之后求出这棵树的最大权独立集的权值大小. 我们首先考虑没有修改的情…
动态dp初探 动态区间最大子段和问题 给出长度为\(n\)的序列和\(m\)次操作,每次修改一个元素的值或查询区间的最大字段和(SP1714 GSS3). 设\(f[i]\)为以下标\(i\)结尾的最大子段和,\(g[i]\)表示从起始位置到\(i\)以内的最大子段和. \[ f[i]=\max(f[i-1]+a[i],a[i])\\g[i]=\max(g[i-1],f[i]) \] 定义如下的矩阵乘法,显然这满足乘法结合律和分配律. \[ C=AB\\C[i,j]=\max_{k}(A[i,k…
学习了一下动态DP 问题的来源: 给定一棵 \(n\) 个节点的树,点有点权,有 \(m\) 次修改单点点权的操作,回答每次操作之后的最大带权独立集大小. 首先一个显然的 \(O(nm)\) 的做法就是每次做一遍树形DP(这也是我在noip考场上唯一拿到的部分分),直接考虑如何优化这个东西. 简化一下问题,假如这棵树是一条链,那就变得很简单了,可以直接拿线段树维护矩阵加速. 可是如果每个点不止有一个儿子呢? 我们首先树剖一下. 设 \(g[i][0]=\sum\limits_{j\in ligh…
题目分析: 不难发现可以用动态DP做. 题目相当于是要我求一条路径,所有与路径有交的链的代价加入进去,要求代价最大. 我们把链的代价分成两个部分:一部分将代价加入$LCA$之中,用$g$数组保存:另一部分将代价加在整条链上,用$d$数组保存. 这时候我们可以发现,一条从$u$到$v$的路径的代价相当于是$d[LCA(u,v)]+\sum_{x \in edge(u,v)}g[x]$. 如果是静态的,可以用树形DP解决. 看过<神奇的子图>的同学都知道,叶子结点是从它的儿子中取两个最大的出来,所…
[复习]动态dp 你还是可以认为我原来写的动态dp就是在扯蛋. [Luogu4719][模板]动态dp 首先作为一个\(dp\)题,我们显然可以每次修改之后都进行暴力\(dp\),设\(f[i][0/1]\)表示当前考虑\(i\)及其子树内的点,当前这个点是选还是不选时能够得到的最大权值,那么我们可以得到转移:\(f[i][0]+=\max\{f[v][0],f[v][1]\},f[i][1]+=f[v][0]\),其中\(v\)是\(i\)的一个儿子. 那么这样子的复杂度就是\(O(qn)\)…
[BZOJ4911][SDOI2017]切树游戏(动态dp,FWT) 题面 BZOJ 洛谷 LOJ 题解 首先考虑如何暴力\(dp\),设\(f[i][S]\)表示当前以\(i\)节点为根节点,联通子树权值和为\(S\)的方案数,转移就是\(FWT\)的卷积,最后只需要把所有的\(f[i][k]\)全部加起来就可以得到最终的答案. 于是这样子的复杂度就是\(O(Qnmlogm)\).但实际上转移的时候不需要\(FWT\)回来,直接拿点值表示的数组做就可以了,这样子可以少一个\(log\). 那么…
可以直接套动态dp,但因为它询问之间相互独立,所以可以直接倍增记x转移到fa[x]的矩阵 #include<bits/stdc++.h> #define CLR(a,x) memset(a,x,sizeof(a)) using namespace std; typedef long long ll; typedef pair<int,int> pa; ; const ll inf=1e17; inline ll rd(){ ll x=;; ;c=getchar();} +c-',c…
题目链接: https://cn.vjudge.net/problem/34398/origin 本题的大意其实很简单,就是找回文串,大致的思路如下: 1. 确定一个回文串,这里用到了自定义的check函数原理如下: 传入le, ri两个值(定义从1开始), s+1 = aaadbccb. a a a d b c c b 1 2 3 4 5 6 7 8 比如,le = 5, ri = 8. 则s[5] == s[8]成立 le++ ri-- 再比较 s[6] == s[7]? 成立 le++,…
题意 题目链接 Sol 动态dp板子题.有些细节还没搞懂,待我研究明白后再补题解... #include<bits/stdc++.h> #define LL long long using namespace std; const int MAXN = 1e5 + 10, INF = INT_MAX; template<typename A, typename B> inline bool chmax(A &x, B y) { return x < y ? x = y…
题意 题目链接 Sol 这题可以动态dp做. 设\(f[i]\)表示以\(i\)为结尾的最大子段和,\(g[i]\)表示\(1-i\)的最大子段和 那么 \(f[i] = max(f[i - 1] + a[i], a[i])\) \(g[i] = max(g[i - 1], f[i])\) 发现只跟前一项有关,而且\(g[i]从\)f[i]$转移过来的那一项可以直接拆开 那么构造矩阵 \[ \begin{bmatrix} a_{i} & -\infty & \dots a_{i} \\ a…
[BZOJ4712]洪水(动态dp) 题面 BZOJ 然而是权限题QwQ,所以粘过来算了. Description 小A走到一个山脚下,准备给自己造一个小屋.这时候,小A的朋友(op,又叫管理员)打开了创造模式,然后飞到 山顶放了格水.于是小A面前出现了一个瀑布.作为平民的小A只好老实巴交地爬山堵水.那么问题来了:我们把这 个瀑布看成是一个n个节点的树,每个节点有权值(爬上去的代价).小A要选择一些节点,以其权值和作为代价将 这些点删除(堵上),使得根节点与所有叶子结点不连通.问最小代价.不过到…
背景:czy上课讲了新知识,从未见到过,总结一下. 所谓动态dp,是在动态规划的基础上,需要维护一些修改操作的算法. 这类题目分为如下三个步骤:(都是对于常系数齐次递推问题) 1先不考虑修改,不考虑区间,直接列出整个区间的dp方程.这个是基础,动态dp无论如何还是dp(这一步是一般是重点) 2.列出转移矩阵.由于有很多修改操作,我们将数据集中在一起处理,还可以利用矩阵结合律,并且区间比较好提取,(找一段矩阵就好了),修改也方便. 3.线段树维护矩阵.对于修改,我们就是在矩阵上进行修改,对于不同的…
国际惯例的题面:看起来很神的样子......如果我说这是动态DP的板子题你敢信?基于链分治的动态DP?说人话,就是树链剖分线段树维护DP.既然是DP,那就先得有转移方程.我们令f[i]表示让i子树中的叶子节点全部与根不联通,所需要的最小代价,v[i]为输入的点权.显然f[i]=min(v[i],sigma(f[soni])),边界条件是,如果i是叶子节点,则f[i]=v[i].我们需要用链分治去维护这个DP,所以要把DP拆成重链和轻链独立的形式.我们还是用f[i]表示让i子树中的叶子节点全部与根…
国际惯例的题面:这题......最大连通子块和显然可以DP,加上修改显然就是动态DP了......考虑正常情况下怎么DP:我们令a[i]表示选择i及i的子树中的一些点,最大连通子块和;b[i]表示在i的子树中选择一些点(不一定包含i),最大连通子块和.那么我们要询问i的子树的话,答案就是b[i]了.考虑这个DP怎么转移,a[i]=max(sigma(j:SON_i)a[j]+v[i],0),b[i]=max((j:SON_i)b[j],a[i]).陈俊锟说过,树上动态DP,就是把树拆成链,分离轻…
[BZOJ5210]最大连通子块和 Description 给出一棵n个点.以1为根的有根树,点有点权.要求支持如下两种操作: M x y:将点x的点权改为y: Q x:求以x为根的子树的最大连通子块和. 其中,一棵子树的最大连通子块和指的是:该子树所有子连通块的点权和中的最大值 (本题中子连通块包括空连通块,点权和为0). Input 第一行两个整数n.m,表示树的点数以及操作的数目. 第二行n个整数,第i个整数w_i表示第i个点的点权. 接下来的n-1行,每行两个整数x.y,表示x和y之间有…
题目大意:给你一棵 $n$个点 以 $1$为根 的树,每个点有$ 0,1,2 $三种颜色之一,初始时整棵树的颜色均为 $0$. $m$ 次操作, 每次操作形如: 1 x y c : 将 $x$到$y$的路径上的点全部改为颜色$C$ 2 x : 询问 $x$ 所在的同色连通块大小 数据范围:$n,m≤10^5$. 此题一眼动态dp 首先我们先列出正常的dp式子 设$f[u]$表示以$u$为根的子树中,$u$所在的同色联通块大小 显然,$f[u]=1+\sum_{v∈son[u],col[u]=co…