首页 > 其他分享 >Tricks

Tricks

时间:2024-03-01 15:35:51浏览次数:14  
标签:题目 答案 可以 dfs 复杂度 Tricks dp

  • 字符串
  1. 计算一个字符串 \(S\) 的 border 的时间复杂度是 \(O(|S|)\) 的,且与模板串无关。在更换模板串时,不需要重新计算 border。对于两个字符串集合,两两匹配的时间复杂度从 \(m\sum |S|+n\sum |T|\) ,降低到了 \(\sum |S|+n\sum |T|\)。(2.16 A 60pts)
  • 动态规划
  1. 有些题目可以先考虑贪心策略,再在贪心策略的基础上 dp。例如你发现最优策略一定满足选择的是一段区间(但是不知道是哪个区间),就可以使用 dp。(2.17 B 50pts)

  2. 有些图论问题,最后的答案只与其中的一些量有关(比如 距离),那你在 \(O(m\log m)\) 的时间复杂度内求出 距离,这道题就和图没有关系了。

  3. 有些题目由多个并列约束组成,最后的方案要满足所有约束,一般是确定一个序列,且序列的前缀要满足某些条件,一般是最优化问题。这种问题可以把约束放在坐标系的折线上,考虑折线上的转移关系。

  4. 对于一些局限影响的题目,先考虑影响周期。例如一个排列有几个条件,条件本身只基于四个东西的顺序,那你实际的顺序个数只有 \(4!\) 种,可以方便 dp。

  5. 有一些数据范围不好用 dfs 枚举,但是也是指数级别的,考虑用状压 dp(这个过程可以用 dfs 枚举来转移)。

  • 贪心
  1. 如果一个决策你人类思维下是对的,而且可以过样例,就去写写试试。就比如说,有多个优先级相同的事件,ddl 不同,你肯定优先做 ddl 靠前的任务。
  • 数据结构
  1. 敏感发现 单调性 和 不可逆性:如果一个东西的状态 \(S\) 转移到 \(S'\) 后就再也无法转移回 \(S\),那可以考虑时间轴上做数据结构。(2.16 C 85pts)

  2. 只跟排名有关的带修题目,可以通过树状数组维护,典型例子是逆序对。你可能需要离散化,或者将树状数组改成 map 实现(2.17 C)

  3. 用数据结构维护带修哈希。

  • 杂项
  1. 对于若干个区间 \([l_1,r_1],[l_2,r_2],\cdots,[l_n,r_n]\) 的交,答案是 \([\max^n_{i=1} l_i,\min^n_{i=1} r_i]\)(如果区间不合法则无交集)(2.16 C 50pts)

  2. 对于一个题目,如果出现了本应该同阶,但实际上出现了(哪怕是部分分)不同阶的情况,考虑离散化。(2.16 C 65pts)

  3. 双集合题,考虑将其中某一个集合 \(S\) 约束为 \(|S|=1\) 后怎么做。以及,这个集合 \(S\) 中的贡献关系是什么。(2.17 A)

  4. 定长区间问题,可以通过增量式修改减小常数,在 bitset 硬莽题有用。

  5. 枚举子串问题,尝试通过约束子串长度降低复杂度。如果只有 \(len\le 10\) 的串会产生贡献,则时间复杂度就是 \(O(10n)\) 级别的。(2.17 C Sub 6、7)

  6. 如果你能在搜索时,将目前搜索的状态唯一的表示出来,而这个状态可以转移到另外一个状态,就相当于在 dp 里的转移关系。
    例如在 2.19 A 的 40pts 做法中:我们的 dfs 内容可以用唯一的四元组 \((n,k,t,l)\) 表示出来。分别表示 将 \(n\) 分成 \(k\) 份,使得最长的一段是长度为 \(l\) 的方案数,目前的这一段长度是 \(t\)。对于一个 \((n,k,t,l)\) ,他代表的情况是唯一的。然后你枚举对于新的数 \(n\),是切段另起一段还是不切。对于每种情况你有 \(2\) 种选择,看似时间复杂度是指数的,但实际上因为每一个转移情况只会被算一次,所以时间复杂度是四元组 \((n,k,t,l)\) 的数量,也就是 \(O(n^4)\)。

然后其实,你在 \(1s\) 之间内可以计算至多 \(3\times 10^8\) 次搜索,就算把结果全部记录下来也就是 1144 MB,反正你不可能全部存下来,所以写 dfs 搜索的情况下,可以全部记忆化。

然后还有一种更加不优美的,就是对于一个状态你可以对他状压,就比如说最后状压大小是 \(998244353\),然后每个状态依赖的一定在这 \(998244353\) 种情况里,最优化题目,哈希冲突的情况正好在最优化路径中的概率非常小。

  1. 有些题目的基本变量被赋值为 \(0\) 时,基本一定有简单做法(不然这个变量没啥意义)。这个 Subtask 就算被排列在比较靠后的位置,也要考虑去完成。如果人类思维无法理解这个 Sub 怎么做,可以考虑打完暴力找规律。

  2. 有些题目数学意义上的答案应当是个整数(是个浮点数),但是允许给出接近的浮点数(整数)答案。这种过程是丢失精度的,说明这道题需要一些不确定做法。然后,一眼丁真的不可做题也可以当作是随机化题做。

  3. 如果转移是两个 bool 数组的运算,那可以通过 bitset 使得时间复杂度降低到 \(O(\frac n w)\)。然后,在 dfs 里面,bitset 维度数越低越好;同时,如果可以钦定一些答案必然是相同的,就可以让常数减小一些。

  4. 学会读样例文件,你发现一个答案上界是 \(10^{12}\) 的题,实际答案只有几十几百个,你就可以思考答案为什么这么小,和随机数据/弱数据的性质是否有关系。

  5. 如果是关于子集的题目,而且子集之间存在贡献。那么这道题就可以理解为维护 \(S\) 所有子集的子集 这样的题目,可以通过下列算法在 \(O(3^n)\) (而不是 \(O(4^n)\))的时间复杂度里计算。

for (int m = 0; m < (1 << n); ++m)
  for (int s = m; s; s = (s - 1) & m)

证明:对于每一位只有 \(s,m\) 都有,\(s\) 无 \(m\) 有,\(s,m\) 都无 三种情况。

  1. 如果你发现满足要求的子集一定满足某一个要求,那么上文的 \(O(3^n)\) 就可以转化成 \(O(n\times 2^n)\)。

  2. 一些要求连续性的序列,随机情况下连续长度是 \(log_{值域}\) 级别的,所以可以有一些基于连续长度的做法。

标签:题目,答案,可以,dfs,复杂度,Tricks,dp
From: https://www.cnblogs.com/wtc-qwq/p/18047161

相关文章

  • [Some Tricks] 自动取模类
    consti128o=1;template<i64mod,i64invpow=mod-2>structModular{u64M=(o<<64)/mod;i64query(i64x){u64x_=1ull*x;u64q=1ull*(((i128)(M)*(i128)(x_))>>64);u64r=x_-q*(1ull*mod......
  • tricks I
    1.P2824排序碰见这种只有最后有一个查询的问题我们可以考虑二分最后的答案。具体地,对于当前\(mid\),把所有小于\(mid\)的设为\(0\),其他的设为\(1\)。此时我们只需要维护最后的位置是否大于\(mid\)就好。那么每次升降序的排序就很好办了。我们用线段树维护一个区间和,也......
  • Essay - OI tricks
    ......
  • CV常用Tricks
    训练CV比赛常用Tips&Tricks目录引言1.图像增强颜色增强RGBNormBlackandWhiteBenGraham:Grayscale+GaussianBlurHue,Saturation,BrightnessLUVColorSpaceAlphaChannelYZColorSpaceLumaChromaCIELabYUVColorSpaceCenterCropFlippingsRandom......
  • 洛谷 P8955 「VUSC」Card Tricks
    洛谷传送门很显然每个数的每一位最多只会修改一遍。于是拆位,每一位开个并查集,存下一个不拥有这一位的数,就可以暴力修改了。但是空间是\(O(n\logV)\)的,炸了。于是可以考虑手写i24类,同时并查集寻找祖先不要用递归版的路径压缩,然后就过了。code//Problem:P8955「VUSC」......
  • Python Tricks
    1.同时按照一个list的大小排序两个listdefreturn_sorted_list(cclass):namelist=[]numlist=[]forcatincclass.cat:namelist.append(cat.catName)numlist.append(cat.catNum)#排序name_num_zip=zip(namelist,numlist)......
  • 高级统计 | Tricks & Review
    打算写一个综合性比较强的文章。全文分为六个章节:基本概念,回归,分类,模型选择,评价指标,无监督学习。基本概念1基本概念线性代数的知识十分有意义。在此假定已知矩阵的加减乘运算。1.1矩阵的初等变换初等变换专门设计用来执行某种操作,如行(列)交换、行(列)倍乘,或者将一个行(......
  • Tricks
    图论拓扑排序中有形如"让某个点尽量早出队”的限制,可以建反图转化为“让某个点尽量晚出队”的形式。P1954,P3243。\(k\)个点的LCA为dfs序最大和最小的两点的LCA。根分别到\(k\)个点路径的并集可以差分为根到\(k\)个点的路径减去根到dfs序相邻两点的LCA的路径。数据结构......
  • OI Tricks
    记录一些见到的感觉很有用的tricks。平均值对于和的平均值(形式化地,\(\bara=\dfrac{\sum_{i=1}^na_i}{n}\)),可以转化成\(a_i-\bara\)然后和\(0\)乱搞。异或哈希就是xorhash,可以在CF上找到详细教程:Link。主要用于只关心元素集而不关心顺序的时候。(可能......
  • OI Tricks
    记录一些见到的感觉很有用的tricks。平均值对于和的平均值(形式化地,\(\bara=\dfrac{\sum_{i=1}^na_i}{n}\)),可以转化成\(a_i-\bara\)然后和\(0\)乱搞。异或哈希就是xorhash,可以在CF上找到详细教程:Link。主要用于只关心元素集而不关心顺序的时候。(可能......