自闭集训 Day7

动态规划

LOJ6395

首先发现这个树的形态没啥用,只需要保证度数之和是\(2n-2\)且度数大于0即可。

然后设\(dp_{i,j}\)表示前\(i\)个点用了\(j\)个度数的最小值,然后就获得了\(O(n^3)\)的DP。

不妨每个点的度数都减1,那么总度数就变成\(n-2\)了。

考虑原来\(i\)的作用是什么:要限制选的点数不能超过\(n​\)。

此时我们总度数小于\(n\),所以只要度数不为0的点的总度数不超过n-2那么就肯定有点数不超过n。所以我们可以先认为所有点贡献的都是\(f(1)\),然后如果选的是\(k,k\ne 1\)那么就把贡献设为\(f(k)-f(1)\)。

于是就可以直接设\(f_i\)表示当前度数之和为\(i\)的最大贡献,然后做一个完全背包即可。

LOJ2552

设\(f_{i,j}​\)表示\(i​\)当前还剩\(j​\)血的概率,那么锁定技能就相当于一次转移。

那么最后的询问就没了,非常简单。

那么每一次询问呢?我们关注的只是第\(i​\)个人存活的概率,设为\(p_i​\)。

那么每个人被命中的概率呢?设\(g_j​\)表示除了自己以外还有\(j​\)个人存活的概率,发现就是个背包,直接硬上分治FFT可以得到70分。

当然,我们可以先把一整个背包算出来再退掉当前物品,就\(O(Cn^2)​\)了。

CF53E

容斥,求至少\(k​\)个叶子的方案数。

枚举叶子集合,用剩下的点组生成树,然后把叶子挂回去,复杂度\(O(2^nn^3)​\)。

然后用FMT优化容斥,没了。

UOJ129

发现满足\(x^2\le 500​\)的质数只有8个。

于是每个数只会有这几个质数和另一个大质数作为因子。

把所有数按大质数排序,然后连续一段就必须放在同一个集合(或者不选)。

然后设\(f_{i,S,T}\)表示前\(i\)个,\(S,T\)里面分别有哪些质数,乱DP即可。

某题

选一些位置,使得这些位置不相邻。相邻定义为八连通。

题解是插头DP。

(没怎么听清题,但大概不难)

UOJ266

发现删掉一条链之后必然会变成几个子树,于是可以设\(f_x\)表示\(x\)子树的sg函数值,然后暴力枚举删子树内哪个点,就获得了多项式时间的算法,应该是\(O(n^2)\)的。

如何优化?

设\(g_x\)表示\(x\)以及自己儿子的\(f\)的异或值,然后发现删掉一条链就是这条链的\(g\)的异或值再异或掉根的。(大概意思就是这个,可能表述得不是很清晰)

于是对子树内维护一个字典树支持插入、全局异或、求mex、合并,就没了。

NTF随手切掉了清华集训题目,NTF进清华了,NTFAKIOI!!!!

某题

平面上\(2n\)个球(球的位置两两不同),有\(2n\)个机器人位于\((0,i),(i,0)\),每次激活一个机器人拿走它坐标轴垂直方向上最近的球,问有多少个方法拿走所有球。

把每一行、每一列视作一个点,一个球作为一条边,边权为\(x+y\),那么激活第\(i\)行的点的时候就会取走与他连在一起的边权最小的边,列同理。

所以可以知道每个连通块点数等于边数,也就是一个基环二向树。每个点要恰好选一条边,并且选边的方法受上面的限制,然后求这样选边的顺序的个数。

树上每个点选的边是确定的(自己到父亲的那条边),但环上有两种情况,所以先枚举是哪种情况,然后每个点要选的边就确定了。

在树上,看儿子要选的边与自己要选的边的边权大小关系,如果比自己的小那么就必须先选,这样一路DP上去。

在环上,看自己左右两条边的大小关系,如果自己要选的边权更大那么就必须另一个点比自己先选,就形成了一些小于号的关系,也用组合数算一下就没了。

