百宝袋


杂物

类质因数分解。

对于一个值域为 V,长度为 n 的数组 a{n},可以在 O(n2log2V) 的复杂度找到一个长度为 nlogV 的数组 c{m} 满足 c 中无 1 且任意两元素互质同时对于任意 ai 可以分解为 ai=j=1mcjpj

这时就可以将其当作质数处理。

link-luogu

link-cf


减半报警器。

考虑到如果 i=1kai=S,则有 maxi=1kaiSk。证明是显然的。

如果一个玩意在 k 个值的和超过某一个阈值后才被激活且 k 比较小时,我们可以考虑使用这个东西。对于每一个值建堆,维护根这个值有关联的所有阈值。每次更新后检查所有可能会超阈值的监测器,没有报警的重新算一下阈值再放回去,可以发现最多检查 log 次,所以总复杂度大约 O(nklog)

link1-鬼街

link2-gym102331f


摩尔投票法

如果要求一个区间 [l,r] 内出现次数严格超过 rl+1k 的所有数。可以考虑每次删掉 k 个不同的数,最后剩下的不同的不超过 k1 种,显然,这里面就包含了我们要找的答案。这个可以用线段树与其他分治数据结构实现。

但是摩尔投票的问题是答案一定能被找到,找到的不一定是答案,如果题目给了 Spj 就没什么,如果没有的话就要自己再检查一次。


李超线段树

我们都知道李超可以维护直线。

但是如果我们把一条双曲线或者是抛物线看作两条单调的射线,一样可以维护。

然后对于在对称轴左边和右边的两端分别开一棵树,分别维护即可。

这玩意感觉是真的这辈子见不到。


变进制数

对于一个排列,我们发现其排名本质是一个位值从高到低为 n,n1,,1 的一个变进制数,每一位的值是在其后的比它小的数的个数。

比如一个长度为 5 的排列 1,4,2,5,3,对应的变进制数是 02010=13,同时它的后继为 1,4,3,2,5,对应 02100=14

发现求排列的后继时,大规模改动的位置长度不会超过 17((17!)=355,687,428,096,000)。

所以可以直接模拟维护改动的位置。


另外,如果求 Xmodi=1abi(a=1,2,,n),可以考虑将 X 表示为位值从低到高为 b1,b2, 的变进制数并求每一个后缀对应的数。


一个经典的组合意义套路

一个数组,一个划分方案 S 的价值为 vSivai,求所有合法方案的权值和。

那么考虑一个组合意义是每个划分的集合 vivai 个元素中选一个,然后再看看怎么 dp。


欧拉降幂

众所周知: ab{abb<φ(m)abmodφ(m)+φ(m)bφ(m)(modm)

同时,当 n>2 时,有 2φ(n) 以及 φ(2kn)=2k1φ(n)φ(n)2(2n)。所以易得对 nlogφ 后其值固定为 1。

可以用来解决一些关于幂塔的问题。

link-luogu


zak 讲的区间线性基新做法

常规的区间线性基可以使用一些简单的数据结构如线段树或平衡树做到 O(log3) 的一次查询。

但是我们可以有如下考虑:

显然我们的线性基大小是 O(logV) 的所以我们考虑随机 100 个区间内元素的线性组合,这样就是 O(100log)O(log2) 的了。

可以轻松通过[Ynoi2013] 无力回天 NOI2017CF587E


看 zak 博客看到的二进制报警器

看不懂。后面补。


记一些常用的数学工具

  • 组合数 (nm)=n!(nm)!m!,有 (nm)=(n1m)+(n1m1)
  • 第一类斯特林数 [nm],表示将 n 个不同的数分为 m 个环排列的方案数,有 [nm]=[n1m]×(n1)+[n1m1]
  • 第二类斯特林数 {nm},表示将 n 个不同的数分为 m 个集合的方案数,有 {nm}={n1m}×m+{n1m1}
  • 欧拉数 nm,表示所有 1n 的排列中,m 个数比前一个数大的排列数,有 A(n,m)=A(n1,m)×(m+1)+A(n1,m1)×(nm)

同时我们对于第二类斯特林数和欧拉数有线性求值公式:

{nk}=i=0k(1)miini!(ki)!

nk=i=0k(n+1i)(1)i(m+1i)n

然后这些还大多存在 Polylog(n) 的一行或一列的求法。


Raney 引理

一个神奇的东西,记一下:如果有一个整数序列 x1,n 满足 i=1nai=1,那么有且仅有一个与 x1,n 的循环同构的数组 x1,n 满足 i[1,n],j=1ixi>0

证明略。

考虑这玩意的应用:如果我们有一堆整数 x1,x2,,\xn 满足 xi=1,那么把 x 的所有排列按循环同构划分等价类之后每个等价类中就只会有一个符合要求的排列。

洛谷专栏

关于树的重心的一些结论

考虑一个几乎显然的结论:重心(不唯一时取深度较浅的一个)的子树 siz 一定严格大于总权值和的一半,证明可以考虑分析将重心移到其父亲带来的变化。

所以我们考虑求出原树的一个 dfs 序,维护一个序列 A,如果 dfs 序第 i 为对应的点如果为 x,那么就在 A 的末尾写 valxx。最后考虑 A 的中位数,因为重心 X 的子树和大于总的一半,所以序列的中位数对应的点一定在重心的子树内,我们再倍增去跳第一个满足子树大小大于一半的点即是重心。

gym102759I

posted @   Grisses  阅读(16)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
Document
点击右上角即可分享
微信分享提示