首页 > 其他分享 >做题笔记

做题笔记

时间:2024-06-08 22:23:09浏览次数:27  
标签:le 笔记 son leq 子树 times dp

杂题

DP

Abandoning Roads

看到 \(n \leq 70\) , 想一下朴素状压

设 \(f_{S,u}\) ,\(S\) 表示处理完的连通块状态 , \(u\) 表示当前的节点

因为只有两种边权,所以可以双队列求最短路,所以我们有了一个天然的 \(O(2^n m)\) 的做法

无法通过捏

\(m\)肯定没办法省略了

那我们考虑减少 \(2^n\) 这个东西

怎么办。状态不好减,就只能转移减了

从小到大的转移肯定不能省略,但小局面可以省略!

发现,如果一个连通块小于 \(4\) 个点,那么一定是用边权小的连,不然就不满足 \(\text{MST}\) 的兴致了

复杂度 \(O(2^{\frac{n}{4}}m)\) , 拿下

T395568 魔法

from NOIP计划 Round 9 T2

题意可以转化为一个连通块内是否存在绝对众数,考虑树形DP。

自己做的时候设计了一个 \(f_{u,0/1}\) 的方程,但最后可以发现不好处理子树所选择的连通块大小

数据范围 \(1 \leq c \leq n \leq 3000\)

因此我们可以遍历每一种种族,并且对每一个节点进行赋值,若节点为当前种族,则为\(1\),否则为\(0\)

若 \(\sum_{t \in (D)} > 0\) 那么当前种族在当前连通块就是绝对众数

那么就可以设计一个 \(f_{i,j}\) 表示带有 \(i\) 节点含有\(j\)个节点的连通块,然后我们做树上背包

P2465 [SDOI2008] 山贼集团

P2465 [SDOI2008] 山贼集团

看到数据范围 \(1 \le p \le 12 \text{且} 1\le t\le 2^p\) 可以想到状压

那么状压需要将一个集合压缩为一个二进制数

我们可以发现,额外收益或损失,是生来就应该状压的!

设 $\text{dp状态为} f_{u,s} $ 表示以 \(u\) 为根的子树中我们放置的部门形成的状态

然后做一下树上背包就可以做完了

我竟然新学到怎么枚举子集

// 枚举 j 的子集
for(int k = j ; k ; k = (k-1) & j) 
    // do something

[APIO2014] 序列分割

要记住,DP优化基本都是在原来的DP式子上优化的

这个题,首先要发现切的顺序没有影响,于是可以直接dp

朴素一点的式子

\(f_{i,j}\) 表示在前 \(i\) 个里面切了 \(j\) 刀 。

\[f_{i,j} = \max{f_{j,k-1} + s_j (s_i - s_j)} (0 \leq j < i ) \]

时空复杂度 \(O(n^2)\) 空间显然可以直接滚动优化掉。

考虑优化转移

发现存在决策单调性,就是有一种决策一定更优

记 \(f_{i,j}\) 为 \(f_i\), \(f_{j,k-1}\) 为 \(g_j\)

任取 \(j,k\) 满足 \(0\leq k \le j \le i\) , \(j\) 优于 \(k\) , 有下面式子

\[g_j + s_j(s_i-s_j) \geq g_k + s_k(s_i-s_k) \frac{(g_j-s_j^2)-(g_k-s_k^2)}{s_k-s_j} \leq s_i \]

发现满足下凸壳

维护一下,做完了

[ICPC2022 Jinan R] DFS Order 2

主要知识点是回滚背包,第一次见

设 \(f_u\) 为 \(f\) 节点为根的子树的总方案数,那么有

\[f_u = son_u ! \times \prod_{v\in son} f_v ; \]

设 \(ans_{u,i}\) 表示 \(i\) 在 dfs 序中位置为 \(i\) 的答案,\(g_{j-i}\) 表示 \(v\) 与 \(u\) 差 \(j-i\) 的方案数, 那么有

\[ans_{v,j} = \sum ans_{u,i} \times g_{j-i} (v \in son_u) \]

考虑怎么转移 \(g\)

设 \(dp_{i,j}\) 表示在 \(u\) 的儿子里面选 \(i\) 个,大小为 \(j\) 的方案数

发现 \(dp\) 可以用背包维护

那么

\[g_{j+1} = \sum dp_{i,j} \times j! \times (son_u - 1 - j) ! \times \frac{f_u}{f_v \times son_u!} \]

其中 \(j!\) 和 \((son_u -1 - j)!\) 表示排列顺序

$ \frac{f_u}{f_v \times son_u!}$表示 \(x\) 的儿子中,除了 \(y\) 的子树内部方案数的积。因为 \(ans\) 定义的时候就要求不能考虑 \(y\) 子树内部的方案数,因此要除去 \(y\) 的子树带来的贡献。

答案是 \(ans_{u,i} \times t_u\)

发现求 \(dp\) 是 \(O(n^4)\) 的,用回滚背包求解,优化到 \(O(n^3)\)

// 回滚背包
for (auto v : G[u]) {
    if (v == fa) continue;
    mul *= f[v];
    ++cnt;
    for (int i = cnt; i; --i)
      for (int j = sz[v]; j <= n; ++j)
        ff[i][j] += ff[i - 1][j - sz[v]];
    now += sz[v];
  }
  for (auto v : G[u]) {
    if (v == fa) continue;
    for (int i = 0; i <= n; ++i)
      tmp[i] = 0;
    for (int i = 1; i <= cnt; ++i)
      for (int j = sz[v]; j <= n; ++j)
        ff[i][j] -= ff[i - 1][j - sz[v]];
    for (int i = 0; i <= cnt - 1; ++i) {
      for (int j = 0; j <= n; ++j) {
        tmp[j] += ff[i][j] * fac[i] * fac[cnt - 1 - i] * mul;
      }
    }
    for (int i = cnt; i; --i)
      for (int j = sz[v]; j <= n; ++j)
        ff[i][j] += ff[i - 1][j - sz[v]];
    mint val = 1 / f[u];
    for (int i = 0; i <= n; ++i)
      for (int j = 0; j <= n - 1 - i; ++j)
        g[v][i + j + 1] += g[u][i] * tmp[j] * val;
  }