AGC007D

设\(dp_{i}\)表示喂完前\(i\)个熊,并且当前位置在第\(i\)个熊那里,的最短时间。

然后枚举上一次,有两种情况:直接走回去走回来或是要在那里等一下。

显然可以单调队列优化,就没了。

bzoj2216

决策单调性,大家都会。

四边形不等式

如果对于任意\(i_1\le i_2\le j_1\le j_2\),都有
\[
w(i_1,j_2)+w(i_2,j_1)\ge w(i_1,j_1)+w(i_2,j_2)
\]
那么就满足决策单调性。

LOJ566

枚举中位数\(w\),把一条边拆成两条:\(w-a_i,a_i-w\)(分别是白黑边),再两个都加上\(w\),就变成了\(2w-a_i,a_i\),然后就是要求一棵恰好\(n/2\)条白边的最大生成树。

这个直接wqs二分可以得到,于是得到了\(O(m^2\log^2 m)​\)的做法。

然后有一个结论:对于最优的\(w\),这个生成树只包含\(a_i\ge w\)的黑边和\(a_i\le w​\)的白边。(???)

考虑wqs二分的过程,是要把\(2w-a_i\)变成\(2w+k-a_i\),发现这样一来我们可以不枚举\(w\)而直接二分\(2w+k\),然后就没了。

(???)

咕了

LOJ565

我们发现进位一次1的个数就少1。

于是题目就转化为求最后1的个数的期望。

于是操作的顺序与答案无关。

对于每一位,求它的贡献。

从后往前DP,记\(dp_{i,j}\)表示第\(i\)位算上进位叠了\(j\)个1的概率。

转移有两个。一个是由上一位进位而来,是\(dp_{i-1,j}\rightarrow dp_{i,j/2}\);一个是在这个位置的操作,相当于乘\(px+1-x\)的多项式。

直接暴力DP是\(O(n^2)\)的。

发现乘多项式可以分治FFT,而一个位置如果加了\(w\)那么只能往前进位\(\log_2 w\)个位置,于是每个位置可以只处理有值的最大地方,然后就可以证出复杂度是\(O(n\log^2 n)\)了。

