luogu P4719 【模板】动态dp】的更多相关文章

传送门 Solution \(f_{i,0}\) 表示以i节点为根的子树内,不选i号节点的最大独立集 \(f_{i,1}\)表示以i节点为根的子树内,选i号节点的最大独立集 \(g_{i,0}\) 表示以i节点为根的子树内,不选i号节点,不算它的重节点子树的最大独立集 \(g_{i,1}\) 表示以i节点为根的子树内,选i号节点,不算它的重节点子树的最大独立集 把矩阵乘法的加法改成max,乘法改成加法,仍然符合结合律. 先进行树链剖分,对于同一条链上的点,我们的更新可以写成如下的矩阵乘法: \[…
题目大意:给你一颗$n$个点的树,点有点权,有$m$次操作,每次操作给定$x$,$y$,表示修改点$x$的权值为$y$. 你需要在每次操作之后求出这棵树的最大权独立集的权值大小. 数据范围:$n,m≤1e5$ 我们显然可以得出一个$O(nm)$的暴力做法,每次修改完后$dp$一次,然而这个显然会超时. 考虑当树退化成链时的简单做法. 我们用线段树维护每个区间的答案.对于区间$[l,r]$,我们维护一个$2×2$的答案矩阵$ans$. 设$ans[0][0]$表示区间左端点可能被选择,右端点一定不…
用途 对于某些树形dp(目前只会树上最大权独立集或者类似的),动态地修改点权,并询问修改后的dp值 做法(树剖版) 以最大权独立集为例 设$f[x][0/1]$表示x选不选,这棵子树的最大权独立集大小 那么有(设y是x的孩子) $$f[x][0]=\sum{max\{f[y][0],f[y][1]\}} , f[x][1]=val[x]+\sum{f[y][0]}$$ 那么在只关心其中的一个孩子y'的情况下,我们可以得到方程 $$f[x][0]=S_0+max\{f[y'][0],f[y'][1…
题目:https://www.luogu.org/problemnew/show/P4719 关于动态DP似乎有猫锟的WC2018论文,但找不见:还是算了. http://immortalco.blog.uoj.ac/archive 动态DP大概就是求这样的问题. 把轻儿子对自己的转移值写进矩阵 g 里,重新定义一下乘法运算,自己的值矩阵 f 就是重儿子的 f 乘上自己的 g 了. 树剖的线段树维护区间内的那些 g 的连乘积,则从自己开始到自己所在重链的底端这一段的 g 连乘就是自己的 f 了(…
题目链接 Luogu P4643 题解 猫锟在WC2018讲的黑科技--动态DP,就是一个画风正常的DP问题再加上一个动态修改操作,就像这道题一样.(这道题也是PPT中的例题) 动态DP的一个套路是把DP转移方程写成矩阵乘法,然后用线段树(树上的话就是树剖)维护矩阵,这样就可以做到修改了. 注意这个"矩阵乘法"不一定是我们常见的那种乘法和加法组成的矩阵乘法.设\(A * B = C\),常见的那种矩阵乘法是这样的: \[C_{i, j} = \sum_{k = 1}^{n} A_{i,…
[模板]"动态 DP"&动态树分治 第一道动态\(DP\)的题,只会用树剖来做,全局平衡二叉树什么的就以后再学吧 所谓动态\(DP\),就是在原本的\(DP\)求解的问题上加上修改操作,从而使得问题变成动态的问题 这道题的问题就是普通的树形\(DP\)上加上了修改点权的操作 题意: 给定一棵 \(n\) 个点的树.\(i\) 号点的点权为 \(a_i\).有 \(m\) 次操作,每次操作给定 \(u\),\(w\),表示修改点 \(u\) 的权值为 \(w\).你需要在每次操作…
题意 题目链接 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…
\(\color{#0066ff}{ 题目描述 }\) 给定一棵\(n\)个点的树,点带点权. 有\(m\)次操作,每次操作给定\(x,y\),表示修改点xx的权值为\(y\). 你需要在每次操作之后求出这棵树的最大权独立集的权值大小. \(\color{#0066ff}{输入格式}\) 第一行,\(n,m\)分别代表点数和操作数. 第二行,\(V_1,V_2,...,V_n\),代表\(n\)个点的权值. 接下来\(n-1\)行,\(x,y\),描述这棵树的\(n-1\)条边. 接下来\(m\…
是动态dp的板子 大致思想就是用g[u]来表示不包含重链转移的dp值,然后用线段树维护重链,这样线段树的根就相当于这条重链的top的真实dp值 每次修改的时候,修改x点会影响到x到根的真实dp值,但是只会影响到每条重链的低端点的dp值,相当于在log个线段树上单点修改 #include<iostream> #include<cstdio> using namespace std; const int N=200005; int n,m,a[N],h[N],cnt,de[N],fa[…
题目描述 给定一棵 n 个点的树,点带点权. 有 m 次操作,每次操作给定 x,y,表示修改点 x 的权值为 y. 你需要在每次操作之后求出这棵树的最大权独立集的权值大小. 输入格式 第一行有两个整数,分别表示结点个数 n 和操作个数 m. 第二行有 n 个整数,第 i 个整数表示节点 iii 的权值 ai. 接下来 (n−1) 行,每行两个整数 u,v,表示存在一条连接 u 与 v 的边. 接下来 m 行,每行两个整数 x,y,表示一次操作,修改点 x 的权值为 y. 输出格式 对于每次操作,…
题意 题目描述 给定一棵\(n\)个点的树,点带点权. 有\(m\)次操作,每次操作给定\(x,y\),表示修改点\(x\)的权值为\(y\). 你需要在每次操作之后求出这棵树的最大权独立集的权值大小. 输入输出格式 输入格式: 第一行,\(n,m\),分别代表点数和操作数. 第二行,\(V_1,V_2,...,V_n\),代表\(n\)个点的权值. 接下来\(n-1\)行,\(x,y\),描述这棵树的\(n-1\)条边. 接下来\(m\)行,\(x,y\),修改点\(x\)的权值为\(y\).…
luogu传送门. 最近学了一下动态dp,感觉没有想象的难. 动态DP simple的DP是这样的: 给棵树,每个点给个权值,求一下最大权独立集. 动态DP是这样的: 给棵树,每个点给个权值还到处改,每次改的时候求一下最大权独立集. 题外话: ($NOIP2018$保卫王国) 大佬:动态$dp$板子直接秒. 神仙:这个是什么让我想一想--倍增?(然后当场切掉) 除了大佬除了神仙除了我:敲暴力. 我:(看错题了爆蛋) 几个前置知识: (1)重链剖分 树剖时选择子树点数最多的儿子作重儿子. 重剖有几…
动态DP其实挺简单一个东西. 把DP值的定义改成去掉重儿子之后的DP值. 重链上的答案就用线段树/lct维护,维护子段/矩阵都可以.其实本质上差不多... 修改的时候在log个线段树上修改.轻儿子所在重链的线段树的根拿去更新父亲的DP值. #include <cstdio> #include <algorithm> , INF = 0x3f3f3f3f; template <class T> inline void read(T &x) { x = ; char…
题解 在冬令营上听到冬眠的东西,现在都是板子了猫锟真的是好毒瘤啊(雾) (立个flag,我去thusc之前要把WC2018T1乱搞过去= =) 好的,我们可以参考猫锟的动态动态dp的课件,然后你发现你什么都看不懂(菜啊 但是我们仔细看一看,可以发现用数据结构维护矩阵,那么我们尝试构造一个矩阵 \(\begin{bmatrix} \ g_{u,0} & g_{u,0}\\ g_{u,1} & 0 \end{bmatrix} \begin{bmatrix} f_{son[u],0}\\ f_{…
题目 尽管知道这个东西应该不会考了,但是还是学一学吧 哎要是去年noip之前学该多好 动态\(dp\)就是允许修改的一个\(dp\),比如这道题,我们都知道这是一个树上最大点权独立集 众所周知方程长这个样子 \[dp_{u,0}=\sum_{(u,v)\in e}min(dp_{v,0},dp_{v.1})\] \[dp_{u,1}=a_v+\sum_{(u,v)\in e}dp_{v,0}\] 但是有了修改我们就没有办法做了 写不下去了,挂一个yyb跑路吧 大概就是一句话,维护处每一个点的轻儿…
题目描述 给定一棵n个点的树,点带点权. 有m次操作,每次操作给定x,y,表示修改点x的权值为y. 你需要在每次操作之后求出这棵树的最大权独立集的权值大小. 输入输出格式 输入格式: 第一行,n,m分别代表点数和操作数. 第二行,V1,V2,...,Vn,代表n个点的权值. 接下来n−1行,x,y,描述这棵树的n−1条边. 接下来m行,x,y,修改点x的权值为y. 输出格式: 对于每个操作输出一行一个整数,代表这次操作后的树上最大权独立集. 保证答案在int范围内 动态DP讲解:   考虑最大独…
题意 我理解的动态DP: 发现DP可以写成矩阵的形式,因此用数据结构维护矩阵乘积. 对于这道题,显然有DP: \(f_{x,0/1}\)表示\(x\)的子树中,x选/不选的最大点独立集. \(f_{x,0}=\sum\limits_{y\in son_x}\max(f_{y,0},f_{y,1}),f_{x,1}=\sum\limits_{y\in sno_x}f_{y,0}+a_x\) 既然在树上,就用树剖或者LCT解决,本质都是将树拆成链,这里用树剖. 设\(son_x\)表示\(x\)的重…
qwq大概是混乱的一个题. 首先,还是从一个比较基础的想法开始想起. 如果每次暴力修改的话,那么每次就可以暴力树形dp 令\(dp[x][0/1]\)表示\(x\)的子树中,是否选择\(x\)这个点的最大权独立集. 如果这个点不选,那么他的所有儿子都是可以选的. 如果这个点选的,那么只能加上他的所有儿子不选的收益. 因为收益可能存在负数,所以要特别处理一下 void dfs(int x,int fa) { f[x][0]=0; f[x][1]=val[x]; for (int i=point[x…
目录 前置知识 全局平衡二叉树 大致介绍 建图过程 修改过程 询问过程 时间复杂度的证明 板题 前置知识 在学习如何使用全局平衡二叉树之前,你首先要知道如何使用树链剖分解决动态DP问题.这里仅做一个简单的回顾,建议在有一定基础的情况下看. 首先,维护序列的动态DP我们就不说了,这里只讨论树上的动态DP问题. 然后,目前个人感觉,动态DP往往有一些奇怪的特征. 一般问题是支持动态修改某一个点的权值,以及询问根节点的(也就是全局的)或者是某一个子树的DP值. 而通常是从静态的情况下入手,写出一个结构…
学习了一下动态DP 问题的来源: 给定一棵 \(n\) 个节点的树,点有点权,有 \(m\) 次修改单点点权的操作,回答每次操作之后的最大带权独立集大小. 首先一个显然的 \(O(nm)\) 的做法就是每次做一遍树形DP(这也是我在noip考场上唯一拿到的部分分),直接考虑如何优化这个东西. 简化一下问题,假如这棵树是一条链,那就变得很简单了,可以直接拿线段树维护矩阵加速. 可是如果每个点不止有一个儿子呢? 我们首先树剖一下. 设 \(g[i][0]=\sum\limits_{j\in ligh…
动态DP?动态动态规划? 个人理解:动态DP,就是普通DP加修改操作,然后就变成了个毒瘤题. 直接就着例题写吧. 例题 P4719 [模板]"动态 DP"&动态树分治 求树上最大独立集.要求支持修改点权.n<=1e5. 算法原理 首先不带修的最大独立集是一个NOIP题: \(f[cur][0/1]\) 表示 \(cur\) 选/不选 其子树内(含 \(cur\))的被选点权值和. \[f[cur][0]= \sum max(f[to][0], f[to][1]) \] \…
目录 「CF 750E」New Year and Old Subsequence 「洛谷 P4719」「模板」"动态 DP" & 动态树分治 「洛谷 P6021」洪水 「SP 6779」GSS7 「NOIP 2018」「洛谷 P5024」保卫王国 \(\mathcal{Introduction}\) \(\mathcal{Problem~1}\)   给定序列 \(\{a_n\}\),其中 \(a_i\in\mathbb Z\),求其最大子段和(不能为空).   很显然的 DP…
题面 题目链接-Luogu 题目链接-Loj(要加Freopen) 题解 什么是动态DP? OneInDark:你不需要知道这么多,你只需要知道是利用了广义矩阵乘法就够了! 广义矩乘 广义矩阵乘法,简单来说,就是把基本的 乘法 和 加法 运算符改成其它运算符,同时这两种运算要满足 前者对后者有分配律,如:加法 和 最大或最小值,按位与 和 异或 等.因为,我们会发现,乘法 和 加法 组成的传统矩阵乘法之所以有哪些性质,其根本原因就在于乘法对加法的分配律. 举个例子,有这么个 DP 转移: d p…
不得不承认,去年提高组 D2T3 对动态 DP 起到了良好的普及效果. 动态 DP 主要用于解决一类问题.这类问题一般原本都是较为简单的树上 DP 问题,但是被套上了丧心病狂的修改点权的操作.举个例子,我们来看一道例题. [模板]动态 DP 给定一棵 \(n\) 个点的树.\(i\) 号点的点权为 \(a_i\).有 \(m\) 次操作,每次操作给定 \(u, w\),表示修改点 \(u\) 的权值为 \(w\).你需要在每次操作之后求出这棵树的最大权独立集的权值大小. 我们首先考虑没有修改的情…
[复习]动态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)\)…
动态dp 瞎扯两句吧 先从序列上理解,维护链的最大独立集. 考虑是从左边转移的,那么矩阵的转移唯一,直接放在线段树上就可以了. 放在树上的话,儿子都可以转移,把轻儿子的转移放在子链链头更新,然后每条链都处理成序列就行了. 注意一点,因为维护的是序列,所以单点存放的矩阵是只含轻儿子和自己的贡献,相当于把轻儿子的子树缩给了自己,而重儿子维护的东西是通过线段树上维护的区间贡献过来的. 咕咕模板,最大全独立集 Code: #include <cstdio> #include <algorithm…
其实就过了模板. 感觉就是带修改的dp [模板]动态dp 给定一棵n个点的树,点带点权. 有m次操作,每次操作给定x,y表示修改点x的权值为y. 你需要在每次操作之后求出这棵树的最大权独立集的权值大小. n,m<=1e5 参考题解:shadowice1984 n^2 DP简单又自然. 但是对于1e5次修改就不行了. 每一次修改会影响整个到根的链上的值. 采用树剖. ldp[i][0/1]表示i选不选,对于所有的轻儿子dp值. dp[i][0/1]表示i选不选,对于总共的所有儿子的dp值. ldp…
勾起了我悲伤的回忆 -- NOIP2018 316pts -- 主要思想:将 DP 过程分解为方便单点修改和一个区间合并的操作(通常类似矩阵乘法),然后用数据结构(通常为线段树)维护. 例:给定一个长为 \(n\) 的整数序列,相邻两个数最多选一个,有 \(m\) 次修改序列中的一个数,求每次修改后选出数之和的最大值. \(n,m\leq 10^5\) . 如果不会做不带修改的情况,请默默摁 Ctrl + w 然后去学 DP 入门 如果不带修改,明显设 \(f_{i,0/1}\) 表示当第 \(…
目录 例题1:模拟赛题 代码: 例题2 例题3:带修改树上最大独立集. 代码: 注:部分参考 https://www.luogu.org/blog/gkxx-is-here/what-the-hell-is-ddp 动态DP,就是一个十分简单的DP加了一个修改操作. 先看些例题: 例题1:模拟赛题 [问题描述] 某高校教学楼有 n 层,每一层有 2 个门,每层的两个门和下一层之间的两个门之间各有一条路(共 4 条),相同层的 2 个门之间没有路.现给出如下两个操作: 0 x y : 查询第 x…
目录 前言 开始 更进一步 前言 最后一届NOIPTG的day2T3对于动态DP的普及起到了巨大的作用.然而我到现在还不会 开始 SP1716 GSS3 - Can you answer these queries III 题解位置 这道题的题目大意就是维护动态序列最大子段和.一个比较显然的想法就是用线段树维护\(lmax,rmax,sum,max\)即可.但是我们不想放弃DP的优良性质,于是就有了优良的动态DP. 对于这道题目,如果不考虑修改操作,那么DP就是这样的: 令\(F[i]\)表示以…