首页 > 其他分享 >NOIP2024集训Day21 DP常见模型2 - 背包

NOIP2024集训Day21 DP常见模型2 - 背包

时间:2024-09-04 15:37:26浏览次数:4  
标签:01 指向 Day21 插入 背包 NOIP2024 节点 DP

NOIP2024集训Day21 DP常见模型2 - 背包

A. [BZOJ 4987] Tree

树形背包dp

先考虑几个显而易见的性质:

  1. 选出的点一定是相邻的

  2. 对于选出的点,如果从 \(a_k\) 再走回 \(a_1\),那么就相当于每条边经过了两次

由于题目没有包含 \(dis(a_k,a_1)\),因此就相当于选出的点中的一条链可以只经过一次,其余的需要经过两次。

那我们就可以将选点转化为选边,然后考虑树形背包:

设 \(f_{i, j, k}\) 表示以 \(i\) 为根的子树中选择点 \(i\),共选出 \(j\) 条边,且包含的链端点数目为 \(k\) 的最小代价。

这里解释一下:当 \(k=0\) 时,相当于要从根节点遍历一遍选出的边然后再从根节点出去;\(k=1\) 时,相当于从根节点遍历一遍,到达某链端点后不出去;\(k=2\) 时相当于从某端点遍历到根节点,然后出去再回来到另一端点。

对于根节点与子节点之间的边,显然当 \(k=0\) 或 \(2\) 时计算两遍,否则计算一遍。

这里第二维和第三维都满足背包性质,然后就可以树形背包了。


B. [雅礼集训 2018 Day10] 贪玩蓝月

一个朴素的想法就是模拟这个过程,当询问时做一遍01背包,但这样明显会TLE

想象这样一个例子:当两次询问中间夹着一次插入操作,第二次进行01背包,明显只需要在第一次的基础上对新插入的数做一次01背包

由于 \(p\) 很小,所以这样时间复杂度大大减小

所以我们可以对前端插入与后端插入分别维护一个栈,每次插入时对新插入的数做一次01背包

删除时让栈顶减一即可,因为再次插入时会覆盖这个值

那么当一端已经为 \(0\) 时,再有对该端的删除操作怎么办?

此时将另一端的前一半暴力加入该段即可(另一端也要暴力维护一下)

那么如何查询呢?

枚举一端可能的特征值 \(i\),令 \(L = (l -i + p) \mod p\),\(R=(r-i+p)\mod p\)

则另一端可能的特征值在 \(L\) 到 \(R(R\ge L)\)或 \(0\) 到 \(R\) 与 \(L\) 到 \(p - 1(R \lt L)\) 之间

用ST表维护区间最值即可


C. [BZOJ3425 POI2013] Polarization

最少可到达点数很好求,就是 \(n-1\)。因为每条边的贡献最少为 \(1\),将树黑白染色,奇数层染黑色,偶数层染白色,所有黑点指向白点,答案就是 \(n-1\)。

最多的怎么求?显然是一些点指向一个点,那个点再指向剩下的点(证明最后再说)。

经过中间点的答案就是两边点数的乘积,那么中间点怎么选?显然要使两边点数尽可能相等,选重心就好了。

按01背包来选择一些子树,这样做时间复杂度显然是\(\Theta (n^2)\),我们可以用 bitset 优化成 \(\Theta (\frac{n^2}{32})\),但显然还是过不去。

考虑到子树大小大于 \(\sqrt n\) 的不超过 \(\sqrt n\) 个,所以可以将子树大小大于 \(\sqrt n\) 的暴力DP,剩下的将相同大小的合并后二进制拆分来DP。这样时间复杂度就变成了\(\Theta (\frac{n\sqrt n}{32})\)。

最后证明一下为什么一定是找到一个中间点最优:

首先如果改变一棵树中所有边的指向,可到达点对数不变。

如果不是中间点最优,那么一定有一条路径 \(x\) 指向 \(y\),\(x\) 至少有两条出边(假设第二条指向 \(a\)),\(y\) 至少有两条入边(假设第二条入边由 \(b\) 指过来),改变 \(y\),\(b\) 之间的边及 \(b\) 子树中的边或改变 \(x\),\(a\) 之间的边及 \(a\) 子树中的边,一定有一种情况能使答案更优,这样改变下去直到找到一个中间点。


E. [THUPC2018] 弗雷兹的玩具商店

最近状态有点颓,刷刷水题找找自信。

首先每次询问就是完全背包。可以 \(O(m^2)\)。

由于每个物品都可以用无数次,所以对于价格相同的物品,我们只用考虑愉悦度最高的。

直接上线段树。\(val_i\) 表示这个区间中价格为 \(i\) 的物品中最大的愉悦度。如果没有这样的物品就是 \(-\infin\)。