2019暑期金华集训 Day7 动态规划的更多相关文章

  1. 2019暑期金华集训 Day7 分治

    自闭集训 Day7 分治 主定理 由于我沉迷调题,这个地方没听课. 某些不等式 咕了 nth_element 使用快速排序的思想,选一个中间点,看左右有多少个. 期望复杂度\(O(n)\). 首先把一 ...

  2. 2019暑期金华集训 Day6 杂题选讲

    自闭集训 Day6 杂题选讲 CF round 469 E 发现一个数不可能取两次,因为1,1不如1,2. 发现不可能选一个数的正负,因为1,-1不如1,-2. hihoCoder挑战赛29 D 设\ ...

  3. 2019暑期金华集训 Day6 计算几何

    自闭集训 Day6 计算几何 内积 内积不等式: \[ (A,B)^2\le (A,A)(B,B) \] 其中\((A,B)\)表示\(A\cdot B\). (好像是废话?) 叉积 \[ A\tim ...

  4. 2019暑期金华集训 Day5 树上数据结构

    自闭集训 Day5 树上数据结构 前置知识 点分治 边分治 树链剖分 LCT Top Tree LCT时间复杂度 线段树每次查询是严格\(\log n\)的,然而splay维护连续段的时候,如果每次查 ...

  5. 2019暑期金华集训 Day5 生成函数

    自闭集训 Day5 生成函数 一般生成函数 无脑地把序列变成多项式: \[ \{a_i\}\rightarrow A(x)=\sum_{n} a_nx^n \] 形式幂级数 生成函数是一种形式幂级数. ...

  6. 2019暑期金华集训 Day3 字符串

    自闭集训 Day3 字符串 SAM 考虑后缀树. SAM的parent树是反串的后缀树,所以后面加一个字符的时候相当于往串前面加一个字符,恰好多出了一个后缀. 于是可以以此来理解SAM. 每一条路径对 ...

  7. 2019暑期金华集训 Day3 图论

    自闭集训 Day3 图论 NOI2019 D2T1 没有真正建出图来的必要,可以直接打取\(\min\)的\(tag\). 也可以把边压进堆里,然后变成一个二维清点问题(???),然后就线段树+并查集 ...

  8. 2019暑期金华集训 Day2 线性代数

    自闭集训 Day2 线性代数 高斯消元 做实数时,需要找绝对值最大的作为主元,以获取更高精度. 在欧几里得环(简单例子是模合数)意义下也是对的.比如模合数意义下可以使用辗转相除法消元. 欧几里得环:对 ...

  9. 2019暑期金华集训 Day1 组合计数

    自闭集训 Day1 组合计数 T1 \(n\le 10\):直接暴力枚举. \(n\le 32\):meet in the middle,如果左边选了\(x\),右边选了\(y\)(且\(x+y\le ...

随机推荐

  1. idea 中激活 JRebel

    JRebel介绍: JRebel是一款JVM插件,它使得Java代码修改后不用重启系统,立即生效.IDEA上原生是不支持热部署的,一般更新了 Java 文件后要手动重启 Tomcat 服务器,修改才能 ...

  2. 你有自信写while(true)吗?

    每次写while(true)的时候会不会心虚? 特别逻辑稍微复杂一点

  3. OO——JML作业总结

    目录 第三单元博客作业 JML语言理论基础 1.注释结构 2.JML表达式 3.方法规格 4.类型规格 应用工具链 JMLUnitNG使用实例 作业架构设计 第一次作业 第二次作业 第三次作业 BUG ...

  4. Mongodb 学习笔记(一)

    MongoDB 是一款开源.跨平台.分布式,具有大数据处理能力的文档存储数据库.在 2007 年由 MongoDB 软件公司开发完成,并实现全部代码源发展.目 前,该文档数据库被国内外众多知名网因所采 ...

  5. VS2017 Git failed with a fatal error. error: open(".vs/xxxxxx/v15/Server/sqlite3/db.lock"): Permission denied fatal: Unable to process path .vs/xxxxxx/v15/Server/sqlite3/db.lock

    具体错误信息:Git failed with a fatal error. error: open(".vs/xxxxxx/v15/Server/sqlite3/db.lock") ...

  6. JavaScript之条件语句

    (1)if条件语句 // if(条件){当条件为真,存在即为真.当条件为false null 0 undefined中任意一种时,则表示不存在,不存在即为假} if(条件){ 条件为真时执行的代码 } ...

  7. (五)react-native开发系列之Android原生交互

    react-native可以做web与原生的交互,这是使用react-native开发项目的主要目的之一,也是主要优势,用rn而不用原生交互则毫无价值,这篇文章用来记录在项目中rn的原生交互使用过程. ...

  8. Mysql 存储过程 + python调用存储过程 (内置函数讲解及定义摘抄)

    定义 存储过程:就是为以后的使用而保存的一条或多条 MySQL语句的集合.可将其视为批文件,虽然它们的作用不仅限于批处理. 个人使用存储过程的原因就是因为 存储过程比使用单独的SQL语句要快 有如下表 ...

  9. gitlab自带的Nginx与原Nginx冲突的解决方案

    gitlab 推荐方案2 默认情况下,gitlab使用自带的Nginx,占用80端口,这样就与系统原本安装的Nginx冲突.导致其中一个nginx无法启动 我的gitlab可以正常启动,当再部署一个接 ...

  10. Android笔记(六十七) 自定义控件

    实际编程中,系统提供的控件往往无法满足我们的需求,一来是样子丑陋,二来是一些复杂的组合需要多次使用的话,每次都写一堆控件的组合会很耗费时间,所以我们将这些组件的组合自定义为一个新的控件,以后使用的时候 ...