Nauuo and Circle

清新的计数题,因为模型抽象错误,导致去看题解才发现哪里错了。

我们可以发现,题目中要求不相交,实际上就是要求子树的区间连续

考虑每一次加边 \((u,v)\) 对答案的贡献

对于点 \(u\) 来说,这条边可以放在他度数所形成的 \(deg_u\) 个区间里

点 \(v\) 同理

DS

[国家集训队] 等差子序列

问题等价于在排列中找三项的等差数列,这使得难度大大降低。

我们通常可以枚举中项,对于每个中项,我们可以考虑左右的项,如果左边的项对应的右边的项还没有出现,那么合法。

问题转化成状态回文 \(hash\) 了,可以用 \(SGT\) 维护一下哈希

做完了

标签:le,笔记,son,leq,子树,times,dp
From: https://www.cnblogs.com/osky123456/p/17831204.html

相关文章

  • Living-Dream 系列笔记 第59期
    T1这是一道manacher模板,但是我们使用二分+hash\(O(n\logn)\)的做法。显然地,若长为\(len\)的回文串存在,则长为\(len-2,len-4,...\)的回文串也一定存在(在两端各删去若干相同字符即可)。至此,我们发现回文串分两类:奇回文串、偶回文串,在每一类当中分别具有单调性。于是......
  • C语言笔记第12篇:自定义类型(struct结构体)
    1、结构体类型的声明为什么要有自定义的结构类型呢?这是因为稍微复杂的类型,直接使用内置类型是不行的!比如:描述一个人或 一本书的价格、版号等信息。1.1结构的创建结构体是一些值的集合,这些值称为成员变量,结构的每个成员可以是不同类型的变量。1.1.1 结构的声明structt......
  • 替罪羊树学习笔记
    替罪羊树学习笔记史!思想众所周知,替罪羊树是一种平衡二叉搜索树,其拥有虽然我不理解为什么,但是很牛的复杂度。其思想在于通过一个系数进行定期重构,使得维护所有信息的树是一棵接近平衡树的伪平衡树,那么他依然拥有\(O(\logn)\)级别的层高,因此对于跳转查询依旧具有优异的复杂度......
  • 通信原理第一章重点笔记
    通信原理第七版 樊昌信曹丽娜手写笔记参考小红书:香草味冰淇淋~第一章绪论1.消息、信息与信号消息:是信息的载体(可分为连续消息和离散消息);信息:是消息中所包含发的有效内容;信号:是消息的传输载体;  三者区别:消息是信息的物理形式,信息是消息的有效内容,信号是消息的传......
  • 后缀数组学习笔记
    1.前置知识:基数排序1.1.思想现有如下序列:3,44,38,5,47,15,36,32,50,现在要用基数排序算法排序,要怎么做?基数排序的初始状态如下:按照个位将原序列中的数分组,放入对应的集合将分好的数按照个位的顺序取出,得到:将序列中的数重新按照十位分组,放入对应集合:将每一位上......
  • C++ 6.8笔记:①判断质数②二分基础算法
    质数试除法判定质数boolprimes(intx){  if(x<2)returnfalse;  for(inti=2;i<=x/i;i++){    if(x%i==0)returnfalse;  }  returntrue;}埃筛1intp[N],k,n;boolf[N];voidprimes(intn){//埃筛,思想:质数的倍数是合数for(inti......
  • FFMpeg笔记(十四)继续说说FFmpeg 升级6.1 遇到的那些坑
    一、mp4秒播率下降  灰度阶段发现秒播率略低0.x%,以为是灰度的数据抖动。上线后短视频业务方找过来,说秒播率明显下降。一起分析,发现业务方不止关心1秒秒播率,也关心首次播放vv的200ms秒播率,筛选出来发现数据大降。。然后我就开始分析。思路是将起播分为多个阶段,查数据看哪个......
  • Net AI学习笔记系列第五章 OpenCVSharp实操——图片中物体轮廓查找描绘
    .NetAI学习笔记系列第五章OpenCVSharp实操——图片中物体轮廓查找描绘文章目录.NetAI学习笔记系列前言一、OpenCVSharp实操——图片中物体轮廓查找描绘二、步骤1.开发工具2.引入库3.示例代码4.运行效果总结前言本文主要介绍使用OpenCVSharp中的FindContours......
  • digit 手写数据库笔记 (机械学习)
    参考书籍第三章内容digit手写数据库#最初的分类器#digits手写数字库importnumpyasnpimportmatplotlib.pyplotaspltfromsklearnimportdatasetsfromsklearnimporttree#性能评价相关的库fromsklearnimportmetrics#digits数据加载digits=......
  • Java那些事儿 —— 写一篇妈妈也能看懂的Java学习笔记
    Java那些事儿——写一篇妈妈也能看懂的Java学习笔记小白也能看懂的Java学习笔记(因为我也是小白,所以写一点小白自己能看懂的东西)这本笔记包括但是不限于Java知识,(做开发没多久感觉自己忘记的差不多了,最近又看了几本书,心血来潮写一个笔记)写这个的目的意在自我复习,尽量让自......