询问就把这个区间的所有 \(val\) 取出来,做个完全背包就好了。

两种修改操作用个标记随便搞搞。分别是区间的每个数组平移,和区间加。

复杂度 \(O(nm\log n+q(m^2+\log n))\)。

标签:01,指向,Day21,插入,背包,NOIP2024,节点,DP
From: https://www.cnblogs.com/Leirt/p/18396660

相关文章

  • NOIP2024集训Day20 DP常见模型1 - 序列
    NOIP2024集训Day20DP常见模型1-序列A.[JOI2022Final]Let'sWintheElection贪心+DP。首先,一定是所有协作者同时在同一个州演讲,这样才最优。然后,假设我们已经知道所有州的方案(支持、支持+协作、反对),那我们一定是先按照从小到大的顺序拿下所有“支持+协作”州,这样最优。......
  • NOIP2024集训Day22 DP常见模型3 - 区间
    NOIP2024集训Day22DP常见模型3-区间A.[SCOI2003]字符串折叠因为前面折叠了会对后面产生影响,所以很显然不能贪心。考虑区间DP。定义\(f_{i,j}\)表示\(i\)到\(j\)范围内可以折叠到的最短长度。答案为\(f_{1,n}\)。状态转移:对于\(f_{i,j}\),使用区间DP惯用套路,枚......
  • GDPR 学习笔记
    一、前言1、以GDPR为代表的监管条例GDPR(《通用数据保护条例》)于2018年5月25日生效,取代了欧盟的《数据保护指令》(DPD,95指令,1995年颁布),对欧盟所有成员国发生直接、统一、首要的效力。除GDPR之外,其他法规对欧盟制度下的企业也很重要。如,适用于电子通信行业中个人数据处理的《电......
  • 【网络原理】Udp 的报文结构,保姆式教学,快速入门
    本篇会加入个人的所谓鱼式疯言❤️❤️❤️鱼式疯言:❤️❤️❤️此疯言非彼疯言而是理解过并总结出来通俗易懂的大白话,小编会尽可能的在每个概念后插入鱼式疯言,帮助大家理解的.......
  • 每日一题 背包,dp,兵营力量训练
    首先,读完这题我一开始有点懵,分析了条件后还是不知道怎么分配比较完美,一开始想一直给最小的那个分配呗,但这不知道分配的力量是多少,没有一个界线,所以要找一个界线,最后还是看了别人的参考答案,用二分确定会变的界线,然后bool数组检查有没有达到界线,没达到的都分配力量,分配的力量......
  • 每日OJ_牛客_最长公共子序列(dp模板)
    目录牛客_最长公共子序列(dp模板)解析代码牛客_最长公共子序列(dp模板)最长公共子序列__牛客网解析代码子序列即两个字符串中公共的字符,但不一定连续。        从题干中可以提取出问题:求字符串s和t的最长公共子序列假设LCS(m,n)为长度为m的字符串s与长度为n的......
  • zdppy+vue3+onlyoffice文档管理系统实战 20240902 上课笔记 登录功能优化
    遗留问题1、登录以后跳转最近文档2、如果用户没有登录应该自动跳转登录页面3、如果用户的token校验失败,应该自动调整登录界面4、按回车键自动跳转登录页面登录以后跳转最近文档constrouter=useRouter()router.push("/")实际代码:constloginData=awaitapi.login......
  • winform实时获取系统dpi
    环境:window10框架:4.5.2由于windows10的DPI设置无法直接获取屏幕的真实长宽获取长宽代码intiH=Screen.PrimaryScreen.Bounds.Height;intiW=Screen.PrimaryScreen.Bounds.Width;两种方法:1、使用上边代码获取缩放后的长宽iH*DPI(1.25)=真实高度DPI获取方法:#reg......
  • 产品经理必看!超详细的NPDP认证考试科普
    能力提升是每个职场人最关心的问题,产品经理当然也不例外。相信不少朋友在走上产品的道路后都是边做边学边摸索。特别是刚工作5年内的PM,对产品的整个知识框架并不成熟,1000个产品经理,就有1000个产品问题。但所有问题的本质,都是因为缺少系统的产品管理知识体系、解决问题的原则方法、......
  • 产品经理必看!超详细的NPDP认证考试科普
    能力提升是每个职场人最关心的问题,产品经理当然也不例外。相信不少朋友在走上产品的道路后都是边做边学边摸索。特别是刚工作5年内的PM,对产品的整个知识框架并不成熟,1000个产品经理,就有1000个产品问题。但所有问题的本质,都是因为缺少系统的产品管理知识体系、解决问题的原则方法、......