From 71870c9387a3d61d84ecc41a7ee2c013bf439414 Mon Sep 17 00:00:00 2001 From: cmach_socket Date: Fri, 14 Jun 2024 07:39:24 +0800 Subject: [PATCH] Site --- 2024/06/13/2-SAT-md/index.html | 1065 ++++++++++++++ 2024/06/13/FHQ-Treap-md/index.html | 1087 +++++++++++++++ 2024/06/13/hash-md/index.html | 1083 +++++++++++++++ .../index.html" | 335 ++++- .../index.html" | 1059 ++++++++++++++ .../index.html" | 1057 ++++++++++++++ .../index.html" | 1084 +++++++++++++++ .../index.html" | 1122 +++++++++++++++ .../index.html" | 1058 ++++++++++++++ .../index.html" | 238 +++- .../index.html" | 1130 +++++++++++++++ .../index.html" | 1069 ++++++++++++++ .../index.html" | 280 +++- .../index.html" | 1060 ++++++++++++++ .../index.html" | 1089 +++++++++++++++ .../index.html" | 1057 ++++++++++++++ about/index.html | 229 ++- archives/2024/06/index.html | 505 ++++++- archives/2024/06/page/2/index.html | 1120 +++++++++++++++ archives/2024/index.html | 505 ++++++- archives/2024/page/2/index.html | 1120 +++++++++++++++ archives/index.html | 505 ++++++- archives/page/2/index.html | 1120 +++++++++++++++ atom.xml | 350 ++++- content.json | 2 +- index.html | 505 ++++++- page/2/index.html | 1225 +++++++++++++++++ tags/code/index.html | 385 +++++- 28 files changed, 22261 insertions(+), 183 deletions(-) create mode 100644 2024/06/13/2-SAT-md/index.html create mode 100644 2024/06/13/FHQ-Treap-md/index.html create mode 100644 2024/06/13/hash-md/index.html rename 2024/06/13/404-md/index.html => "2024/06/13/\344\270\200\350\210\254\345\220\257\345\217\221\345\274\217\345\220\210\345\271\266-md/index.html" (70%) create mode 100644 "2024/06/13/\344\274\227\346\225\260\344\272\214\350\277\233\345\210\266\346\213\206\345\210\206-md/index.html" create mode 100644 "2024/06/13/\345\233\276\344\270\212\344\272\214\345\210\206-md/index.html" create mode 100644 "2024/06/13/\345\267\256\345\210\206\347\272\246\346\235\237\347\263\273\347\273\237-md/index.html" create mode 100644 "2024/06/13/\346\216\222\345\210\227\344\270\216\347\273\204\345\220\210-md/index.html" create mode 100644 "2024/06/13/\346\225\264\351\231\244\345\210\206\345\235\227-md/index.html" create mode 100644 "2024/06/13/\346\240\221\345\236\213DP\345\222\214\347\274\251\347\202\271\345\220\216\346\240\221\345\236\213DP-md/index.html" create mode 100644 "2024/06/13/\346\240\271\345\217\267\347\256\227\346\263\225\347\233\270\345\205\263-md/index.html" rename 2024/06/13/hello-world/index.html => "2024/06/13/\347\237\251\351\230\265\344\271\230\346\263\225-md/index.html" (79%) create mode 100644 "2024/06/14/demogen-\345\256\271\346\226\245-md/index.html" create mode 100644 "2024/06/14/\344\270\200\344\272\233\345\244\247\350\277\220\347\256\227-md/index.html" create mode 100644 "2024/06/14/\346\211\251\345\261\225CRT-md/index.html" create mode 100644 archives/2024/06/page/2/index.html create mode 100644 archives/2024/page/2/index.html create mode 100644 archives/page/2/index.html create mode 100644 page/2/index.html diff --git a/2024/06/13/2-SAT-md/index.html b/2024/06/13/2-SAT-md/index.html new file mode 100644 index 0000000..51b0064 --- /dev/null +++ b/2024/06/13/2-SAT-md/index.html @@ -0,0 +1,1065 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 2-SAT.md · Cmach_socket's Blog + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+
+ +
+ +
+ + +
+ +
+
+ +
+ + + + + + + Cmach_socket's Blog + +
+ + + + + +
+ + + + + +
+
+ + + + + + +
+
+
+ +

+ + + 2-SAT.md + + +

+ +

+ + + + + +

+ + +
+ + +
+ + +
+ + + + +
+ 字数统计: 316阅读时长: 1 min +
+ +
+ + + 2024/06/13 + + + + + + + + + +
+
+ +
+
+ + + + +
+
+
+

思路类似于差分约束,将数学问题转化为图论问题

+

也是判环来判断可行性

+

建图+tarjan

+

为什么不用spfa判环?

+

tarjan算法更优秀 $O(n+m)$ ,并且tarjan序就是反拓扑序,方便求解

+

2-sat问题

指每一个变量存在两种状态(2),这些变量需要满足一些条件(sat)

+

这些条件是逻辑条件:or,xor,and

+

2-sat问题转化

所有的逻辑关系都可以转化为这样的形式:选择了A,则必须选择B

+

从A到B连一条边,就可以表示这样的关系

+

若存在环内有一个变量的两个状态,则说明有一个无法满足的依赖链(例如 选$A_1$必选$B_2$ …. 选
$B_2$必选$A_2$),这时选$A_1$也不行,选$A_2$也不行

+

2-sat的一种解:

选择拓扑序较大的那一个,可以避免冲突(如果选了较小的一个,有可能会有一条路径会连通这个
变量的两个状态)

+

tarjan使用了栈,与拓扑使用的队列是相反的,所以说tarjan强连通分量的顺序就是反拓扑序

+

update:2-sat是离线的,不能代替扩展域并查集

+ +
+ + + + + + + + +
+ + +
+ + +
+ + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+ + + +
+
+ + + + + + + + + + +
+ + + PV: :) + +
+ +
+ +
+ + +
+
+ CATALOG +
+
  1. 1. 2-sat问题
  2. 2. 2-sat问题转化
  3. 3. 2-sat的一种解:
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/2024/06/13/FHQ-Treap-md/index.html b/2024/06/13/FHQ-Treap-md/index.html new file mode 100644 index 0000000..3fa934e --- /dev/null +++ b/2024/06/13/FHQ-Treap-md/index.html @@ -0,0 +1,1087 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + FHQ-Treap.md · Cmach_socket's Blog + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+
+ +
+ +
+ + +
+ +
+
+ +
+ + + + + + + Cmach_socket's Blog + +
+ + + + + +
+ + + + + +
+
+ + + + + + +
+
+
+ +

+ + + FHQ-Treap.md + + +

+ +

+ + + + + +

+ + +
+ + +
+ + +
+ + + + +
+ 字数统计: 875阅读时长: 3 min +
+ +
+ + + 2024/06/13 + + + + + + + + + +
+
+ +
+
+ + + + +
+
+
+

依赖分裂合并的tree+heap(听起来像ODT)

+

核心操作:

分裂:

+

一种是按权值分裂,一种是按排名分裂

+

根据粉兔的博客,发现权值操作都可以通过rank转化为排名

+

于是乎只打排名了

+

当前需要的排名比左儿子数量大,即左子树和其本身归为第一颗分裂树,进入右子树

+

反之同理,上述过程可以用BST性质解释

+

通过BST的性质,也可以知道传下来的引用就是两颗子树预备插入节点

+

合并:

+

treap以随机化id来构造期望平衡的BST,合并的时候第一颗树的所有节点一定比第二颗树小,

+

于是合并时候只需考虑合并节点的 $id$

+

左子树 $id$ 小,将右子树挂载到右儿子下,右子树 $id$ 小,则将左子树挂载到右子树左儿子上,可以保证满足BST性质

+

通过这两个操作可以完成各种操作,并且本身支持区间(分裂出来就是一个一个一个区间啊啊啊啊啊啊啊)和可持续化。

+

基本操作:

查询x的排名 :

由于没有权值分裂,所以需要递归查找,通过BST的性质,每次递归进入一个子树

+

注意:这样查询是查询到$\leq v$的最末尾

+

插入 :

构建一个节点,然后查询权值所在排名,将树分裂成两颗,将这两颗树与节点合并

+

删除 :

将树分裂成$v,v-1$三颗,删除中间等于$v$的那棵

+

如果只删除一个的话,可以合并中间那棵的左右子树,将根节点丢掉

+

然后再合并起来

+

垃圾回收?不存在的()

+

第k小 :

直接分裂成$k,k-1$三颗子树,输出中间那棵,再全部合并起来

+

前驱 :

1
kth(rank(root,v-1))
+ +

后继 :

1
kth(rank(root,v)+1)
+ +

注意:后继不可以查询$rank(root,v+1)$,很可能后继比$v+1$大,rank又是查找到$<=v+1$的最末尾

+

由于前驱一定$\leq v-1$,所以可以直接查询$rank(root,v-1)$

+

注意事项:

查询一个数的排名一定要查询$rank(root,v-1)+1$,不然会查到相同元素的最末尾去

+

一些感受:

实际上,fhq-treap根本不是按照中序遍历排序的。这个中序遍历只是人为规定的。

+

真正决定二叉树形态的是随机值,但不是唯一决定的。

+

对于权值fhq-treap来说,权值也是确定二叉树形态的条件,

+

对于排名fhq-treap来说,排名也是确定二叉树形态的条件。

+

当用$rank()$函数决定位置fhq-treap来说,排名与权值绑定,也可以看作为权值确定,那么这样建的树不是说他由中序遍历决定算法而是由算法决定他中序遍历是排序后的序列

+

于是,可以得出,排名fhq-treap的建立只与$rank()$有关,没有$rank()$只与插入位置有关,也就是说,rank()也可以决定二叉树的形态,没有$rank()$就默认以位置决定二叉树形态,

+

所以,可能有这么一道题,他要维护一种非常特殊的序列,可能需要中间大两边小,或者说十进制位数单调递增,这些fhq-treap都是可以维护的

+ +
+ + + + + + + + +
+ + +
+ + +
+ + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+ + + +
+
+ + + + + + + + + + +
+ + + PV: :) + +
+ +
+ +
+ + +
+
+ CATALOG +
+
  1. 1. 核心操作:
  2. 2. 基本操作:
    1. 2.1. 查询x的排名 :
    2. 2.2. 插入 :
    3. 2.3. 删除 :
    4. 2.4. 第k小 :
    5. 2.5. 前驱 :
    6. 2.6. 后继 :
  3. 3. 注意事项:
  4. 4. 一些感受:
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/2024/06/13/hash-md/index.html b/2024/06/13/hash-md/index.html new file mode 100644 index 0000000..46b64d9 --- /dev/null +++ b/2024/06/13/hash-md/index.html @@ -0,0 +1,1083 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + hash.md · Cmach_socket's Blog + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+
+ +
+ +
+ + +
+ +
+
+ +
+ + + + + + + Cmach_socket's Blog + +
+ + + + + +
+ + + + + +
+
+ + + + + + +
+
+
+ +

+ + + hash.md + + +

+ +

+ + + + + +

+ + +
+ + +
+ + +
+ + + + +
+ 字数统计: 676阅读时长: 2 min +
+ +
+ + + 2024/06/13 + + + + + + + + + +
+
+ +
+
+ + + + +
+
+
+

单hash

定义了上面的两个数组,首先 hash[i] 表示前 i 个字符的字串的hash 值。而 p[i] 表示 $Base ^ i$ 

+

那么对应的 Hash 公式为:

+

$$hash[i] = (hash[i-1] * Base + idx(s[i])) % MOD$$

+

对于此种Hash方法,将Base和MOD尽量取大即可,这种情况下,冲突的概率是很低的。

+

双Hash

用字符串Hash,最怕的就是,出现冲突的情况,即不同字符串却有着相同的hash值,这是我们不想看到的。所以为了降低冲突的概率,可以用双Hash方法。

+

将一个字符串用不同的Base和MOD,hash两次,将这两个结果用一个二元组表示,作为一个总的Hash结果。

+

相当于我们用不同的Base和MOD,进行两次 单Hash方法 操作,然后将得到的结果,变成一个二元组结果,这样子,我们要看一个字符串,就要同时对比两个 Hash 值,这样子出现冲突的概率就很低了。

+

那么对应的 Hash 公式为:

+

$$hash1[i] = (hash1[i-1] * Base1 + idx(s[i])) % MOD1$$

+

$$hash2[i] = (hash2[i-1] * Base2 + idx(s[i])) % MOD2$$

+

映射的Hash结果为:$<hash1[i], hash2[i]>$

+

这种Hash很安全。

+

构造hash时的递推式:

+

$$hash[i] = hash[i-1] * Base + idx (s[i])$$

+

获取子串的Hash

$O(1)$

+

上面我们得到的 Hash值都是前 i 个字符的字串,那么如果我们想获取 [l,r] 范围中的字串的Hash值,应该如何做。(利用Hash值,我们可以O(1) 时间来获取某个字串。)

+

例子

假设有一个 $S = s_{1}s_{2}s_{3}s_{4}s_{5}$ 的字符串,根据定义,获取其 Hash值如下(先忽略MOD):

+

$hash[0] = 0$

+

$hash[1] = s_1$

+

$hash[2] = s_1 * Base + s2$

+

$hash[3] = s_1 * Base^2 + s2 * Base + s_3$

+

$hash[4] = s_1 * Base^3 + s2 * Base^2 + s_3 * Base + s_4$

+

$hash[5] = s_1 * Base^4 + s2 * Base^3 + s_3 * Base^2 + s_4 * Base + s_5$

+

现在我们想求字串 $s_3s_4$ 的hash值,不难得出为 $s_3 * Base + s4$ ,并且从上面观察,如果看$hash[4] - hash[2]$并将结果的多余$s_1,s_2$的系数全部消掉,就是所求。所以问题就转化成,将$hash[2]$乘一个关于$Base$的系数,在做差的时候将多余项消除,从而得到结果。

+

不难发现,对应项系数只差一个 $Base^2$ ,而$4 - 2 = 2$(待求hash子串下标相减即可),

+

$$hash[4] - hash[2] * Base^2$$

+

至此,通过对上例的归纳,可以得出如下的公式。

+

$$res = hash[r] - hash[l-1] * Base^{r - l + 1}$$

+

取模,但是有减法:

+

$$res = ((hash[r] - hash[l-1] * Base^{r - l + 1}) % MOD + MOD) % MOD$$

+

预处理$Base^i$,降低$Base$幂的计算

+ +
+ + +
+

原文作者:cmach_socket +

原文链接:http://cmach_socket.github.io/2024/06/13/hash-md/ +

发表日期:June 13th 2024, 10:41:16 pm +

更新日期:June 13th 2024, 10:41:18 pm +

版权声明:本文采用知识共享署名-非商业性使用 4.0 国际许可协议进行许可

+
+ + + + + +
+ + +
+ + +
+ + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+ + + +
+
+ + + + + + + + + + +
+ + + PV: :) + +
+ +
+ +
+ + +
+
+ CATALOG +
+
  1. 1. 单hash
    1. 1.1. 双Hash
  2. 2. 获取子串的Hash
    1. 2.1. 例子
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/2024/06/13/404-md/index.html "b/2024/06/13/\344\270\200\350\210\254\345\220\257\345\217\221\345\274\217\345\220\210\345\271\266-md/index.html" similarity index 70% rename from 2024/06/13/404-md/index.html rename to "2024/06/13/\344\270\200\350\210\254\345\220\257\345\217\221\345\274\217\345\220\210\345\271\266-md/index.html" index 842d03a..7851f34 100644 --- a/2024/06/13/404-md/index.html +++ "b/2024/06/13/\344\270\200\350\210\254\345\220\257\345\217\221\345\274\217\345\220\210\345\271\266-md/index.html" @@ -19,22 +19,23 @@ - + - - + + - + - - + + + - [404] · Cmach_socket's Blog + 一般启发式合并.md · Cmach_socket's Blog - [404] + 一般启发式合并.md @@ -331,13 +332,15 @@

+ +
- 字数统计: 0阅读时长: 1 min + 字数统计: 43阅读时长: 1 min
@@ -496,7 +499,88 @@

- +
+
+

启发式合并就是在合并的时候将size小的那个集合合并到size大的那个集合里面。

+

复杂度居然是$O(n log n)$的

+ +
+ + + + + + + + +
+ + +
+ + +
+ + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
@@ -634,7 +718,150 @@

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -649,7 +876,7 @@

diff --git "a/2024/06/13/\344\274\227\346\225\260\344\272\214\350\277\233\345\210\266\346\213\206\345\210\206-md/index.html" "b/2024/06/13/\344\274\227\346\225\260\344\272\214\350\277\233\345\210\266\346\213\206\345\210\206-md/index.html" new file mode 100644 index 0000000..d4eb16d --- /dev/null +++ "b/2024/06/13/\344\274\227\346\225\260\344\272\214\350\277\233\345\210\266\346\213\206\345\210\206-md/index.html" @@ -0,0 +1,1059 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 众数二进制拆分.md · Cmach_socket's Blog + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+
+ +
+ +
+ + +
+ +
+
+ +
+ + + + + + + Cmach_socket's Blog + +
+ + + + + +
+ + +
+ + +
+ + +
+
+ + + + + + +
+
+
+ +

+ + + 众数二进制拆分.md + + +

+ +

+ + + + + +

+ + +
+ + +
+ + + + +
+ + + + +
+ 字数统计: 133阅读时长: 1 min +
+ +
+ + + 2024/06/13 + + + + + + + + + +
+
+ +
+
+ + + + +
+
+
+

这个方法就是 二进制拆分。

+

对于一个众数,因为它在原序列中的出现次数超过了一半,那么 对于每一个二进制位来说,众数在这一位上对应的值也超过了一半。

+

简要复述一下该方法:对于一个序列 $a$,对于每个二进制位 $b$,求有多少个数该位是 $1$,记作 $cntb$​。

+

存在绝对众数 $m$ 时,如果 $m$ 某一位是 $1$,那么 $cntb$​ 一定过半,反则一定不过半。

+ +
+ + + + + + + + +
+ + +
+ + +
+ + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+ + + +
+
+ + + + + + + + + + +
+ + + PV: :) + +
+ +
+ +
+ + +
+
+ CATALOG +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git "a/2024/06/13/\345\233\276\344\270\212\344\272\214\345\210\206-md/index.html" "b/2024/06/13/\345\233\276\344\270\212\344\272\214\345\210\206-md/index.html" new file mode 100644 index 0000000..241028d --- /dev/null +++ "b/2024/06/13/\345\233\276\344\270\212\344\272\214\345\210\206-md/index.html" @@ -0,0 +1,1057 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 图上二分.md · Cmach_socket's Blog + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+
+ +
+ +
+ + +
+ +
+
+ +
+ + + + + + + Cmach_socket's Blog + +
+ + + + + +
+ + +
+ + +
+ + +
+
+ + + + + + +
+
+
+ +

+ + + 图上二分.md + + +

+ +

+ + + + + +

+ + +
+ + +
+ + +
+ + + + +
+ 字数统计: 85阅读时长: 1 min +
+ +
+ + + 2024/06/13 + + + + + + + + + +
+
+ +
+
+ + + + +
+
+
+

一般是二分边或者点的权值。属于二分答案

+

设 $check$ 为检测值,

+

当 $it.w>check$ 或者 $a[it.y]>check$ 时,走或者不走

+

用于解决最大值最小或者最小值最大的问题。

+

二分正确性:答案在边权或者点权的值域上,值域是单调的

+ +
+ + + + + + + + +
+ + +
+ + +
+ + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+ + + +
+
+ + + + + + + + + + +
+ + + PV: :) + +
+ +
+ +
+ + +
+
+ CATALOG +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git "a/2024/06/13/\345\267\256\345\210\206\347\272\246\346\235\237\347\263\273\347\273\237-md/index.html" "b/2024/06/13/\345\267\256\345\210\206\347\272\246\346\235\237\347\263\273\347\273\237-md/index.html" new file mode 100644 index 0000000..2a43745 --- /dev/null +++ "b/2024/06/13/\345\267\256\345\210\206\347\272\246\346\235\237\347\263\273\347\273\237-md/index.html" @@ -0,0 +1,1084 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 差分约束系统.md · Cmach_socket's Blog + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+
+ +
+ +
+ + +
+ +
+
+ +
+ + + + + + + Cmach_socket's Blog + +
+ + + + + +
+ + +
+ + +
+ + +
+
+ + + + + + +
+
+
+ +

+ + + 差分约束系统.md + + +

+ +

+ + + + + +

+ + +
+ + +
+ + +
+ + + + +
+ 字数统计: 419阅读时长: 1 min +
+ +
+ + + 2024/06/13 + + + + + + + + + +
+
+ +
+
+ + + + +
+
+
+

差分约束系统


+

$x_1-x_2 \leq y_1$

+

+

$x_i-x_j \leq y_i$

+

将$x_i-xj \leq y_i$ 移项,得

+

$x_i \leq x_j+y_i$

+

可建立一条从$x_j$到$x_i$的路径,权值为$y_2$

+

将线性规划问题转化为图论问题

+
+

差分约束系统的转化:

    +
  • $x_1-x_2 \geq y \to x_2-x_1 \leq -y_1$

    +
  • +
  • $x_1 = x_2 \to x_1-x_2 \leq 0 \quad and \quad x_2-x_1 \leq 0$

    +
  • +
  • $x_1 - x_2 < y \to x_1-x_2 \leq y-1$ (整数解)

    +
  • +
  • $x_1-x_2>y \to x_2-x_1 \leq -y-1$ (整数解)

    +
  • +
+

对于差分约束系统,有解就必定有无数解

+

证明:

+

若 存在一组解 ${x_1,x_2,x_3,…,x_{n-1},x_n}$

+

则 ${x_1+k,x_2+k,x_3+k,…,x_{n-1}+k,x_n+k}$ 也是该差分约束系统的解

+

无解的情况即存在负权环,因为此时SPFA无解

+

启用超级源点 $0$ ,设置$dis_0=w$,向所有节点添加边为 $x_i-x_0 \leq 0 (i|n)$

+

由于$dis_0=w$,则$x_0=w$ (一般设$w=0$);

+

对于所有的 $x_i,x_i \leq x_0$ 即 $x_i \leq w$

+

相应地加上$k$ ,即得到非负解

+

求最短路,相当于求最大解

+

求最长路,相当于求最小解

+

注意:求最长路,要转化为$x_1 \geq x_2+y$的形式

+

一些理解:

观察这个式子:$x1 \leq x2+y1$,发现如果按图论来说,从$x2$点到$x1$点最多需要走$y1$的路的,如果从$x2$点到$x1$点建立一条长$y1$的路,多的远路不能走,但是少的远路能走,这就构成了最短路算法的松弛基础。于是乎才能使用最短路去求解的。反之最长路就是多的远路能走,短远路不能走,所以是$x_1 \geq x_2+y$

+ +
+ + + + + + + + +
+ + +
+ + +
+ + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+ + + +
+
+ + + + + + + + + + +
+ + + PV: :) + +
+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git "a/2024/06/13/\346\216\222\345\210\227\344\270\216\347\273\204\345\220\210-md/index.html" "b/2024/06/13/\346\216\222\345\210\227\344\270\216\347\273\204\345\220\210-md/index.html" new file mode 100644 index 0000000..bf06c57 --- /dev/null +++ "b/2024/06/13/\346\216\222\345\210\227\344\270\216\347\273\204\345\220\210-md/index.html" @@ -0,0 +1,1122 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 排列与组合.md · Cmach_socket's Blog + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+
+ +
+ +
+ + +
+ +
+
+ +
+ + + + + + + Cmach_socket's Blog + +
+ + + + + +
+ + +
+ + +
+ + +
+
+ + + + + + +
+
+
+ +

+ + + 排列与组合.md + + +

+ +

+ + + + + +

+ + +
+ + +
+ + + + +
+ + + + +
+ 字数统计: 891阅读时长: 3 min +
+ +
+ + + 2024/06/13 + + + + + + + + + +
+
+ +
+
+ + + + +
+
+
+

排列:

从集合{a,b,c}中取2个元素的排列有ab,ac,ba,bc,ca,cb

+

换言之,元素顺序对于排列是有影响的

+

考虑当前排列,第一个位置有N个选择,第二个位置去除第一个还有N-1种选择,以此类推到第M个还有N-M+1个选择

+

可以得到公式

+

$$A_{N}^{M} = \prod_{i=0}^{m-1}(n-i) = \frac{\prod_{i=1}^{n}i}{\prod_{j=1}^{n-m}j}$$
前面n-m是不乘的,后面有m个
转化一下:
$$A_{N}^{M} = \frac{n!}{(n-m)!}$$

+

组合:

从集合${A,b,c}$中取$2$个元素的组合有${a,b},{a,c},{b,c}$
换言之,元素顺序对于排列无影响

+
    +
  • 公式推导:

    +

    对于排列A中每一个排列,它具有相同元素的不同排列总共有N!个

    +
      +
    • 证明:

      +

      相当于从N中选取N个元素,即
      $$A_{N}^{N}=\frac{n!}{(n-n)!}=n!$$

      +
    • +
    +

    所以可以得到公式:
    $$C_{N}^{M}=A_{N}^{M}/m!$$
    $$C_{N}^{M}=\frac{n!}{m!(n-m)!}$$

    +
  • +
  • 性质:
    $$C_{N}^{M}=C_{N}^{N-M}$$

    +
  • +
+

最好的预处理方式:

+
1
2
3
4
5
6
7
8
c[1][0]=c[1][1]=c[0][0]=1;
for(int i=2;i<=mn;i++){
c[i][0]=1;
for(int j=1;j<=i;j++){
c[i][j]=(c[i-1][j]+c[i-1][j-1])%k;
if(!c[i][j])s[i][j]++;
}
}
+

前缀和要加上

+
1
s[i][i+1]=s[i][i];
+

因为三角形

+
1
s[i-1][j]
+

为$0$

+

$$C^M_N=C^{N-M}_N$$

+
    +
  • 证明:

    +

    将原本的每个组合都反转,把原来没选的选上,原来选了的去掉,这样就变成从n个元素种取出n−m个元素,显然方案数是相等的。

    +
  • +
+

$$C_{N}^{M}=C_{N-1}^{M}+C_{N-1}^{M-1}$$

+
    +
  • 证明:

    +

    可理解为:含特定元素的组合有$C_{N-1}^{M-1}$,不含特定元素的排列为$C_{N-1}^{M}$。

    +

    第一个:由于必选这个元素,看作可以把这个元素去掉的排列$(M-1)$,剩下有$(N-1)$个元素可选

    +

    第二个: 去掉这个元素,剩下$C_{N-1}^{M}$种组合

    +
  • +
+

$$ 2^n = \sum_{i=1}^{n}C_{n}^{i} $$

+

相当于从n个球中随便抽出几个球,问可能的组合有多少

+

对于每个球,有选和不选两种状态,根据乘法原理,总共有$2 \times 2 \times…\times 2 \quad (n个2)$种取法,即$2^n$

+

第二类斯特林数

1.定义

第二类斯特林数 表示的是把 $n$ 个不同的元素划分到 $m$ 个集合的方案数。

+

2.递推式

考虑元素的编号是 $1$ 到 $n$ ,那么这 $n$ 个元素排成 $m$ 个集合有两种情况,我们考虑第 $n$ 个元素:

+

第 $n-1$ 个元素单独形成一个新的集合,显然方案数是 $S_2(n-1,m-1)$ 。

+

第 $n$ 个元素在之前已经形成的集合中,显然有 $m$ 种方法可以选,方案数是 $m \times S_2(n-1,m)$ 。

+

综上我们可以得到

+

$$S_2(n,m)=S_2(n-1,m-1)+m \times S_2(n-1,m)$$

+

我们也可以得到边界条件:

+
    +
  • $S_2(n,n)=1 (n \geq 0)$
  • +
+

表示 $n$ 个球和 $n$ 个盒子

+
    +
  • $S_2(n,0)=0 (n \geq 1)$
  • +
+

表示没有盒子

+

3.应用举例

第二类斯特林数主要是用于解决组合数学中的放球模型

+
    +
  1. $n$ 个不同的球放到 $m$ 个无区别的盒子,不允许盒子为空
  2. +
+

$$S_2(n,m)$$

+
    +
  1. $n$ 个不同的球放到 $m$ 个有区别的盒子,不允许盒子为空
  2. +
+

$$m! \times S_2(n,m) $$

+ +
+ + + + + + + + +
+ + +
+ + +
+ + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+ + + +
+
+ + + + + + + + + + +
+ + + PV: :) + +
+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git "a/2024/06/13/\346\225\264\351\231\244\345\210\206\345\235\227-md/index.html" "b/2024/06/13/\346\225\264\351\231\244\345\210\206\345\235\227-md/index.html" new file mode 100644 index 0000000..0894ca6 --- /dev/null +++ "b/2024/06/13/\346\225\264\351\231\244\345\210\206\345\235\227-md/index.html" @@ -0,0 +1,1058 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 整除分块.md · Cmach_socket's Blog + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+
+ +
+ +
+ + +
+ +
+
+ +
+ + + + + + + Cmach_socket's Blog + +
+ + + + + +
+ + +
+ + +
+ + +
+
+ + + + + + +
+
+
+ +

+ + + 整除分块.md + + +

+ +

+ + + + + +

+ + +
+ + +
+ + +
+ + + + +
+ 字数统计: 83阅读时长: 1 min +
+ +
+ + + 2024/06/13 + + + + + + + + + +
+
+ +
+
+ + + + +
+
+
+

数论分块结论
对于常数 n,使得式子

+

$$\left\lfloor\dfrac ni\right\rfloor=\left\lfloor\dfrac nj\right\rfloor$$

+

成立的最大的满足 $i\leq j\leq n$ 的 $j$ 的值为 $\left\lfloor\dfrac n{\lfloor\frac ni\rfloor}\right\rfloor$。

+

即值

+

$$\left\lfloor\dfrac ni\right\rfloor$$
所在的块的右端点为

+

$$\left\lfloor\dfrac n{\lfloor\frac ni\rfloor}\right\rfloor$$

+ +
+ + + + + + + + +
+ + +
+ + +
+ + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+ + + +
+
+ + + + + + + + + + +
+ + + PV: :) + +
+ +
+ +
+ + +
+
+ CATALOG +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git "a/2024/06/13/\346\240\221\345\210\206\346\262\273\347\233\270\345\205\263/index.html" "b/2024/06/13/\346\240\221\345\210\206\346\262\273\347\233\270\345\205\263/index.html" index 34243c2..6910ada 100644 --- "a/2024/06/13/\346\240\221\345\210\206\346\262\273\347\233\270\345\205\263/index.html" +++ "b/2024/06/13/\346\240\221\345\210\206\346\262\273\347\233\270\345\205\263/index.html" @@ -567,18 +567,13 @@

Next Post
-
-
[404]
+
+
一般启发式合并.md
@@ -780,7 +775,150 @@

- Total : 3 + Total : 16
@@ -810,21 +948,99 @@

+
  • + + demogen/容斥.md +
  • + + +
  • + + 一些大运算.md +
  • + + +
  • + + 扩展CRT.md +
  • + +
  • - [404] + 2-SAT.md
  • - 树分治相关 + FHQ-Treap.md +
  • + + +
  • + + hash.md +
  • + + +
  • + + 一般启发式合并.md +
  • + + +
  • + + 众数二进制拆分.md +
  • + + +
  • + + 图上二分.md +
  • + + +
  • + + 差分约束系统.md
  • - Hello World + 排列与组合.md +
  • + + +
  • + + 整除分块.md +
  • + + +
  • + + 树型DP和缩点后树型DP.md +
  • + + +
  • + + 根号算法相关.md +
  • + + +
  • + + 矩阵乘法.md +
  • + + +
  • + + 树分治相关
  • diff --git "a/2024/06/13/\346\240\221\345\236\213DP\345\222\214\347\274\251\347\202\271\345\220\216\346\240\221\345\236\213DP-md/index.html" "b/2024/06/13/\346\240\221\345\236\213DP\345\222\214\347\274\251\347\202\271\345\220\216\346\240\221\345\236\213DP-md/index.html" new file mode 100644 index 0000000..cb379f1 --- /dev/null +++ "b/2024/06/13/\346\240\221\345\236\213DP\345\222\214\347\274\251\347\202\271\345\220\216\346\240\221\345\236\213DP-md/index.html" @@ -0,0 +1,1130 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 树型DP和缩点后树型DP.md · Cmach_socket's Blog + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    +
    +
    + +
    + +
    + + +
    + +
    +
    + +
    + + + + + + + Cmach_socket's Blog + +
    + + + + + +
    + + +
    + + +
    + + +
    +
    + + + + + + +
    +
    +
    + +

    + + + 树型DP和缩点后树型DP.md + + +

    + +

    + + + + + +

    + + +
    + + +
    + + +
    + + + + +
    + 字数统计: 2.2k阅读时长: 10 min +
    + +
    + + + 2024/06/13 + + + + + + + + + +
    +
    + +
    +
    + + + + +
    +
    +
    +

    基本的方程:

    +

    $f[u]=\sum_{v \in son(u)}f[v]+calc(v)$

    +

    $f[u]=\max_{v \in son(u)}f[v]+calc(v)$

    +

    [CTSC1997] 选课

    题目描述

    在大学里每个学生,为了达到一定的学分,必须从很多课程里选择一些课程来学习,在课程里有些课程必须在某些课程之前学习,如高等数学总是在其它课程之前学习。现在有 $N$ 门功课,每门课有个学分,每门课有一门或没有直接先修课(若课程 a 是课程 b 的先修课即只有学完了课程 a,才能学习课程 b)。一个学生要从这些课程里选择 $M$ 门课程学习,问他能获得的最大学分是多少?

    +

    输入格式

    第一行有两个整数 $N$ , $M$ 用空格隔开。( $1 \leq N \leq 300$ , $1 \leq M \leq 300$ )

    +

    接下来的 $N$ 行,第 $I+1$ 行包含两个整数 $k_i $和 $s_i$, $k_i$ 表示第I门课的直接先修课,$s_i$ 表示第I门课的学分。若 $k_i=0$ 表示没有直接先修课($1 \leq {k_i} \leq N$ , $1 \leq {s_i} \leq 20$)。

    +

    输出格式

    只有一行,选 $M$ 门课程的最大得分。

    +

    样例 #1

    样例输入 #1

    1
    2
    3
    4
    5
    6
    7
    8
    7  4
    2 2
    0 1
    0 4
    2 1
    7 1
    7 6
    2 2
    + +

    样例输出 #1

    1
    13
    +

    $f[u][i]=max^{n}_{i=1}f[u][i-j]+f[v][j]$

    +
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    #include<stdio.h>
    #include<algorithm>
    #include<list>
    #define MAXN 305
    using namespace std;
    list<int>g[MAXN];
    int tx,tw,ty,n,m,a[MAXN],siz[MAXN],f[MAXN][MAXN];
    void dfs(int x){
    siz[x]=1,f[x][1]=a[x];
    for(auto it:g[x]){
    dfs(it);
    siz[x]+=siz[it];
    }
    }
    inline void solve(int x){
    for(auto it:g[x]){
    solve(it);
    for(int i=min(siz[x],m+1);i>=0;i--){
    for(int j=min(siz[it],i-1);j>=0;j--){
    f[x][i]=max(f[x][i],f[x][i-j]+f[it][j]);
    }
    }
    }
    }
    inline void link(int x,int y){
    g[x].emplace_back(y);
    }
    int main(){
    scanf("%d%d",&n,&m);
    for(int i=1;i<=n;i++){
    scanf("%d%d",&ty,&a[i]);
    link(ty,i);
    }
    dfs(0);
    solve(0);
    printf("%d",f[0][m+1]);
    return 0;
    }
    +

    强连通分量的缩点

      +
    • 将非DAG图处理为DAG

      +
    • +
    • 可以跑拓扑排序和一些其他的算法

      +
    • +
    +

    局限性:
    不可以缩有效性的环

    +

    采蘑菇

    题目描述

    小胖和 ZYR 要去 ESQMS 森林采蘑菇。

    +

    ESQMS 森林间有 $N$ 个小树丛,$M$ 条小径,每条小径都是 单向 的,连接两个小树丛,上面都有一定数量的蘑菇。小胖和 ZYR 经过某条小径一次,可以采走这条路上所有的蘑菇。由于 ESQMS 森林是一片神奇的沃土,所以一条路上的蘑菇被采过后,又会长出一些新的蘑菇,数量为原来蘑菇的数量乘上这条路的“恢复系数”,再下取整。

    +

    比如,一条路上有 $4$ 个蘑菇,这条路的“恢复系数”为 $0.7$,则第一~四次经过这条路径所能采到的蘑菇数量分别为 $4,2,1,0$。

    +

    现在,小胖和 ZYR 从 $S$ 号小树丛出发,求他们最多能采到多少蘑菇。

    +

    输入格式

    第一行两个整数,$N$ 和 $M$。

    +

    第二行到第 $M+1$ 行,每行四个数,分别表示一条小路的起点,终点,初始蘑菇数,恢复系数。

    +

    第 $M+2$ 行,一个整数 $S$。

    +

    输出格式

    一行一个整数,表示最多能采到多少蘑菇,保证答案不超过 $(2^{31}-1)$。

    +

    样例 #1

    样例输入 #1

    1
    2
    3
    4
    5
    3 3
    1 2 4 0.5
    1 3 7 0.1
    2 3 4 0.6
    1
    + +

    样例输出 #1

    1
    8
    + +

    提示

    对于 $30%$ 的数据,$N\le 7$,$M\le15$

    +

    另有 $30%$ 的数据,满足所有“恢复系数”为 $0$。

    +

    对于 $100%$ 的数据,$1
    \le N\le 8\times 10^4$,$1\le M\le 2\times 10^5$,$0\le\text{恢复系数}\le 0.8$ 且最多有一位小数, $1\le S\le N$。

    +

    $f[u]=a[u]+max_{i=1}^{n}f[v]+it.w$

    +
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87

    #include<stdio.h>
    #include<list>
    #include<stack>
    #include<algorithm>
    #define MAXN 200005
    #define PPP puts("FUCK");
    using namespace std;
    class node{
    public:
    int y,w;
    node(int yy,int ww){
    y=yy,w=ww;
    }
    };
    list<int>g[MAXN];
    list<node>ng[MAXN];
    stack<int>st;
    int xs[MAXN];
    long double h;
    int e[MAXN],a[MAXN],n,m,tx,low[MAXN],dfn[MAXN],cnt,tot,bel[MAXN],f[MAXN],s,dp[MAXN];
    bool vis[MAXN],v[MAXN];
    void tarjan(int x){
    low[x]=dfn[x]=++cnt;
    st.push(x);
    vis[x]=1;
    for(auto it:g[x]){
    if(!dfn[e[it]]){
    tarjan(e[it]);
    low[x]=min(low[e[it]],low[x]);
    }
    else if(vis[e[it]]){
    low[x]=min(dfn[e[it]],low[x]);
    }
    }
    if(dfn[x]==low[x]){
    int now;
    tot++;
    do{
    now=st.top();
    st.pop();
    vis[now]=0;
    bel[now]=tot;
    }while(x!=now);
    }
    }//强连通分量
    inline void mkmap(){
    for(int i=1;i<=n;i++){
    for(auto it:g[i]){
    if(bel[i]==bel[e[it]]){
    while(a[it]){
    /// PPP
    f[bel[i]]+=a[it];
    a[it]=a[it]*xs[it]/10;
    }
    }
    else{
    ng[bel[i]].emplace_back(node(bel[e[it]],a[it]));
    }
    }
    }
    }//重建图
    inline void dfs(int x){
    v[x]=1;
    for(auto it:ng[x]){
    if(!v[it.y]){
    dfs(it.y);
    }
    dp[x]=max(dp[x],dp[it.y]+it.w);
    }
    dp[x]+=f[x];
    }//DP
    int main(){
    scanf("%d%d",&n,&m);
    for(int i=1;i<=m;i++){
    scanf("%d%d%d%Lf",&tx,&e[i],&a[i],&h);
    g[tx].emplace_back(i);
    xs[i]=h*10;
    }
    scanf("%d",&s);
    for(int i=1;i<=n;i++)if(!dfn[i])tarjan(i);
    mkmap();
    dfs(bel[s]);
    printf("%d",dp[bel[s]]);
    return 0;
    }

    + +

    缩点后树型DP注意事项:

    1.无环

    +

    2.无后效性

    +

    [JSOI2010]连通数

    题目背景

    本题数据过水,可前往 https://www.luogu.com.cn/problem/U143178 提交

    +

    $\text{upd 2022.8.4}$:已作为 Hack 数据合并进来。

    +

    题目描述

    度量一个有向图连通情况的一个指标是连通数,指图中可达顶点对个的个数。

    +

    如图

    +

    qwq

    +

    顶点 $1$ 可达 $1, 2, 3, 4, 5$

    +

    顶点 $2$ 可达 $2, 3, 4, 5$

    +

    顶点 $3$ 可达 $3, 4, 5$

    +

    顶点 $4, 5$ 都只能到达自身。

    +

    所以这张图的连通数为 $14$。

    +

    给定一张图,请你求出它的连通数

    +

    输入格式

    输入数据第一行是图顶点的数量,一个正整数 $N$。
    接下来 $N$ 行,每行 $N$ 个字符。第 $i$ 行第 $j$ 列的 1 表示顶点 $i$ 到 $j$ 有边,0 则表示无边。

    +

    输出格式

    输出一行一个整数,表示该图的连通数。

    +

    样例 #1

    样例输入 #1

    1
    2
    3
    4
    3
    010
    001
    100
    + +

    样例输出 #1

    1
    9
    + +

    提示

    对于 $100 %$ 的数据,$1 \le N \le 2000$。

    +

    u,i

    +

    =1

    +

    =0

    +

    $f[u][i]=f[v][i] or f[u][i]$

    +

    1 01 010 01 01

    +

    bitset 1/8

    +
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98

    #include<stdio.h>
    #include<algorithm>
    #include<stack>
    #include<list>
    #include<iostream>
    #include<string>
    #include<bitset>
    #define MAXN 2005
    #define PPP puts("GUCK");
    using namespace std;
    list<int>g[MAXN];
    list<int>ng[MAXN];
    stack<int>st;
    int n,m,ans,tx,tot,dfn[MAXN],low[MAXN],cnt,f[MAXN],bel[MAXN],in[MAXN];
    string s;
    bool vis[MAXN],v[MAXN];
    bitset<MAXN>dp[MAXN];
    inline void link(int x,int y){
    g[x].emplace_back(y);
    }
    inline void tarjan(int x){
    low[x]=dfn[x]=++cnt;
    st.push(x);
    vis[x]=1;
    for(auto it:g[x]){
    if(!dfn[it]){
    tarjan(it);
    low[x]=min(low[x],low[it]);
    }
    else if(vis[it]){
    low[x]=min(low[x],dfn[it]);
    }
    }
    if(low[x]==dfn[x]){
    int now;
    tot++;
    dp[tot][tot]=1;
    do{
    now=st.top();
    vis[now]=0;
    st.pop();
    bel[now]=tot;
    f[tot]++;
    }while(x!=now);
    }
    }
    inline void mkmap(){
    for(int i=1;i<=n;i++){
    for(auto it:g[i]){
    if(bel[i]!=bel[it]){
    dp[bel[i]][bel[it]]=1;
    ng[bel[i]].emplace_back(bel[it]);
    in[bel[it]]++;
    // printf("%d %d %d %d %d %d %d\n",i,it,bel[i],bel[it],in[bel[i]],in[bel[it]],bel[it]);
    }
    }
    }
    }
    inline void dfs(int x){
    v[x]=1;
    //dp[x]=f[x];
    //printf("%d %d df\n",dp[x],x);
    for(auto it:ng[x]){
    if(!v[it])dfs(it);
    dp[x]|=dp[it];
    }
    }
    int main(){
    scanf("%d",&n);
    for(int i=1;i<=n;i++){
    cin>>s;
    for(int j=0;j<s.size();j++){
    if(s[j]=='1'){
    //printf("%d %d %d dfdd\n",s[j],i,j+1);
    link(i,j+1);
    }
    }
    // link(i,i);
    }
    for(int i=1;i<=n;i++)if(!dfn[i])tarjan(i);
    mkmap();
    for(int i=1;i<=tot;i++){
    // printf("%d \n",in[i]);
    if(!in[i]){
    dfs(i);
    }
    }
    for(int i=1;i<=tot;i++){
    for(int j=1;j<=tot;j++){
    if(dp[i][j])
    ans+=f[i]*f[j];//printf("%d %d %d\n",i,j,ans);
    }
    }
    printf("%d",ans);
    return 0;
    }

    + +

    总结一下:

    适用:

    有环有向图,同时环内的贡献是一致的

    +

    优点:

      +
    • 将非DAG图处理为DAG

      +
    • +
    • 可以跑拓扑排序和一些其他的算法

      +
    • +
    +

    局限性:

      +
    • 不可以缩有效性的环
    • +
    • 不可以跑有后效性的DAG图
    • +
    + +
    + + + + + + + + +
    + + +
    + + +
    + + + + + + + + + + + + + + + + + + + + +
    + + + + + + +
    + + + +
    +
    + + + + + + + + + + +
    + + + PV: :) + +
    + +
    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git "a/2024/06/13/\346\240\271\345\217\267\347\256\227\346\263\225\347\233\270\345\205\263-md/index.html" "b/2024/06/13/\346\240\271\345\217\267\347\256\227\346\263\225\347\233\270\345\205\263-md/index.html" new file mode 100644 index 0000000..445a59a --- /dev/null +++ "b/2024/06/13/\346\240\271\345\217\267\347\256\227\346\263\225\347\233\270\345\205\263-md/index.html" @@ -0,0 +1,1069 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 根号算法相关.md · Cmach_socket's Blog + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    +
    +
    + +
    + +
    + + +
    + +
    +
    + +
    + + + + + + + Cmach_socket's Blog + +
    + + + + + +
    + + +
    + + +
    + + +
    +
    + + + + + + +
    +
    +
    + +

    + + + 根号算法相关.md + + +

    + +

    + + + + + +

    + + +
    + + +
    + + + + +
    + + + + +
    + 字数统计: 475阅读时长: 1 min +
    + +
    + + + 2024/06/13 + + + + + + + + + +
    +
    + +
    +
    + + + + +
    +
    +
    +

    分块相关

    分块

    思想简单,题目复杂。

    +

    根号分治

    根号算法——不只是分块。

    +

    有时我们会碰到这样一类问题,长度为$n$的序列,$m$
    个询问(通常$n$和$m$同阶),可能存在两种比较显然的方法,一种是$O(n^2)$预处理$O(1)$
    回答,一种是不预处理$O(n)$回答$m$个询问,这两种方法都是$O(n^2)$的。考虑是否存在一种策略能“平衡”一下预处理和询问的复杂度。

    +

    莫队相关:

    莫队

    never gonna give you up

    +

    不是将询问分成 $\sqrt{q}$块,而是把询问的 $l$ 分成$\sqrt{n}$块,保证每次l的变化在$\sqrt{n}$内

    +

    通过奇偶性排序,单数块r正序排序,偶数块r倒序排序,可以进一步优化复杂度,r指针来回扫嘛

    +

    注意:

    +

    在$del()$和$add()$时记得判断是先操作再变化还是先变化再操作

    +

    栗子:

    +
    1
    2
    3
    4
      	while(l<q[i].l)del(a[l++]);
    while(l>q[i].l)add(a[--l]);
    while(r<q[i].r)add(a[++r]);
    while(r>q[i].r)del(a[r--]);
    + +

    回滚莫队

    有些题目在区间转移时,可能会出现增加或者删除无法实现的问题。在只有增加不可实现或者只有删除不可实现的时候,就可以使用回滚莫队在 $O(n \sqrt m)$ 的时间内解决问题。回滚莫队的核心思想就是:既然只能实现一个操作,那么就只使用一个操作,剩下的交给回滚解决。

    +

    一般可以直接暴力记录下在块头的状态。

    +

    莫队套分块

    莫队询问通常是 $O(1)$ 的,如果移动指针查询要带 $log$ ,可以差分操作将查询变成单点,询问变成区间。通过分块来完成复杂度平衡。

    + +
    + + + + + + + + +
    + + +
    + + +
    + + + + + + + + + + + + + + + + + + + + +
    + + + + + + +
    + + + +
    +
    + + + + + + + + + + +
    + + + PV: :) + +
    + +
    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/2024/06/13/hello-world/index.html "b/2024/06/13/\347\237\251\351\230\265\344\271\230\346\263\225-md/index.html" similarity index 79% rename from 2024/06/13/hello-world/index.html rename to "2024/06/13/\347\237\251\351\230\265\344\271\230\346\263\225-md/index.html" index 79fc03a..c834f32 100644 --- a/2024/06/13/hello-world/index.html +++ "b/2024/06/13/\347\237\251\351\230\265\344\271\230\346\263\225-md/index.html" @@ -19,22 +19,22 @@ - + - - + + - + - - + + - Hello World · Cmach_socket's Blog + 矩阵乘法.md · Cmach_socket's Blog - Hello World + 矩阵乘法.md

    @@ -337,7 +337,7 @@

    - 字数统计: 75阅读时长: 1 min + 字数统计: 17阅读时长: 1 min
    @@ -498,28 +498,16 @@

    -

    Welcome to Hexo! This is your very first post. Check documentation for more info. If you get any problems when using Hexo, you can find the answer in troubleshooting or you can ask me on GitHub.

    -

    Quick Start

    Create a new post

    1
    $ hexo new "My New Post"
    - -

    More info: Writing

    -

    Run server

    1
    $ hexo server
    - -

    More info: Server

    -

    Generate static files

    1
    $ hexo generate
    - -

    More info: Generating

    -

    Deploy to remote sites

    1
    $ hexo deploy
    - -

    More info: Deployment

    +

    $A_{i,j}=c$ 表示 将$c$倍$f_{j}$转移到$f_{i}$

    @@ -528,13 +516,18 @@

    Next Post
    -
    -
    树分治相关
    +
    +
    hash.md
    @@ -692,7 +685,7 @@

    CATALOG

    -
    1. 1. Quick Start
      1. 1.1. Create a new post
      2. 1.2. Run server
      3. 1.3. Generate static files
      4. 1.4. Deploy to remote sites
    +

    @@ -721,7 +714,150 @@

    - Total : 3 + Total : 16
    @@ -751,21 +887,99 @@

    +
  • + + demogen/容斥.md +
  • + + +
  • + + 一些大运算.md +
  • + + +
  • + + 扩展CRT.md +
  • + +
  • - [404] + 2-SAT.md
  • - 树分治相关 + FHQ-Treap.md +
  • + + +
  • + + hash.md +
  • + + +
  • + + 一般启发式合并.md +
  • + + +
  • + + 众数二进制拆分.md +
  • + + +
  • + + 图上二分.md +
  • + + +
  • + + 差分约束系统.md
  • - Hello World + 排列与组合.md +
  • + + +
  • + + 整除分块.md +
  • + + +
  • + + 树型DP和缩点后树型DP.md +
  • + + +
  • + + 根号算法相关.md +
  • + + +
  • + + 矩阵乘法.md +
  • + + +
  • + + 树分治相关
  • diff --git "a/2024/06/14/demogen-\345\256\271\346\226\245-md/index.html" "b/2024/06/14/demogen-\345\256\271\346\226\245-md/index.html" new file mode 100644 index 0000000..044caa4 --- /dev/null +++ "b/2024/06/14/demogen-\345\256\271\346\226\245-md/index.html" @@ -0,0 +1,1060 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + demogen/容斥.md · Cmach_socket's Blog + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    +
    +
    + +
    + +
    + + +
    + +
    +
    + +
    + + + + + + + Cmach_socket's Blog + +
    + + + + + +
    + + +
    + + +
    + + +
    +
    + + + + + + +
    +
    +
    + +

    + + + demogen/容斥.md + + +

    + +

    + + + + + +

    + + +
    + + +
    + + +
    + + + + +
    + 字数统计: 228阅读时长: 1 min +
    + +
    + + + 2024/06/14 + + + + + + + + + +
    +
    + +
    +
    + + + + +
    +
    +
    +

    德摩根:
    $$\overline{\bigcup_{i=1}^{n}A_{i}}=\bigcap_{i=1}^{n}\overline{A_{i}}$$

    +

    $$\overline{\bigcap_{i=1}^{n}A_{i}}=\bigcup_{i=1}^{n}\overline{A_{i}}$$

    +

    求一个全集中所有子集的交

    +

    $$\begin{split}
    \left|\bigcup_{i=1}^{n}S_i\right|=&\sum_{i}|S_i|-\sum_{i<j}|S_i\cap S_j|+\sum_{i<j<k}|S_i\cap S_j\cap S_k|-\cdots\
    &+(-1)^{m-1}\sum_{a_i<a_{i+1} }\left|\bigcap_{i=1}^{m}S_{a_i}\right|+\cdots+(-1)^{n-1}|S_1\cap\cdots\cap S_n|
    \end{split}$$

    +

    +

    $$
    \left|\bigcup_{i=1}^{n}S_i\right|=\sum_{m=1}^n(-1)^{m-1}\sum_{a_i<a_{i+1} }\left|\bigcap_{i=1}^mS_{a_i}\right|
    $$

    +

    求一个全集中所有子集的并
    $$
    \left|\bigcap_{i=1}^{n}S_i\right|=|U|-\left|\overline{\bigcap_{i=1}^n S_i}\right|
    $$
    套用demogen定理
    $$
    =|U|-\left|\bigcup_{i=1}^n\overline{S_i}\right|
    $$

    +

    对右边进行容斥,
    $$=\left|U\right|+\sum_{m=1}^{n}(-1)^m\sum_{a_{i}<a_{i+1}}\left|\bigcap_{i=1}^{m}\overline{S_{a_{i}}}\right|$$

    + +
    + + + + + + + + +
    + + +
    + + +
    + + + + + + + + + + + + + + + + + + + + +
    + + + + + + +
    + + + +
    +
    + + + + + + + + + + +
    + + + PV: :) + +
    + +
    + +
    + + +
    +
    + CATALOG +
    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git "a/2024/06/14/\344\270\200\344\272\233\345\244\247\350\277\220\347\256\227-md/index.html" "b/2024/06/14/\344\270\200\344\272\233\345\244\247\350\277\220\347\256\227-md/index.html" new file mode 100644 index 0000000..3407ff8 --- /dev/null +++ "b/2024/06/14/\344\270\200\344\272\233\345\244\247\350\277\220\347\256\227-md/index.html" @@ -0,0 +1,1089 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 一些大运算.md · Cmach_socket's Blog + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    +
    +
    + +
    + +
    + + +
    + +
    +
    + +
    + + + + + + + Cmach_socket's Blog + +
    + + + + + +
    + + +
    + + +
    + + +
    +
    + + + + + + +
    +
    +
    + +

    + + + 一些大运算.md + + +

    + +

    + + + + + +

    + + +
    + + +
    + + +
    + + + + +
    + 字数统计: 518阅读时长: 2 min +
    + +
    + + + 2024/06/14 + + + + + + + + + +
    +
    + +
    +
    + + + + +
    +
    +
    +

    总体来说,也遵循提公因式和因式分解

    +

    此外,还有一些特殊的运算

    +

    +

    $$\overline{x} = \frac{1}{n} \sum_{i=1}^{n} a_{i} $$

    +

    $$s = \frac{1}{n} \sum_{i=1}^{n} (a_{i}-\overline{x})^2 $$

    +

    则有

    +

    $$s = \frac{1}{n} \sum_{i=1}^{n} (a_{i}^2 - 2 \overline{x}a_{i} + \overline{x}^2) $$
    $$ = \frac{1}{n} \sum_{i=1}^{n} a_{i}^2 -\frac{1}{n} \sum_{i=1}^{n} 2 \overline{x}a_{i} +\frac{1}{n} \sum_{i=1}^{n} \overline{x}^2 $$

    +

    $$ = \frac{1}{n} \sum_{i=1}^{n} a_{i}^2 - \frac{2}{n} \overline{x} \sum_{i=1}^{n} a_{i} + \overline{x}^2 $$

    +

    $$\because \sum_{i=1}^{n} a_{i}= n\overline{x} $$
    $$ \therefore s = \frac{1}{n} \sum_{i=1}^{n} a_{i}^2 - \overline{x}^2 $$
    $$= \frac{1}{n} \left[\sum_{i=1}^{n} a_{i}^2 - \frac{1}{n} (\sum_{i=1}^{n}a_{i})^2\right] $$

    +

    从方差展开中可以看出:

      +
    • 对于常数$a$ (提公因式?)
    • +
    +

    $$na = \sum_{i=1}^{n} a$$

    +
      +
    • 对于数组$b,c$ (因式分解?)
      $$\sum_{i=1}^{n}b_{i}+c_{i}=\sum_{i=1}^{n}b_{i}+\sum_{i=1}^{n}c_{i}$$
    • +
    +

    下列两式由上面两式推导得来:

      +
    • 对于常数$a$,数组$b$
      $$\sum_{i=1}^{n}a\times b_{i}=a\sum_{i=1}^{n} b_{i}$$

      +
    • +
    • 对于常数$a$,数组$b$
      $$\sum_{i=1}^{n}(b_{i}+a)=na+\sum_{i=1}^{n}b_{i}$$

      +
    • +
    • 此外
      $$\sum_{i=1}^{n}a_{i}^2 \neq (\sum_{i=1}^{n}a_{i})^2 $$

      +
    • +
    +

    连乘符号:

    没有什么较复杂的变化,但是有一个简单的公式

    +
      +
    • 对于常数$a$
      $$\prod_{i=1}^{n} a = a^n$$

      +
    • +
    • 对于常数n
      $$ n! =\prod_{i=1}^{n}i $$

      +
    • +
    +

    了解到的:

    +
      +
    • 断裂:对于数组a
      $$\prod_{i=1}^{n}a_{i} = \frac{\prod_{j=1}^{n+m}a_{j}}{\prod_{k=1}^{m}a_{k}}$$
      上式也可以写成这样:
      $$\prod_{i=0}^{m-1}(n-i) = \frac{\prod_{i=1}^{n}i}{\prod_{j=1}^{n-m}j}$$
      前面n-m是不乘的,后面有m个
    • +
    +

    转化一下:
    $$\prod_{i=0}^{m-1}(n-i) = \frac{n!}{(n-m)!}$$
    排列公式

    +

    连加版:
    $$\sum_{i=1}^{n}a_{i} = \sum_{j=1}^{n+m}a_{j}-
    \sum_{k=1}^{m}a_{k}$$

    + +
    + + + + + + + + +
    + + +
    + + +
    + + + + + + + + + + + + + + + + + + + + +
    + + + + + + +
    + + + +
    +
    + + + + + + + + + + +
    + + + PV: :) + +
    + +
    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git "a/2024/06/14/\346\211\251\345\261\225CRT-md/index.html" "b/2024/06/14/\346\211\251\345\261\225CRT-md/index.html" new file mode 100644 index 0000000..e097ffa --- /dev/null +++ "b/2024/06/14/\346\211\251\345\261\225CRT-md/index.html" @@ -0,0 +1,1057 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 扩展CRT.md · Cmach_socket's Blog + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    +
    +
    + +
    + +
    + + +
    + +
    +
    + +
    + + + + + + + Cmach_socket's Blog + +
    + + + + + +
    + + +
    + + +
    + + +
    +
    + + + + + + +
    +
    +
    + +

    + + + 扩展CRT.md + + +

    + +

    + + + + + +

    + + +
    + + +
    + + +
    + + + + +
    + 字数统计: 547阅读时长: 3 min +
    + +
    + + + 2024/06/14 + + + + + + + + + +
    +
    + +
    +
    + + + + +
    +
    +
    +

    思路:转化为求解二元一次方程,再合并

    +

    求解:
    $$\begin{cases}
    x \equiv r_{1} \quad (mod \quad m_{1} ) \
    x \equiv r_{2} \quad (mod \quad m_{2} )\
    \quad … \
    x \equiv r_{n} \quad (mod \quad m_{n})
    \end{cases}$$

    +

    其中$x \in Z \bigvee r,m \subseteq Z$

    +

    首先考虑:
    $$\begin{cases}
    x \equiv r_{1} \quad (mod \quad m_{1} ) \
    x \equiv r_{2} \quad (mod \quad m_{2} )
    \end{cases} $$

    +


    $$x = k_{1}m_{1}+r_{1}=k_{2}m_{2}+r_{2}$$

    $$k_{1}m_{1}-k_{2}m_{2}=r_{2}-r_{1}$$
    根据ex_gcd,可得有解为
    $$ r_{2}-r_{1} \equiv 0 \quad (mod \quad gcd(m_{1},m_{2}))$$
    即 $r_{2}-r_{1}$能够整除 $gcd(m_{1},m_{2})$

    $$d=gcd(m_{1},m_{2})$$
    $$p_{1}= \frac{m_{1}}{d},p_{2}= \frac{m_{2}}{d}$$

    +

    上列式子转化为
    $$ k_{1}p_{1}+k_{2}p_{2}=\frac{r_{2}-r_{1}}{d}$$

    +

    可以发现,$p_{1}与p_{2}$互质,

    $$\frac{r_{2}-r_{1}}{d}$$

    +

    为整数

    $$\therefore k_{1}p_{1}+k_{2}p_{2}=\frac{r_{2}-r_{1}}{d}$$
    可转化为
    $$p_{1}k_{1}\equiv \frac{r_{2}-r_{1}}{d}\quad (mod \quad p_{2})$$
    $$k_{1} \equiv inv(p_{1},p_{2})\cdot \frac{r_{2}-r_{1}}{d} \quad (mod \quad p_{2})$$
    转回去
    $$k_{1} = inv(p_{1},p_{2})\cdot \frac{r_{2}-r_{1}}{d} \quad +p_{2}\cdot y$$
    回代,得
    $$x=k_{1}m_{1}+r_{1}$$
    $$x=inv(p_{1},p_{2})\cdot \frac{r_{2}-r_{1}}{d} m_{1}+p_{2} y m_{1}+r_{1}$$
    代换,得
    $$x=inv(p_{1},p_{2})\cdot p_{1}( r_{2}-r_{1})+r_{1}+p_{2} y m_{1}$$
    转化
    $$x \equiv inv(p_{1},p_{2})\cdot p_{1}( r_{2}-r_{1})+r_{1} \quad (mod \quad p_{2} m_{1})$$
    全部代回去
    $$x \equiv inv(\frac{m_{1}}{gcd(m_{1},m_{2})},\frac{m_{2}}{gcd(m_{1},m_{2})})\cdot\frac{m_{1}( r_{2}-r_{1})}{gcd(m_{1},m_{2})}+r_{1} \quad (mod \quad\frac{m_{1}m_{2}}{gcd(m_{1},m_{2})})$$

    +

    发现模数就是lcm
    $$x \equiv inv(\frac{m_{1}}{gcd(m_{1},m_{2})},\frac{m_{2}}{gcd(m_{1},m_{2})})\cdot\frac{m_{1}( r_{2}-r_{1})}{gcd(m_{1},m_{2})}+r_{1} \quad (mod \quad lcm(m_{1},m_{2}))$$

    +

    经过一次转化,又转化为了$x \equiv r \quad (mod \quad m)$的形式,经过n-1次转化,最后只有一个式子,根据上面加粗式子的推导,如果每次转化都有解,可知最后的x一定可以求解

    + +
    + + + + + + + + +
    + + +
    + + +
    + + + + + + + + + + + + + + + + + + + + +
    + + + + + + +
    + + + +
    +
    + + + + + + + + + + +
    + + + PV: :) + +
    + +
    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/about/index.html b/about/index.html index de253bc..11867fa 100644 --- a/about/index.html +++ b/about/index.html @@ -619,7 +619,150 @@

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -634,7 +777,7 @@

    diff --git a/archives/2024/06/index.html b/archives/2024/06/index.html index 26207d1..1218618 100644 --- a/archives/2024/06/index.html +++ b/archives/2024/06/index.html @@ -436,12 +436,110 @@

    - + - [404] + 扩展CRT.md
    + 思路:转化为求解二元一次方程,再合并 +求解:$$\begin{cases}x \equiv r_{1} \quad (mod \quad m_{1} ) \x \equiv r_{2} \quad (mod \quad m_{2} )\\quad … \x \equiv r_{n} \quad (mod \quad m_{n})\end{cases}$$ +其中$x \in Z \bigvee r,m \subseteq Z$ +首先考虑:$$\begin{cases}x \equiv r_{1} \quad (mod ... +
    + + + +
    +
    + + + + + + + +
    + + demogen/容斥.md + +
    + 德摩根:$$\overline{\bigcup_{i=1}^{n}A_{i}}=\bigcap_{i=1}^{n}\overline{A_{i}}$$ +$$\overline{\bigcap_{i=1}^{n}A_{i}}=\bigcup_{i=1}^{n}\overline{A_{i}}$$ +求一个全集中所有子集的交 +$$\begin{split}\left|\bigcup_{i=1}^{n}S_i\right|=&\sum_{i}|S_i|-\sum_{i<j}|S_i\cap S_j|+\... +
    + + + +
    +
    + + + + + + + +
    + + + 一些大运算.md + +
    + 总体来说,也遵循提公因式和因式分解 +此外,还有一些特殊的运算 +设 +$$\overline{x} = \frac{1}{n} \sum_{i=1}^{n} a_{i} $$ +$$s = \frac{1}{n} \sum_{i=1}^{n} (a_{i}-\overline{x})^2 $$ +则有 +$$s = \frac{1}{n} \sum_{i=1}^{n} (a_{i}^2 - 2 \overline{x}a_{i} + \overline{x}^2) $$ $$ = \frac{1}{n} \sum_{i=... +
    + + + +
    +
    + + + + + + + +
    + + + hash.md + +
    + 单hash定义了上面的两个数组,首先 hash[i] 表示前 i 个字符的字串的hash 值。而 p[i] 表示 $Base ^ i$  +那么对应的 Hash 公式为: +$$hash[i] = (hash[i-1] * Base + idx(s[i])) % MOD$$ +对于此种Hash方法,将Base和MOD尽量取大即可,这种情况下,冲突的概率是很低的。 +双Hash用字符串Hash,最怕的就是,出现冲突的情况,即不同字符串却有着相同的hash值,这是我们不想看到的。所以为了降低冲突的概率,可以用双Hash方法。 +将一个字符串用不同的Base和MOD,hash两次,将这两个结果...
    @@ -463,16 +561,13 @@

    - + - 树分治相关 + 矩阵乘法.md
    - 一种特别的分治思想,但难点不在于点分治思想本身。 -有板子,但是板子跟题目重点几乎无关。 -点分治 淀粉质用途:用于处理树上多对点询问或寻找有条件最远(最近)点对。主要是处理多对点对。 -做法:我们先选择一个节点作为根节点 $rt$ ,所有完全位于其子树中的路径可以分为两种,一种是经过当前根节点的路径,一种是不经过当前根节点的路径。前一种我们在这次分治中得到,后面一种在之后的分治中计算,就转化为了第一种路径。 -考虑枚举分治中心 $rt$ 的子节点 $u$ ,对于经过 $rt$ 的路径上的所有点 $v$ ,$u$ 都要与其计算一次贡献,可以得出 $v$的点集 是 $rt$ 不包含 $u$ 的子树... + $A_{i,j}=c$ 表示 将$c$倍$f_{j}$转移到$f_{i}$ +
    @@ -483,13 +578,75 @@

    -
    - +
    +

    +
    - + + + + + + +
    + + + FHQ-Treap.md + +
    + 依赖分裂合并的tree+heap(听起来像ODT) +核心操作:分裂: +一种是按权值分裂,一种是按排名分裂 +根据粉兔的博客,发现权值操作都可以通过rank转化为排名 +于是乎只打排名了 +当前需要的排名比左儿子数量大,即左子树和其本身归为第一颗分裂树,进入右子树 +反之同理,上述过程可以用BST性质解释 +通过BST的性质,也可以知道传下来的引用就是两颗子树预备插入节点 +合并: +treap以随机化id来构造期望平衡的BST,合并的时候第一颗树的所有节点一定比第二颗树小, +于是合并时候只需考虑合并节点的 $id$ +左子树 $id$ 小,将右子树挂载到右儿子下,右子树 $id$ 小,则将左子树挂载到右... +
    + + + +
    +
    - + + + + + + +
    + + + 图上二分.md + +
    + 一般是二分边或者点的权值。属于二分答案 +设 $check$ 为检测值, +当 $it.w>check$ 或者 $a[it.y]>check$ 时,走或者不走 +用于解决最大值最小或者最小值最大的问题。 +二分正确性:答案在边权或者点权的值域上,值域是单调的 +
    + + +
    @@ -502,16 +659,93 @@

    - + - Hello World + 2-SAT.md
    - Welcome to Hexo! This is your very first post. Check documentation for more info. If you get any problems when using Hexo, you can find the answer in troubleshooting or you can ask me on GitHub. -Quick StartCreate a new post1$ hexo new "My New Post" + 思路类似于差分约束,将数学问题转化为图论问题 +也是判环来判断可行性 +建图+tarjan +为什么不用spfa判环? +tarjan算法更优秀 $O(n+m)$ ,并且tarjan序就是反拓扑序,方便求解 +2-sat问题指每一个变量存在两种状态(2),这些变量需要满足一些条件(sat) +这些条件是逻辑条件:or,xor,and +2-sat问题转化所有的逻辑关系都可以转化为这样的形式:选择了A,则必须选择B +从A到B连一条边,就可以表示这样的关系 +若存在环内有一个变量的两个状态,则说明有一个无法满足的依赖链(例如 选$A_1$必选$B_2$ …. 选$B_2$必选$A_2$),这时选$A_1$也... +
    + + + +
    +
    + + + + + + + +
    + + + 差分约束系统.md + +
    + 差分约束系统 +$x_1-x_2 \leq y_1$ +… +$x_i-x_j \leq y_i$ +将$x_i-xj \leq y_i$ 移项,得 +$x_i \leq x_j+y_i$ +可建立一条从$x_j$到$x_i$的路径,权值为$y_2$ +将线性规划问题转化为图论问题 + +差分约束系统的转化: +$x_1-x_2 \geq y \to x_2-x_1 \leq -y_1$ -More info: Writing -Run server1$ hexo ... +$x_1 = x_2 \to x_1-x_2 \leq 0 \quad and \quad x_2-x_1 \leq 0$ + +$x_1 - x_2 < y \to x_1-x_2 \l... +
    + + + +
    +
    + + + + + + + +
    + + + 树型DP和缩点后树型DP.md + +
    + 基本的方程: +$f[u]=\sum_{v \in son(u)}f[v]+calc(v)$ +$f[u]=\max_{v \in son(u)}f[v]+calc(v)$ +[CTSC1997] 选课题目描述在大学里每个学生,为了达到一定的学分,必须从很多课程里选择一些课程来学习,在课程里有些课程必须在某些课程之前学习,如高等数学总是在其它课程之前学习。现在有 $N$ 门功课,每门课有个学分,每门课有一门或没有直接先修课(若课程 a 是课程 b 的先修课即只有学完了课程 a,才能学习课程 b)。一个学生要从这些课程里选择 $M$ 门课程学习,问他能获得的最大学分是多少? +...
    @@ -528,6 +762,10 @@

    + + @@ -649,7 +887,150 @@

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -664,7 +1045,7 @@

    diff --git a/archives/2024/06/page/2/index.html b/archives/2024/06/page/2/index.html new file mode 100644 index 0000000..7c3a89a --- /dev/null +++ b/archives/2024/06/page/2/index.html @@ -0,0 +1,1120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Cmach_socket's Blog + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    +
    +
    + +
    + +
    + + +
    + +
    +
    + +
    + + + + + + + Cmach_socket's Blog + +
    + + +
    + + +
    + + +
    + + +
    +
    + + + +
    +
    +
    + +

    + + +

    + +

    + + +

    + + +
    +
    + + + + +
    +
    + + + + + + + +
    + + + 整除分块.md + +
    + 数论分块结论对于常数 n,使得式子 +$$\left\lfloor\dfrac ni\right\rfloor=\left\lfloor\dfrac nj\right\rfloor$$ +成立的最大的满足 $i\leq j\leq n$ 的 $j$ 的值为 $\left\lfloor\dfrac n{\lfloor\frac ni\rfloor}\right\rfloor$。 +即值 +$$\left\lfloor\dfrac ni\right\rfloor$$ 所在的块的右端点为 +$$\left\lfloor\dfrac n{\lfloor\frac ni\rfloor}\rig... +
    + + + +
    +
    + + + + + + + +
    + + + 排列与组合.md + +
    + 排列:从集合{a,b,c}中取2个元素的排列有ab,ac,ba,bc,ca,cb +换言之,元素顺序对于排列是有影响的 +考虑当前排列,第一个位置有N个选择,第二个位置去除第一个还有N-1种选择,以此类推到第M个还有N-M+1个选择 +可以得到公式 +$$A_{N}^{M} = \prod_{i=0}^{m-1}(n-i) = \frac{\prod_{i=1}^{n}i}{\prod_{j=1}^{n-m}j}$$前面n-m是不乘的,后面有m个转化一下: $$A_{N}^{M} = \frac{n!}{(n-m)!}$$ +组合: ... +
    + + + +
    +
    + + + + + + + +
    + + + 众数二进制拆分.md + +
    + 这个方法就是 二进制拆分。 +对于一个众数,因为它在原序列中的出现次数超过了一半,那么 对于每一个二进制位来说,众数在这一位上对应的值也超过了一半。 +简要复述一下该方法:对于一个序列 $a$,对于每个二进制位 $b$,求有多少个数该位是 $1$,记作 $cntb$​。 +存在绝对众数 $m$ 时,如果 $m$ 某一位是 $1$,那么 $cntb$​ 一定过半,反则一定不过半。 + +
    + + + +
    +
    + + + + + + + +
    + + + 根号算法相关.md + +
    + 分块相关:分块思想简单,题目复杂。 +根号分治根号算法——不只是分块。 +有时我们会碰到这样一类问题,长度为$n$的序列,$m$个询问(通常$n$和$m$同阶),可能存在两种比较显然的方法,一种是$O(n^2)$预处理$O(1)$回答,一种是不预处理$O(n)$回答$m$个询问,这两种方法都是$O(n^2)$的。考虑是否存在一种策略能“平衡”一下预处理和询问的复杂度。 +莫队相关:莫队never gonna give you up +不是将询问分成 $\sqrt{q}$块,而是把询问的 $l$ 分成$\sqrt{n}$块,保证每次l的变化在$\sqrt{n}$内 +通过奇偶性排序,单数块r正序排序... +
    + + + +
    +
    + + + + + + + +
    + + + 一般启发式合并.md + +
    + 启发式合并就是在合并的时候将size小的那个集合合并到size大的那个集合里面。 +复杂度居然是$O(n log n)$的 + +
    + + + +
    +
    + + + + + + + +
    + + + 树分治相关 + +
    + 一种特别的分治思想,但难点不在于点分治思想本身。 +有板子,但是板子跟题目重点几乎无关。 +点分治 淀粉质用途:用于处理树上多对点询问或寻找有条件最远(最近)点对。主要是处理多对点对。 +做法:我们先选择一个节点作为根节点 $rt$ ,所有完全位于其子树中的路径可以分为两种,一种是经过当前根节点的路径,一种是不经过当前根节点的路径。前一种我们在这次分治中得到,后面一种在之后的分治中计算,就转化为了第一种路径。 +考虑枚举分治中心 $rt$ 的子节点 $u$ ,对于经过 $rt$ 的路径上的所有点 $v$ ,$u$ 都要与其计算一次贡献,可以得出 $v$的点集 是 $rt$ 不包含 $u$ 的子树... +
    + + + +
    +
    + + + + + +
    + + + +
    +
    + + + + + + + + + + +
    + + + PV: :) + +
    + +
    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/archives/2024/index.html b/archives/2024/index.html index 697f0eb..62883e3 100644 --- a/archives/2024/index.html +++ b/archives/2024/index.html @@ -436,12 +436,110 @@

    - + - [404] + 扩展CRT.md
    + 思路:转化为求解二元一次方程,再合并 +求解:$$\begin{cases}x \equiv r_{1} \quad (mod \quad m_{1} ) \x \equiv r_{2} \quad (mod \quad m_{2} )\\quad … \x \equiv r_{n} \quad (mod \quad m_{n})\end{cases}$$ +其中$x \in Z \bigvee r,m \subseteq Z$ +首先考虑:$$\begin{cases}x \equiv r_{1} \quad (mod ... +
    + + + +
    +
    + + + + + + + +
    + + demogen/容斥.md + +
    + 德摩根:$$\overline{\bigcup_{i=1}^{n}A_{i}}=\bigcap_{i=1}^{n}\overline{A_{i}}$$ +$$\overline{\bigcap_{i=1}^{n}A_{i}}=\bigcup_{i=1}^{n}\overline{A_{i}}$$ +求一个全集中所有子集的交 +$$\begin{split}\left|\bigcup_{i=1}^{n}S_i\right|=&\sum_{i}|S_i|-\sum_{i<j}|S_i\cap S_j|+\... +
    + + + +
    +
    + + + + + + + +
    + + + 一些大运算.md + +
    + 总体来说,也遵循提公因式和因式分解 +此外,还有一些特殊的运算 +设 +$$\overline{x} = \frac{1}{n} \sum_{i=1}^{n} a_{i} $$ +$$s = \frac{1}{n} \sum_{i=1}^{n} (a_{i}-\overline{x})^2 $$ +则有 +$$s = \frac{1}{n} \sum_{i=1}^{n} (a_{i}^2 - 2 \overline{x}a_{i} + \overline{x}^2) $$ $$ = \frac{1}{n} \sum_{i=... +
    + + + +
    +
    + + + + + + + +
    + + + hash.md + +
    + 单hash定义了上面的两个数组,首先 hash[i] 表示前 i 个字符的字串的hash 值。而 p[i] 表示 $Base ^ i$  +那么对应的 Hash 公式为: +$$hash[i] = (hash[i-1] * Base + idx(s[i])) % MOD$$ +对于此种Hash方法,将Base和MOD尽量取大即可,这种情况下,冲突的概率是很低的。 +双Hash用字符串Hash,最怕的就是,出现冲突的情况,即不同字符串却有着相同的hash值,这是我们不想看到的。所以为了降低冲突的概率,可以用双Hash方法。 +将一个字符串用不同的Base和MOD,hash两次,将这两个结果...
    @@ -463,16 +561,13 @@

    - + - 树分治相关 + 矩阵乘法.md
    - 一种特别的分治思想,但难点不在于点分治思想本身。 -有板子,但是板子跟题目重点几乎无关。 -点分治 淀粉质用途:用于处理树上多对点询问或寻找有条件最远(最近)点对。主要是处理多对点对。 -做法:我们先选择一个节点作为根节点 $rt$ ,所有完全位于其子树中的路径可以分为两种,一种是经过当前根节点的路径,一种是不经过当前根节点的路径。前一种我们在这次分治中得到,后面一种在之后的分治中计算,就转化为了第一种路径。 -考虑枚举分治中心 $rt$ 的子节点 $u$ ,对于经过 $rt$ 的路径上的所有点 $v$ ,$u$ 都要与其计算一次贡献,可以得出 $v$的点集 是 $rt$ 不包含 $u$ 的子树... + $A_{i,j}=c$ 表示 将$c$倍$f_{j}$转移到$f_{i}$ +
    @@ -483,13 +578,75 @@

    -
    - +
    +

    +
    - + + + + + + +
    + + + FHQ-Treap.md + +
    + 依赖分裂合并的tree+heap(听起来像ODT) +核心操作:分裂: +一种是按权值分裂,一种是按排名分裂 +根据粉兔的博客,发现权值操作都可以通过rank转化为排名 +于是乎只打排名了 +当前需要的排名比左儿子数量大,即左子树和其本身归为第一颗分裂树,进入右子树 +反之同理,上述过程可以用BST性质解释 +通过BST的性质,也可以知道传下来的引用就是两颗子树预备插入节点 +合并: +treap以随机化id来构造期望平衡的BST,合并的时候第一颗树的所有节点一定比第二颗树小, +于是合并时候只需考虑合并节点的 $id$ +左子树 $id$ 小,将右子树挂载到右儿子下,右子树 $id$ 小,则将左子树挂载到右... +
    + + + +
    +
    - + + + + + + +
    + + + 图上二分.md + +
    + 一般是二分边或者点的权值。属于二分答案 +设 $check$ 为检测值, +当 $it.w>check$ 或者 $a[it.y]>check$ 时,走或者不走 +用于解决最大值最小或者最小值最大的问题。 +二分正确性:答案在边权或者点权的值域上,值域是单调的 +
    + + +
    @@ -502,16 +659,93 @@

    - + - Hello World + 2-SAT.md
    - Welcome to Hexo! This is your very first post. Check documentation for more info. If you get any problems when using Hexo, you can find the answer in troubleshooting or you can ask me on GitHub. -Quick StartCreate a new post1$ hexo new "My New Post" + 思路类似于差分约束,将数学问题转化为图论问题 +也是判环来判断可行性 +建图+tarjan +为什么不用spfa判环? +tarjan算法更优秀 $O(n+m)$ ,并且tarjan序就是反拓扑序,方便求解 +2-sat问题指每一个变量存在两种状态(2),这些变量需要满足一些条件(sat) +这些条件是逻辑条件:or,xor,and +2-sat问题转化所有的逻辑关系都可以转化为这样的形式:选择了A,则必须选择B +从A到B连一条边,就可以表示这样的关系 +若存在环内有一个变量的两个状态,则说明有一个无法满足的依赖链(例如 选$A_1$必选$B_2$ …. 选$B_2$必选$A_2$),这时选$A_1$也... +
    + + + +
    +
    + + + + + + + +
    + + + 差分约束系统.md + +
    + 差分约束系统 +$x_1-x_2 \leq y_1$ +… +$x_i-x_j \leq y_i$ +将$x_i-xj \leq y_i$ 移项,得 +$x_i \leq x_j+y_i$ +可建立一条从$x_j$到$x_i$的路径,权值为$y_2$ +将线性规划问题转化为图论问题 + +差分约束系统的转化: +$x_1-x_2 \geq y \to x_2-x_1 \leq -y_1$ -More info: Writing -Run server1$ hexo ... +$x_1 = x_2 \to x_1-x_2 \leq 0 \quad and \quad x_2-x_1 \leq 0$ + +$x_1 - x_2 < y \to x_1-x_2 \l... +
    + + + +
    +
    + + + + + + + +
    + + + 树型DP和缩点后树型DP.md + +
    + 基本的方程: +$f[u]=\sum_{v \in son(u)}f[v]+calc(v)$ +$f[u]=\max_{v \in son(u)}f[v]+calc(v)$ +[CTSC1997] 选课题目描述在大学里每个学生,为了达到一定的学分,必须从很多课程里选择一些课程来学习,在课程里有些课程必须在某些课程之前学习,如高等数学总是在其它课程之前学习。现在有 $N$ 门功课,每门课有个学分,每门课有一门或没有直接先修课(若课程 a 是课程 b 的先修课即只有学完了课程 a,才能学习课程 b)。一个学生要从这些课程里选择 $M$ 门课程学习,问他能获得的最大学分是多少? +...
    @@ -528,6 +762,10 @@

    + + @@ -649,7 +887,150 @@

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -664,7 +1045,7 @@

    diff --git a/archives/2024/page/2/index.html b/archives/2024/page/2/index.html new file mode 100644 index 0000000..1893b73 --- /dev/null +++ b/archives/2024/page/2/index.html @@ -0,0 +1,1120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Cmach_socket's Blog + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    +
    +
    + +
    + +
    + + +
    + +
    +
    + +
    + + + + + + + Cmach_socket's Blog + +
    + + +
    + + +
    + + +
    + + +
    +
    + + + +
    +
    +
    + +

    + + +

    + +

    + + +

    + + +
    +
    + + + + +
    +
    + + + + + + + +
    + + + 整除分块.md + +
    + 数论分块结论对于常数 n,使得式子 +$$\left\lfloor\dfrac ni\right\rfloor=\left\lfloor\dfrac nj\right\rfloor$$ +成立的最大的满足 $i\leq j\leq n$ 的 $j$ 的值为 $\left\lfloor\dfrac n{\lfloor\frac ni\rfloor}\right\rfloor$。 +即值 +$$\left\lfloor\dfrac ni\right\rfloor$$ 所在的块的右端点为 +$$\left\lfloor\dfrac n{\lfloor\frac ni\rfloor}\rig... +
    + + + +
    +
    + + + + + + + +
    + + + 排列与组合.md + +
    + 排列:从集合{a,b,c}中取2个元素的排列有ab,ac,ba,bc,ca,cb +换言之,元素顺序对于排列是有影响的 +考虑当前排列,第一个位置有N个选择,第二个位置去除第一个还有N-1种选择,以此类推到第M个还有N-M+1个选择 +可以得到公式 +$$A_{N}^{M} = \prod_{i=0}^{m-1}(n-i) = \frac{\prod_{i=1}^{n}i}{\prod_{j=1}^{n-m}j}$$前面n-m是不乘的,后面有m个转化一下: $$A_{N}^{M} = \frac{n!}{(n-m)!}$$ +组合: ... +
    + + + +
    +
    + + + + + + + +
    + + + 众数二进制拆分.md + +
    + 这个方法就是 二进制拆分。 +对于一个众数,因为它在原序列中的出现次数超过了一半,那么 对于每一个二进制位来说,众数在这一位上对应的值也超过了一半。 +简要复述一下该方法:对于一个序列 $a$,对于每个二进制位 $b$,求有多少个数该位是 $1$,记作 $cntb$​。 +存在绝对众数 $m$ 时,如果 $m$ 某一位是 $1$,那么 $cntb$​ 一定过半,反则一定不过半。 + +
    + + + +
    +
    + + + + + + + +
    + + + 根号算法相关.md + +
    + 分块相关:分块思想简单,题目复杂。 +根号分治根号算法——不只是分块。 +有时我们会碰到这样一类问题,长度为$n$的序列,$m$个询问(通常$n$和$m$同阶),可能存在两种比较显然的方法,一种是$O(n^2)$预处理$O(1)$回答,一种是不预处理$O(n)$回答$m$个询问,这两种方法都是$O(n^2)$的。考虑是否存在一种策略能“平衡”一下预处理和询问的复杂度。 +莫队相关:莫队never gonna give you up +不是将询问分成 $\sqrt{q}$块,而是把询问的 $l$ 分成$\sqrt{n}$块,保证每次l的变化在$\sqrt{n}$内 +通过奇偶性排序,单数块r正序排序... +
    + + + +
    +
    + + + + + + + +
    + + + 一般启发式合并.md + +
    + 启发式合并就是在合并的时候将size小的那个集合合并到size大的那个集合里面。 +复杂度居然是$O(n log n)$的 + +
    + + + +
    +
    + + + + + + + +
    + + + 树分治相关 + +
    + 一种特别的分治思想,但难点不在于点分治思想本身。 +有板子,但是板子跟题目重点几乎无关。 +点分治 淀粉质用途:用于处理树上多对点询问或寻找有条件最远(最近)点对。主要是处理多对点对。 +做法:我们先选择一个节点作为根节点 $rt$ ,所有完全位于其子树中的路径可以分为两种,一种是经过当前根节点的路径,一种是不经过当前根节点的路径。前一种我们在这次分治中得到,后面一种在之后的分治中计算,就转化为了第一种路径。 +考虑枚举分治中心 $rt$ 的子节点 $u$ ,对于经过 $rt$ 的路径上的所有点 $v$ ,$u$ 都要与其计算一次贡献,可以得出 $v$的点集 是 $rt$ 不包含 $u$ 的子树... +
    + + + +
    +
    + + + + + +
    + + + +
    +
    + + + + + + + + + + +
    + + + PV: :) + +
    + +
    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/archives/index.html b/archives/index.html index 9d8c996..169acdd 100644 --- a/archives/index.html +++ b/archives/index.html @@ -436,12 +436,110 @@

    - + - [404] + 扩展CRT.md
    + 思路:转化为求解二元一次方程,再合并 +求解:$$\begin{cases}x \equiv r_{1} \quad (mod \quad m_{1} ) \x \equiv r_{2} \quad (mod \quad m_{2} )\\quad … \x \equiv r_{n} \quad (mod \quad m_{n})\end{cases}$$ +其中$x \in Z \bigvee r,m \subseteq Z$ +首先考虑:$$\begin{cases}x \equiv r_{1} \quad (mod ... +
    + + + +
    +
    + + + + + + + +
    + + demogen/容斥.md + +
    + 德摩根:$$\overline{\bigcup_{i=1}^{n}A_{i}}=\bigcap_{i=1}^{n}\overline{A_{i}}$$ +$$\overline{\bigcap_{i=1}^{n}A_{i}}=\bigcup_{i=1}^{n}\overline{A_{i}}$$ +求一个全集中所有子集的交 +$$\begin{split}\left|\bigcup_{i=1}^{n}S_i\right|=&\sum_{i}|S_i|-\sum_{i<j}|S_i\cap S_j|+\... +
    + + + +
    +
    + + + + + + + +
    + + + 一些大运算.md + +
    + 总体来说,也遵循提公因式和因式分解 +此外,还有一些特殊的运算 +设 +$$\overline{x} = \frac{1}{n} \sum_{i=1}^{n} a_{i} $$ +$$s = \frac{1}{n} \sum_{i=1}^{n} (a_{i}-\overline{x})^2 $$ +则有 +$$s = \frac{1}{n} \sum_{i=1}^{n} (a_{i}^2 - 2 \overline{x}a_{i} + \overline{x}^2) $$ $$ = \frac{1}{n} \sum_{i=... +
    + + + +
    +
    + + + + + + + +
    + + + hash.md + +
    + 单hash定义了上面的两个数组,首先 hash[i] 表示前 i 个字符的字串的hash 值。而 p[i] 表示 $Base ^ i$  +那么对应的 Hash 公式为: +$$hash[i] = (hash[i-1] * Base + idx(s[i])) % MOD$$ +对于此种Hash方法,将Base和MOD尽量取大即可,这种情况下,冲突的概率是很低的。 +双Hash用字符串Hash,最怕的就是,出现冲突的情况,即不同字符串却有着相同的hash值,这是我们不想看到的。所以为了降低冲突的概率,可以用双Hash方法。 +将一个字符串用不同的Base和MOD,hash两次,将这两个结果...
    @@ -463,16 +561,13 @@

    - + - 树分治相关 + 矩阵乘法.md
    - 一种特别的分治思想,但难点不在于点分治思想本身。 -有板子,但是板子跟题目重点几乎无关。 -点分治 淀粉质用途:用于处理树上多对点询问或寻找有条件最远(最近)点对。主要是处理多对点对。 -做法:我们先选择一个节点作为根节点 $rt$ ,所有完全位于其子树中的路径可以分为两种,一种是经过当前根节点的路径,一种是不经过当前根节点的路径。前一种我们在这次分治中得到,后面一种在之后的分治中计算,就转化为了第一种路径。 -考虑枚举分治中心 $rt$ 的子节点 $u$ ,对于经过 $rt$ 的路径上的所有点 $v$ ,$u$ 都要与其计算一次贡献,可以得出 $v$的点集 是 $rt$ 不包含 $u$ 的子树... + $A_{i,j}=c$ 表示 将$c$倍$f_{j}$转移到$f_{i}$ +
    @@ -483,13 +578,75 @@

    -
    - +
    +

    +
    - + + + + + + +
    + + + FHQ-Treap.md + +
    + 依赖分裂合并的tree+heap(听起来像ODT) +核心操作:分裂: +一种是按权值分裂,一种是按排名分裂 +根据粉兔的博客,发现权值操作都可以通过rank转化为排名 +于是乎只打排名了 +当前需要的排名比左儿子数量大,即左子树和其本身归为第一颗分裂树,进入右子树 +反之同理,上述过程可以用BST性质解释 +通过BST的性质,也可以知道传下来的引用就是两颗子树预备插入节点 +合并: +treap以随机化id来构造期望平衡的BST,合并的时候第一颗树的所有节点一定比第二颗树小, +于是合并时候只需考虑合并节点的 $id$ +左子树 $id$ 小,将右子树挂载到右儿子下,右子树 $id$ 小,则将左子树挂载到右... +
    + + + +
    +
    - + + + + + + +
    + + + 图上二分.md + +
    + 一般是二分边或者点的权值。属于二分答案 +设 $check$ 为检测值, +当 $it.w>check$ 或者 $a[it.y]>check$ 时,走或者不走 +用于解决最大值最小或者最小值最大的问题。 +二分正确性:答案在边权或者点权的值域上,值域是单调的 +
    + + +
    @@ -502,16 +659,93 @@

    - + - Hello World + 2-SAT.md
    - Welcome to Hexo! This is your very first post. Check documentation for more info. If you get any problems when using Hexo, you can find the answer in troubleshooting or you can ask me on GitHub. -Quick StartCreate a new post1$ hexo new "My New Post" + 思路类似于差分约束,将数学问题转化为图论问题 +也是判环来判断可行性 +建图+tarjan +为什么不用spfa判环? +tarjan算法更优秀 $O(n+m)$ ,并且tarjan序就是反拓扑序,方便求解 +2-sat问题指每一个变量存在两种状态(2),这些变量需要满足一些条件(sat) +这些条件是逻辑条件:or,xor,and +2-sat问题转化所有的逻辑关系都可以转化为这样的形式:选择了A,则必须选择B +从A到B连一条边,就可以表示这样的关系 +若存在环内有一个变量的两个状态,则说明有一个无法满足的依赖链(例如 选$A_1$必选$B_2$ …. 选$B_2$必选$A_2$),这时选$A_1$也... +
    + + + +
    +
    + + + + + + + +
    + + + 差分约束系统.md + +
    + 差分约束系统 +$x_1-x_2 \leq y_1$ +… +$x_i-x_j \leq y_i$ +将$x_i-xj \leq y_i$ 移项,得 +$x_i \leq x_j+y_i$ +可建立一条从$x_j$到$x_i$的路径,权值为$y_2$ +将线性规划问题转化为图论问题 + +差分约束系统的转化: +$x_1-x_2 \geq y \to x_2-x_1 \leq -y_1$ -More info: Writing -Run server1$ hexo ... +$x_1 = x_2 \to x_1-x_2 \leq 0 \quad and \quad x_2-x_1 \leq 0$ + +$x_1 - x_2 < y \to x_1-x_2 \l... +
    + + + +
    +
    + + + + + + + +
    + + + 树型DP和缩点后树型DP.md + +
    + 基本的方程: +$f[u]=\sum_{v \in son(u)}f[v]+calc(v)$ +$f[u]=\max_{v \in son(u)}f[v]+calc(v)$ +[CTSC1997] 选课题目描述在大学里每个学生,为了达到一定的学分,必须从很多课程里选择一些课程来学习,在课程里有些课程必须在某些课程之前学习,如高等数学总是在其它课程之前学习。现在有 $N$ 门功课,每门课有个学分,每门课有一门或没有直接先修课(若课程 a 是课程 b 的先修课即只有学完了课程 a,才能学习课程 b)。一个学生要从这些课程里选择 $M$ 门课程学习,问他能获得的最大学分是多少? +...
    @@ -528,6 +762,10 @@

    + + @@ -649,7 +887,150 @@

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -664,7 +1045,7 @@

    diff --git a/archives/page/2/index.html b/archives/page/2/index.html new file mode 100644 index 0000000..dbfafea --- /dev/null +++ b/archives/page/2/index.html @@ -0,0 +1,1120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Cmach_socket's Blog + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    +
    +
    + +
    + +
    + + +
    + +
    +
    + +
    + + + + + + + Cmach_socket's Blog + +
    + + +
    + + +
    + + +
    + + +
    +
    + + + +
    +
    +
    + +

    + + +

    + +

    + + +

    + + +
    +
    + + + + +
    +
    + + + + + + + +
    + + + 整除分块.md + +
    + 数论分块结论对于常数 n,使得式子 +$$\left\lfloor\dfrac ni\right\rfloor=\left\lfloor\dfrac nj\right\rfloor$$ +成立的最大的满足 $i\leq j\leq n$ 的 $j$ 的值为 $\left\lfloor\dfrac n{\lfloor\frac ni\rfloor}\right\rfloor$。 +即值 +$$\left\lfloor\dfrac ni\right\rfloor$$ 所在的块的右端点为 +$$\left\lfloor\dfrac n{\lfloor\frac ni\rfloor}\rig... +
    + + + +
    +
    + + + + + + + +
    + + + 排列与组合.md + +
    + 排列:从集合{a,b,c}中取2个元素的排列有ab,ac,ba,bc,ca,cb +换言之,元素顺序对于排列是有影响的 +考虑当前排列,第一个位置有N个选择,第二个位置去除第一个还有N-1种选择,以此类推到第M个还有N-M+1个选择 +可以得到公式 +$$A_{N}^{M} = \prod_{i=0}^{m-1}(n-i) = \frac{\prod_{i=1}^{n}i}{\prod_{j=1}^{n-m}j}$$前面n-m是不乘的,后面有m个转化一下: $$A_{N}^{M} = \frac{n!}{(n-m)!}$$ +组合: ... +
    + + + +
    +
    + + + + + + + +
    + + + 众数二进制拆分.md + +
    + 这个方法就是 二进制拆分。 +对于一个众数,因为它在原序列中的出现次数超过了一半,那么 对于每一个二进制位来说,众数在这一位上对应的值也超过了一半。 +简要复述一下该方法:对于一个序列 $a$,对于每个二进制位 $b$,求有多少个数该位是 $1$,记作 $cntb$​。 +存在绝对众数 $m$ 时,如果 $m$ 某一位是 $1$,那么 $cntb$​ 一定过半,反则一定不过半。 + +
    + + + +
    +
    + + + + + + + +
    + + + 根号算法相关.md + +
    + 分块相关:分块思想简单,题目复杂。 +根号分治根号算法——不只是分块。 +有时我们会碰到这样一类问题,长度为$n$的序列,$m$个询问(通常$n$和$m$同阶),可能存在两种比较显然的方法,一种是$O(n^2)$预处理$O(1)$回答,一种是不预处理$O(n)$回答$m$个询问,这两种方法都是$O(n^2)$的。考虑是否存在一种策略能“平衡”一下预处理和询问的复杂度。 +莫队相关:莫队never gonna give you up +不是将询问分成 $\sqrt{q}$块,而是把询问的 $l$ 分成$\sqrt{n}$块,保证每次l的变化在$\sqrt{n}$内 +通过奇偶性排序,单数块r正序排序... +
    + + + +
    +
    + + + + + + + +
    + + + 一般启发式合并.md + +
    + 启发式合并就是在合并的时候将size小的那个集合合并到size大的那个集合里面。 +复杂度居然是$O(n log n)$的 + +
    + + + +
    +
    + + + + + + + +
    + + + 树分治相关 + +
    + 一种特别的分治思想,但难点不在于点分治思想本身。 +有板子,但是板子跟题目重点几乎无关。 +点分治 淀粉质用途:用于处理树上多对点询问或寻找有条件最远(最近)点对。主要是处理多对点对。 +做法:我们先选择一个节点作为根节点 $rt$ ,所有完全位于其子树中的路径可以分为两种,一种是经过当前根节点的路径,一种是不经过当前根节点的路径。前一种我们在这次分治中得到,后面一种在之后的分治中计算,就转化为了第一种路径。 +考虑枚举分治中心 $rt$ 的子节点 $u$ ,对于经过 $rt$ 的路径上的所有点 $v$ ,$u$ 都要与其计算一次贡献,可以得出 $v$的点集 是 $rt$ 不包含 $u$ 的子树... +
    + + + +
    +
    + + + + + +
    + + + +
    +
    + + + + + + + + + + +
    + + + PV: :) + +
    + +
    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/atom.xml b/atom.xml index a5bbe60..7ea4e81 100644 --- a/atom.xml +++ b/atom.xml @@ -6,7 +6,7 @@ - 2024-06-13T13:50:20.710Z + 2024-06-13T23:19:02.939Z http://cmach_socket.github.io/ @@ -17,14 +17,20 @@ Hexo - [404] - - http://cmach_socket.github.io/2024/06/13/404-md/ - 2024-06-13T13:50:09.430Z - 2024-06-13T13:50:20.710Z + 扩展CRT.md + + http://cmach_socket.github.io/2024/06/14/%E6%89%A9%E5%B1%95CRT-md/ + 2024-06-13T23:18:57.000Z + 2024-06-13T23:19:02.939Z + 思路:转化为求解二元一次方程,再合并

    求解:
    $$\begin{cases}
    x \equiv r_{1} \quad (mod \quad m_{1} ) \
    x \equiv r_{2} \quad (mod \quad m_{2} )\
    \quad … \
    x \equiv r_{n} \quad (mod \quad m_{n})
    \end{cases}$$

    其中$x \in Z \bigvee r,m \subseteq Z$

    首先考虑:
    $$\begin{cases}
    x \equiv r_{1} \quad (mod \quad m_{1} ) \
    x \equiv r_{2} \quad (mod \quad m_{2} )
    \end{cases} $$


    $$x = k_{1}m_{1}+r_{1}=k_{2}m_{2}+r_{2}$$

    $$k_{1}m_{1}-k_{2}m_{2}=r_{2}-r_{1}$$
    根据ex_gcd,可得有解为
    $$ r_{2}-r_{1} \equiv 0 \quad (mod \quad gcd(m_{1},m_{2}))$$
    即 $r_{2}-r_{1}$能够整除 $gcd(m_{1},m_{2})$

    $$d=gcd(m_{1},m_{2})$$
    $$p_{1}= \frac{m_{1}}{d},p_{2}= \frac{m_{2}}{d}$$

    上列式子转化为
    $$ k_{1}p_{1}+k_{2}p_{2}=\frac{r_{2}-r_{1}}{d}$$

    可以发现,$p_{1}与p_{2}$互质,

    $$\frac{r_{2}-r_{1}}{d}$$

    为整数

    $$\therefore k_{1}p_{1}+k_{2}p_{2}=\frac{r_{2}-r_{1}}{d}$$
    可转化为
    $$p_{1}k_{1}\equiv \frac{r_{2}-r_{1}}{d}\quad (mod \quad p_{2})$$
    $$k_{1} \equiv inv(p_{1},p_{2})\cdot \frac{r_{2}-r_{1}}{d} \quad (mod \quad p_{2})$$
    转回去
    $$k_{1} = inv(p_{1},p_{2})\cdot \frac{r_{2}-r_{1}}{d} \quad +p_{2}\cdot y$$
    回代,得
    $$x=k_{1}m_{1}+r_{1}$$
    $$x=inv(p_{1},p_{2})\cdot \frac{r_{2}-r_{1}}{d} m_{1}+p_{2} y m_{1}+r_{1}$$
    代换,得
    $$x=inv(p_{1},p_{2})\cdot p_{1}( r_{2}-r_{1})+r_{1}+p_{2} y m_{1}$$
    转化
    $$x \equiv inv(p_{1},p_{2})\cdot p_{1}( r_{2}-r_{1})+r_{1} \quad (mod \quad p_{2} m_{1})$$
    全部代回去
    $$x \equiv inv(\frac{m_{1}}{gcd(m_{1},m_{2})},\frac{m_{2}}{gcd(m_{1},m_{2})})\cdot\frac{m_{1}( r_{2}-r_{1})}{gcd(m_{1},m_{2})}+r_{1} \quad (mod \quad\frac{m_{1}m_{2}}{gcd(m_{1},m_{2})})$$

    发现模数就是lcm
    $$x \equiv inv(\frac{m_{1}}{gcd(m_{1},m_{2})},\frac{m_{2}}{gcd(m_{1},m_{2})})\cdot\frac{m_{1}( r_{2}-r_{1})}{gcd(m_{1},m_{2})}+r_{1} \quad (mod \quad lcm(m_{1},m_{2}))$$

    经过一次转化,又转化为了$x \equiv r \quad (mod \quad m)$的形式,经过n-1次转化,最后只有一个式子,根据上面加粗式子的推导,如果每次转化都有解,可知最后的x一定可以求解

    ]]>
    - May the Force be with you :&#41; + + + + <p>思路:转化为求解二元一次方程,再合并</p> +<p>求解:<br>$$\begin{cases}<br>x \equiv r_{1} \quad (mod \quad m_{1} ) \<br>x \equiv r_{2} \quad (mod \quad m_{2} + @@ -32,20 +38,244 @@
    - 树分治相关 - - http://cmach_socket.github.io/2024/06/13/%E6%A0%91%E5%88%86%E6%B2%BB%E7%9B%B8%E5%85%B3/ - 2024-06-13T12:25:28.000Z - 2024-06-13T13:40:42.487Z + demogen/容斥.md + + http://cmach_socket.github.io/2024/06/14/demogen-%E5%AE%B9%E6%96%A5-md/ + 2024-06-13T23:18:20.000Z + 2024-06-13T23:18:24.626Z - 一种特别的分治思想,但难点不在于点分治思想本身。

    有板子,但是板子跟题目重点几乎无关。

    点分治 淀粉质

    用途

    用于处理树上多对点询问或寻找有条件最远(最近)点对。主要是处理多对点对。

    做法

    我们先选择一个节点作为根节点 $rt$ ,所有完全位于其子树中的路径可以分为两种,一种是经过当前根节点的路径,一种是不经过当前根节点的路径。前一种我们在这次分治中得到,后面一种在之后的分治中计算,就转化为了第一种路径。

    考虑枚举分治中心 $rt$ 的子节点 $u$ ,对于经过 $rt$ 的路径上的所有点 $v$ ,$u$ 都要与其计算一次贡献,可以得出 $v$的点集 是 $rt$ 不包含 $u$ 的子树的子树中所有点。

    一般我们考虑容斥或不计算 $u$ 子树内结点与 $u$ 产生的额外(或者错误)贡献。

    选取分治中心为每次分治后的树的重心,总处理结点数量为$O(nlogn)$

    树的重心用一个简单树型dp求。

    处理方法与难点:

    跟分块一样,分治之后处理是一大问题。常见的处理方式有两种:

    • 套用数据结构,对于每个分治中心维护一个动态的数据结构(如动态开点线段树,平衡树),直接区间查询修改处理子树内贡献
    • 利用排序+二分或双指针,将数据有序化并尽快找到所需的区间端点。

    两种方法各有优缺。

    对于套用数据结构,会增加 $logn$ 级别的常数,此外一般需要支持动态开点保证不爆空间。

    对于双指针,要注意扫描一次序列时间复杂度是 $O(L)$ 的,$L$ 是序列长度。而二分是 $O(logL)$ 的,如果不是在一次序列中求多对符合要求的区间,尽量使用二分。

    离散化和桶排序是点分治中会常用的思想,没思路的时候可以往这两个方面想。如果值域很大桶装不下,可以考虑将权值存出来然后排序。权值相同的元素一定相邻。

    难点在于思考出合适的处理方法。实在想不到就乱搞吧

    边分治

    思路

    与上面的点分治类似,我们选取一条边,把树尽量均匀地分成两部分(使边连接的两个子树的 $size$ 尽量接近)。然后递归处理左右子树,统计信息。

    如果是个菊花图,每次断边只会断掉一个结点,所以会被卡成 $O(n^2)$ ,而二叉树性质很优秀啊(),这时候就需要多叉转二叉(也就是三度化)。

    三度化

    三度化方式有两种。写法简单的一种是:

    把所有儿子依次加一个点串起来

    就算把所有点都加一个点串起来,我们也最多增加了 $n$ 个点, $n$ 条边,所有复杂度还是同阶的。

    新增的点和边要注意他们的值,一般将点权和边权设置为 $0$ ,也有例外,所以还是根据题目需要来。

    可以模拟一下发现,即使分治中心是虚边,也不会存在统计重复的点对。

    小细节是因为我们需要知道分治中心边的两端点,所以需要记录是第几条边。于是乎需要用到成对变换来存边。

    直观的图

    code:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    void mkmap(int x,int fa){//三度化(多叉转二叉)
    int tnd=0;
    for(auto it:og[x]){
    if(it.y==fa)continue;
    if(!tnd){
    link(x,it.y,it.w);
    link(it.y,x,it.w);
    tnd=x;//该连接的结点
    }
    else{
    ++nn;
    //赋值 !!!
    link(tnd,nn,0);link(nn,tnd,0);//赋值!!!
    link(it.y,tnd,it.w);link(tnd,it.y,it.w);
    tnd=nn;
    }
    mkmap(it.y,x);
    }
    }

    处理方法/优点

    边分治的处理方法比点分治容易,有时候还能省下为了容斥才使用到的数据结构使得复杂度降低码量。

    边分治一般不用考虑容斥,一个点在左端点的子树内,那么要统计贡献的点一定都在右端点的子树内。反之同理。所以可以左右子树分开存互不影响。

    边分治将每次的分治联通块中的点恰好分成了两部分,这就省去了像点分治那样单独处理以分治重心为路径端点的答案这一过程。

    适用/局限

    几乎所有点分治的题边分都能做(常数上有差距,但是不卡)。

    局限在于虚点虚边必须不影响答案

    点分树(动态点分治):

    定义:

    点分树是通过更改原树形态使得层数变为$logn$级别。

    点分治的过程就是构造点分树的过程。将上一层的分治中心 $u$ 与他的下一层分治中心 $v$ 连边,重构出一棵虚树。(实际上一般 $fa_v=u$ 就行)

    用途

    处理多次询问和带修的点分治问题。并且不会修改操作改变原树的形态(即不会改变每次重心的选取。)

    在点分数上向上暴力跳链复杂度是不大于 $O(logn)$ 的(因为层数不大于 $O(logn)$ )。

    对于任意一个 $y$,首先在虚树上找到它与 $x$ 的 $lca$ 该点必定在原树的 $x,y$ 路径上。

    • 看不懂的证明:$lca$ :(或者说囊括连通块同时包含 $x,y$ 的所有虚树节点中深度最深的那一个),易知在以此点为重心划分子连通块时 $x,y$会首次被分割开来

    $x$ 与某个结点在虚树上的 $lca$ 一定是 $x$ 的祖先,所以这些点都在 $x$ 的祖先 除开 $x$ 的子树的子树上(类似于点分治的味道),因为 $x$ 的祖先在 $x$子树内的结点与$x$ 的 $lca$ 不是这个祖先而是 $x$ 到这个祖先的链上(不含这个祖先)的一个结点。

    实现

    与点分治板子部分相同。只是多一个建树过程。

    处理方法

    对于一个点,我们要统计或修改其对所有虚树上祖先的贡献。这个过程可以暴力向上跳完成。

    通常我们需要统计虚树上的结点到其虚树上子节点的实树上的信息。实树上的信息与虚树上无关,例如处理虚树上的点到父亲的距离需要在实树上树链剖分求链长。

    注意事项

    实树上的信息与虚树无关,时刻警惕你需要哪棵树的信息。

    ]]>
    + 德摩根:
    $$\overline{\bigcup_{i=1}^{n}A_{i}}=\bigcap_{i=1}^{n}\overline{A_{i}}$$

    $$\overline{\bigcap_{i=1}^{n}A_{i}}=\bigcup_{i=1}^{n}\overline{A_{i}}$$

    求一个全集中所有子集的交

    $$\begin{split}
    \left|\bigcup_{i=1}^{n}S_i\right|=&\sum_{i}|S_i|-\sum_{i<j}|S_i\cap S_j|+\sum_{i<j<k}|S_i\cap S_j\cap S_k|-\cdots\
    &+(-1)^{m-1}\sum_{a_i<a_{i+1} }\left|\bigcap_{i=1}^{m}S_{a_i}\right|+\cdots+(-1)^{n-1}|S_1\cap\cdots\cap S_n|
    \end{split}$$

    $$
    \left|\bigcup_{i=1}^{n}S_i\right|=\sum_{m=1}^n(-1)^{m-1}\sum_{a_i<a_{i+1} }\left|\bigcap_{i=1}^mS_{a_i}\right|
    $$

    求一个全集中所有子集的并
    $$
    \left|\bigcap_{i=1}^{n}S_i\right|=|U|-\left|\overline{\bigcap_{i=1}^n S_i}\right|
    $$
    套用demogen定理
    $$
    =|U|-\left|\bigcup_{i=1}^n\overline{S_i}\right|
    $$

    对右边进行容斥,
    $$=\left|U\right|+\sum_{m=1}^{n}(-1)^m\sum_{a_{i}<a_{i+1}}\left|\bigcap_{i=1}^{m}\overline{S_{a_{i}}}\right|$$

    ]]>
    - <p>一种特别的分治思想,但难点不在于点分治思想本身。</p> -<p>有板子,但是板子跟题目重点几乎无关。</p> -<h2 id="点分治-淀粉质"><a href="#点分治-淀粉质" class="headerlink" title="点分治 淀粉质"></a>点分治 <de + <p>德摩根:<br>$$\overline{\bigcup_{i&#x3D;1}^{n}A_{i}}&#x3D;\bigcap_{i&#x3D;1}^{n}\overline{A_{i}}$$</p> +<p>$$\overline{\bigcap_{i&#x3D;1}^{n}A + + + + + +
    + + + 一些大运算.md + + http://cmach_socket.github.io/2024/06/14/%E4%B8%80%E4%BA%9B%E5%A4%A7%E8%BF%90%E7%AE%97-md/ + 2024-06-13T23:17:54.000Z + 2024-06-13T23:18:00.676Z + + 总体来说,也遵循提公因式和因式分解

    此外,还有一些特殊的运算

    $$\overline{x} = \frac{1}{n} \sum_{i=1}^{n} a_{i} $$

    $$s = \frac{1}{n} \sum_{i=1}^{n} (a_{i}-\overline{x})^2 $$

    则有

    $$s = \frac{1}{n} \sum_{i=1}^{n} (a_{i}^2 - 2 \overline{x}a_{i} + \overline{x}^2) $$
    $$ = \frac{1}{n} \sum_{i=1}^{n} a_{i}^2 -\frac{1}{n} \sum_{i=1}^{n} 2 \overline{x}a_{i} +\frac{1}{n} \sum_{i=1}^{n} \overline{x}^2 $$

    $$ = \frac{1}{n} \sum_{i=1}^{n} a_{i}^2 - \frac{2}{n} \overline{x} \sum_{i=1}^{n} a_{i} + \overline{x}^2 $$

    $$\because \sum_{i=1}^{n} a_{i}= n\overline{x} $$
    $$ \therefore s = \frac{1}{n} \sum_{i=1}^{n} a_{i}^2 - \overline{x}^2 $$
    $$= \frac{1}{n} \left[\sum_{i=1}^{n} a_{i}^2 - \frac{1}{n} (\sum_{i=1}^{n}a_{i})^2\right] $$

    从方差展开中可以看出:

    • 对于常数$a$ (提公因式?)

    $$na = \sum_{i=1}^{n} a$$

    • 对于数组$b,c$ (因式分解?)
      $$\sum_{i=1}^{n}b_{i}+c_{i}=\sum_{i=1}^{n}b_{i}+\sum_{i=1}^{n}c_{i}$$

    下列两式由上面两式推导得来:

    • 对于常数$a$,数组$b$
      $$\sum_{i=1}^{n}a\times b_{i}=a\sum_{i=1}^{n} b_{i}$$

    • 对于常数$a$,数组$b$
      $$\sum_{i=1}^{n}(b_{i}+a)=na+\sum_{i=1}^{n}b_{i}$$

    • 此外
      $$\sum_{i=1}^{n}a_{i}^2 \neq (\sum_{i=1}^{n}a_{i})^2 $$

    连乘符号:

    没有什么较复杂的变化,但是有一个简单的公式

    • 对于常数$a$
      $$\prod_{i=1}^{n} a = a^n$$

    • 对于常数n
      $$ n! =\prod_{i=1}^{n}i $$

    了解到的:

    • 断裂:对于数组a
      $$\prod_{i=1}^{n}a_{i} = \frac{\prod_{j=1}^{n+m}a_{j}}{\prod_{k=1}^{m}a_{k}}$$
      上式也可以写成这样:
      $$\prod_{i=0}^{m-1}(n-i) = \frac{\prod_{i=1}^{n}i}{\prod_{j=1}^{n-m}j}$$
      前面n-m是不乘的,后面有m个

    转化一下:
    $$\prod_{i=0}^{m-1}(n-i) = \frac{n!}{(n-m)!}$$
    排列公式

    连加版:
    $$\sum_{i=1}^{n}a_{i} = \sum_{j=1}^{n+m}a_{j}-
    \sum_{k=1}^{m}a_{k}$$

    ]]>
    + + + + + <p>总体来说,也遵循提公因式和因式分解</p> +<p>此外,还有一些特殊的运算</p> +<p>设</p> +<p>$$\overline{x} &#x3D; \frac{1}{n} \sum_{i&#x3D;1}^{n} a_{i} $$</p> +<p>$$s &#x3D; \f + + + + + +
    + + + hash.md + + http://cmach_socket.github.io/2024/06/13/hash-md/ + 2024-06-13T14:41:16.000Z + 2024-06-13T14:41:18.608Z + + 单hash

    定义了上面的两个数组,首先 hash[i] 表示前 i 个字符的字串的hash 值。而 p[i] 表示 $Base ^ i$ 

    那么对应的 Hash 公式为:

    $$hash[i] = (hash[i-1] * Base + idx(s[i])) % MOD$$

    对于此种Hash方法,将Base和MOD尽量取大即可,这种情况下,冲突的概率是很低的。

    双Hash

    用字符串Hash,最怕的就是,出现冲突的情况,即不同字符串却有着相同的hash值,这是我们不想看到的。所以为了降低冲突的概率,可以用双Hash方法。

    将一个字符串用不同的Base和MOD,hash两次,将这两个结果用一个二元组表示,作为一个总的Hash结果。

    相当于我们用不同的Base和MOD,进行两次 单Hash方法 操作,然后将得到的结果,变成一个二元组结果,这样子,我们要看一个字符串,就要同时对比两个 Hash 值,这样子出现冲突的概率就很低了。

    那么对应的 Hash 公式为:

    $$hash1[i] = (hash1[i-1] * Base1 + idx(s[i])) % MOD1$$

    $$hash2[i] = (hash2[i-1] * Base2 + idx(s[i])) % MOD2$$

    映射的Hash结果为:$<hash1[i], hash2[i]>$

    这种Hash很安全。

    构造hash时的递推式:

    $$hash[i] = hash[i-1] * Base + idx (s[i])$$

    获取子串的Hash

    $O(1)$

    上面我们得到的 Hash值都是前 i 个字符的字串,那么如果我们想获取 [l,r] 范围中的字串的Hash值,应该如何做。(利用Hash值,我们可以O(1) 时间来获取某个字串。)

    例子

    假设有一个 $S = s_{1}s_{2}s_{3}s_{4}s_{5}$ 的字符串,根据定义,获取其 Hash值如下(先忽略MOD):

    $hash[0] = 0$

    $hash[1] = s_1$

    $hash[2] = s_1 * Base + s2$

    $hash[3] = s_1 * Base^2 + s2 * Base + s_3$

    $hash[4] = s_1 * Base^3 + s2 * Base^2 + s_3 * Base + s_4$

    $hash[5] = s_1 * Base^4 + s2 * Base^3 + s_3 * Base^2 + s_4 * Base + s_5$

    现在我们想求字串 $s_3s_4$ 的hash值,不难得出为 $s_3 * Base + s4$ ,并且从上面观察,如果看$hash[4] - hash[2]$并将结果的多余$s_1,s_2$的系数全部消掉,就是所求。所以问题就转化成,将$hash[2]$乘一个关于$Base$的系数,在做差的时候将多余项消除,从而得到结果。

    不难发现,对应项系数只差一个 $Base^2$ ,而$4 - 2 = 2$(待求hash子串下标相减即可),

    $$hash[4] - hash[2] * Base^2$$

    至此,通过对上例的归纳,可以得出如下的公式。

    $$res = hash[r] - hash[l-1] * Base^{r - l + 1}$$

    取模,但是有减法:

    $$res = ((hash[r] - hash[l-1] * Base^{r - l + 1}) % MOD + MOD) % MOD$$

    预处理$Base^i$,降低$Base$幂的计算

    ]]> + + + + + <h2 id="单hash"><a href="#单hash" class="headerlink" title="单hash"></a>单hash</h2><p>定义了上面的两个数组,首先 hash[i] 表示前 i 个字符的字串的hash 值。而 p[i] 表示 $Base + + + + + + + + + 矩阵乘法.md + + http://cmach_socket.github.io/2024/06/13/%E7%9F%A9%E9%98%B5%E4%B9%98%E6%B3%95-md/ + 2024-06-13T14:41:02.000Z + 2024-06-13T14:41:06.161Z + + $A_{i,j}=c$ 表示 将$c$倍$f_{j}$转移到$f_{i}$

    ]]>
    + + + + + <p>$A_{i,j}&#x3D;c$ 表示 将$c$倍$f_{j}$转移到$f_{i}$</p> + + + + + + +
    + + + FHQ-Treap.md + + http://cmach_socket.github.io/2024/06/13/FHQ-Treap-md/ + 2024-06-13T14:40:46.000Z + 2024-06-13T14:40:49.201Z + + 依赖分裂合并的tree+heap(听起来像ODT)

    核心操作:

    分裂:

    一种是按权值分裂,一种是按排名分裂

    根据粉兔的博客,发现权值操作都可以通过rank转化为排名

    于是乎只打排名了

    当前需要的排名比左儿子数量大,即左子树和其本身归为第一颗分裂树,进入右子树

    反之同理,上述过程可以用BST性质解释

    通过BST的性质,也可以知道传下来的引用就是两颗子树预备插入节点

    合并:

    treap以随机化id来构造期望平衡的BST,合并的时候第一颗树的所有节点一定比第二颗树小,

    于是合并时候只需考虑合并节点的 $id$

    左子树 $id$ 小,将右子树挂载到右儿子下,右子树 $id$ 小,则将左子树挂载到右子树左儿子上,可以保证满足BST性质

    通过这两个操作可以完成各种操作,并且本身支持区间(分裂出来就是一个一个一个区间啊啊啊啊啊啊啊)和可持续化。

    基本操作:

    查询x的排名 :

    由于没有权值分裂,所以需要递归查找,通过BST的性质,每次递归进入一个子树

    注意:这样查询是查询到$\leq v$的最末尾

    插入 :

    构建一个节点,然后查询权值所在排名,将树分裂成两颗,将这两颗树与节点合并

    删除 :

    将树分裂成$v,v-1$三颗,删除中间等于$v$的那棵

    如果只删除一个的话,可以合并中间那棵的左右子树,将根节点丢掉

    然后再合并起来

    垃圾回收?不存在的()

    第k小 :

    直接分裂成$k,k-1$三颗子树,输出中间那棵,再全部合并起来

    前驱 :

    1
    kth(rank(root,v-1))

    后继 :

    1
    kth(rank(root,v)+1)

    注意:后继不可以查询$rank(root,v+1)$,很可能后继比$v+1$大,rank又是查找到$<=v+1$的最末尾

    由于前驱一定$\leq v-1$,所以可以直接查询$rank(root,v-1)$

    注意事项:

    查询一个数的排名一定要查询$rank(root,v-1)+1$,不然会查到相同元素的最末尾去

    一些感受:

    实际上,fhq-treap根本不是按照中序遍历排序的。这个中序遍历只是人为规定的。

    真正决定二叉树形态的是随机值,但不是唯一决定的。

    对于权值fhq-treap来说,权值也是确定二叉树形态的条件,

    对于排名fhq-treap来说,排名也是确定二叉树形态的条件。

    当用$rank()$函数决定位置fhq-treap来说,排名与权值绑定,也可以看作为权值确定,那么这样建的树不是说他由中序遍历决定算法而是由算法决定他中序遍历是排序后的序列

    于是,可以得出,排名fhq-treap的建立只与$rank()$有关,没有$rank()$只与插入位置有关,也就是说,rank()也可以决定二叉树的形态,没有$rank()$就默认以位置决定二叉树形态,

    所以,可能有这么一道题,他要维护一种非常特殊的序列,可能需要中间大两边小,或者说十进制位数单调递增,这些fhq-treap都是可以维护的

    ]]>
    + + + + + <p>依赖分裂合并的tree+heap(听起来像ODT)</p> +<h2 id="核心操作:"><a href="#核心操作:" class="headerlink" title="核心操作:"></a>核心操作:</h2><p>分裂:</p> +<p>一种是按权值分裂,一种是按排 + + + + + +
    + + + 图上二分.md + + http://cmach_socket.github.io/2024/06/13/%E5%9B%BE%E4%B8%8A%E4%BA%8C%E5%88%86-md/ + 2024-06-13T14:40:28.000Z + 2024-06-13T14:40:31.638Z + + 一般是二分边或者点的权值。属于二分答案

    设 $check$ 为检测值,

    当 $it.w>check$ 或者 $a[it.y]>check$ 时,走或者不走

    用于解决最大值最小或者最小值最大的问题。

    二分正确性:答案在边权或者点权的值域上,值域是单调的

    ]]>
    + + + + + <p>一般是二分边或者点的权值。属于二分答案</p> +<p>设 $check$ 为检测值,</p> +<p>当 $it.w&gt;check$ 或者 $a[it.y]&gt;check$ 时,走或者不走</p> +<p>用于解决最大值最小或者最小值最大的问题。</p> +<p>二分正确 + + + + + +
    + + + 2-SAT.md + + http://cmach_socket.github.io/2024/06/13/2-SAT-md/ + 2024-06-13T14:40:05.000Z + 2024-06-13T14:40:11.505Z + + 思路类似于差分约束,将数学问题转化为图论问题

    也是判环来判断可行性

    建图+tarjan

    为什么不用spfa判环?

    tarjan算法更优秀 $O(n+m)$ ,并且tarjan序就是反拓扑序,方便求解

    2-sat问题

    指每一个变量存在两种状态(2),这些变量需要满足一些条件(sat)

    这些条件是逻辑条件:or,xor,and

    2-sat问题转化

    所有的逻辑关系都可以转化为这样的形式:选择了A,则必须选择B

    从A到B连一条边,就可以表示这样的关系

    若存在环内有一个变量的两个状态,则说明有一个无法满足的依赖链(例如 选$A_1$必选$B_2$ …. 选
    $B_2$必选$A_2$),这时选$A_1$也不行,选$A_2$也不行

    2-sat的一种解:

    选择拓扑序较大的那一个,可以避免冲突(如果选了较小的一个,有可能会有一条路径会连通这个
    变量的两个状态)

    tarjan使用了栈,与拓扑使用的队列是相反的,所以说tarjan强连通分量的顺序就是反拓扑序

    update:2-sat是离线的,不能代替扩展域并查集

    ]]>
    + + + + + <p>思路类似于差分约束,将数学问题转化为图论问题</p> +<p>也是判环来判断可行性</p> +<p><strong>建图+tarjan</strong></p> +<p>为什么不用spfa判环?</p> +<p>tarjan算法更优秀 $O(n+m)$ ,并且tarjan序就是反拓 + + + + + +
    + + + 差分约束系统.md + + http://cmach_socket.github.io/2024/06/13/%E5%B7%AE%E5%88%86%E7%BA%A6%E6%9D%9F%E7%B3%BB%E7%BB%9F-md/ + 2024-06-13T14:39:49.000Z + 2024-06-13T14:39:53.775Z + + 差分约束系统


    $x_1-x_2 \leq y_1$

    $x_i-x_j \leq y_i$

    将$x_i-xj \leq y_i$ 移项,得

    $x_i \leq x_j+y_i$

    可建立一条从$x_j$到$x_i$的路径,权值为$y_2$

    将线性规划问题转化为图论问题


    差分约束系统的转化:

    • $x_1-x_2 \geq y \to x_2-x_1 \leq -y_1$

    • $x_1 = x_2 \to x_1-x_2 \leq 0 \quad and \quad x_2-x_1 \leq 0$

    • $x_1 - x_2 < y \to x_1-x_2 \leq y-1$ (整数解)

    • $x_1-x_2>y \to x_2-x_1 \leq -y-1$ (整数解)

    对于差分约束系统,有解就必定有无数解

    证明:

    若 存在一组解 ${x_1,x_2,x_3,…,x_{n-1},x_n}$

    则 ${x_1+k,x_2+k,x_3+k,…,x_{n-1}+k,x_n+k}$ 也是该差分约束系统的解

    无解的情况即存在负权环,因为此时SPFA无解

    启用超级源点 $0$ ,设置$dis_0=w$,向所有节点添加边为 $x_i-x_0 \leq 0 (i|n)$

    由于$dis_0=w$,则$x_0=w$ (一般设$w=0$);

    对于所有的 $x_i,x_i \leq x_0$ 即 $x_i \leq w$

    相应地加上$k$ ,即得到非负解

    求最短路,相当于求最大解

    求最长路,相当于求最小解

    注意:求最长路,要转化为$x_1 \geq x_2+y$的形式

    一些理解:

    观察这个式子:$x1 \leq x2+y1$,发现如果按图论来说,从$x2$点到$x1$点最多需要走$y1$的路的,如果从$x2$点到$x1$点建立一条长$y1$的路,多的远路不能走,但是少的远路能走,这就构成了最短路算法的松弛基础。于是乎才能使用最短路去求解的。反之最长路就是多的远路能走,短远路不能走,所以是$x_1 \geq x_2+y$

    ]]> + + + + + <h2 id="差分约束系统"><a href="#差分约束系统" class="headerlink" title="差分约束系统"></a>差分约束系统</h2><hr> +<p>$x_1-x_2 \leq y_1$</p> +<p>…</p> +<p>$x_i-x_j \leq + + + + + + + + + 树型DP和缩点后树型DP.md + + http://cmach_socket.github.io/2024/06/13/%E6%A0%91%E5%9E%8BDP%E5%92%8C%E7%BC%A9%E7%82%B9%E5%90%8E%E6%A0%91%E5%9E%8BDP-md/ + 2024-06-13T14:39:21.000Z + 2024-06-13T14:39:26.432Z + + 基本的方程:

    $f[u]=\sum_{v \in son(u)}f[v]+calc(v)$

    $f[u]=\max_{v \in son(u)}f[v]+calc(v)$

    [CTSC1997] 选课

    题目描述

    在大学里每个学生,为了达到一定的学分,必须从很多课程里选择一些课程来学习,在课程里有些课程必须在某些课程之前学习,如高等数学总是在其它课程之前学习。现在有 $N$ 门功课,每门课有个学分,每门课有一门或没有直接先修课(若课程 a 是课程 b 的先修课即只有学完了课程 a,才能学习课程 b)。一个学生要从这些课程里选择 $M$ 门课程学习,问他能获得的最大学分是多少?

    输入格式

    第一行有两个整数 $N$ , $M$ 用空格隔开。( $1 \leq N \leq 300$ , $1 \leq M \leq 300$ )

    接下来的 $N$ 行,第 $I+1$ 行包含两个整数 $k_i $和 $s_i$, $k_i$ 表示第I门课的直接先修课,$s_i$ 表示第I门课的学分。若 $k_i=0$ 表示没有直接先修课($1 \leq {k_i} \leq N$ , $1 \leq {s_i} \leq 20$)。

    输出格式

    只有一行,选 $M$ 门课程的最大得分。

    样例 #1

    样例输入 #1

    1
    2
    3
    4
    5
    6
    7
    8
    7  4
    2 2
    0 1
    0 4
    2 1
    7 1
    7 6
    2 2

    样例输出 #1

    1
    13

    $f[u][i]=max^{n}_{i=1}f[u][i-j]+f[v][j]$

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    #include<stdio.h>
    #include<algorithm>
    #include<list>
    #define MAXN 305
    using namespace std;
    list<int>g[MAXN];
    int tx,tw,ty,n,m,a[MAXN],siz[MAXN],f[MAXN][MAXN];
    void dfs(int x){
    siz[x]=1,f[x][1]=a[x];
    for(auto it:g[x]){
    dfs(it);
    siz[x]+=siz[it];
    }
    }
    inline void solve(int x){
    for(auto it:g[x]){
    solve(it);
    for(int i=min(siz[x],m+1);i>=0;i--){
    for(int j=min(siz[it],i-1);j>=0;j--){
    f[x][i]=max(f[x][i],f[x][i-j]+f[it][j]);
    }
    }
    }
    }
    inline void link(int x,int y){
    g[x].emplace_back(y);
    }
    int main(){
    scanf("%d%d",&n,&m);
    for(int i=1;i<=n;i++){
    scanf("%d%d",&ty,&a[i]);
    link(ty,i);
    }
    dfs(0);
    solve(0);
    printf("%d",f[0][m+1]);
    return 0;
    }

    强连通分量的缩点

    • 将非DAG图处理为DAG

    • 可以跑拓扑排序和一些其他的算法

    局限性:
    不可以缩有效性的环

    采蘑菇

    题目描述

    小胖和 ZYR 要去 ESQMS 森林采蘑菇。

    ESQMS 森林间有 $N$ 个小树丛,$M$ 条小径,每条小径都是 单向 的,连接两个小树丛,上面都有一定数量的蘑菇。小胖和 ZYR 经过某条小径一次,可以采走这条路上所有的蘑菇。由于 ESQMS 森林是一片神奇的沃土,所以一条路上的蘑菇被采过后,又会长出一些新的蘑菇,数量为原来蘑菇的数量乘上这条路的“恢复系数”,再下取整。

    比如,一条路上有 $4$ 个蘑菇,这条路的“恢复系数”为 $0.7$,则第一~四次经过这条路径所能采到的蘑菇数量分别为 $4,2,1,0$。

    现在,小胖和 ZYR 从 $S$ 号小树丛出发,求他们最多能采到多少蘑菇。

    输入格式

    第一行两个整数,$N$ 和 $M$。

    第二行到第 $M+1$ 行,每行四个数,分别表示一条小路的起点,终点,初始蘑菇数,恢复系数。

    第 $M+2$ 行,一个整数 $S$。

    输出格式

    一行一个整数,表示最多能采到多少蘑菇,保证答案不超过 $(2^{31}-1)$。

    样例 #1

    样例输入 #1

    1
    2
    3
    4
    5
    3 3
    1 2 4 0.5
    1 3 7 0.1
    2 3 4 0.6
    1

    样例输出 #1

    1
    8

    提示

    对于 $30%$ 的数据,$N\le 7$,$M\le15$

    另有 $30%$ 的数据,满足所有“恢复系数”为 $0$。

    对于 $100%$ 的数据,$1
    \le N\le 8\times 10^4$,$1\le M\le 2\times 10^5$,$0\le\text{恢复系数}\le 0.8$ 且最多有一位小数, $1\le S\le N$。

    $f[u]=a[u]+max_{i=1}^{n}f[v]+it.w$

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87

    #include<stdio.h>
    #include<list>
    #include<stack>
    #include<algorithm>
    #define MAXN 200005
    #define PPP puts("FUCK");
    using namespace std;
    class node{
    public:
    int y,w;
    node(int yy,int ww){
    y=yy,w=ww;
    }
    };
    list<int>g[MAXN];
    list<node>ng[MAXN];
    stack<int>st;
    int xs[MAXN];
    long double h;
    int e[MAXN],a[MAXN],n,m,tx,low[MAXN],dfn[MAXN],cnt,tot,bel[MAXN],f[MAXN],s,dp[MAXN];
    bool vis[MAXN],v[MAXN];
    void tarjan(int x){
    low[x]=dfn[x]=++cnt;
    st.push(x);
    vis[x]=1;
    for(auto it:g[x]){
    if(!dfn[e[it]]){
    tarjan(e[it]);
    low[x]=min(low[e[it]],low[x]);
    }
    else if(vis[e[it]]){
    low[x]=min(dfn[e[it]],low[x]);
    }
    }
    if(dfn[x]==low[x]){
    int now;
    tot++;
    do{
    now=st.top();
    st.pop();
    vis[now]=0;
    bel[now]=tot;
    }while(x!=now);
    }
    }//强连通分量
    inline void mkmap(){
    for(int i=1;i<=n;i++){
    for(auto it:g[i]){
    if(bel[i]==bel[e[it]]){
    while(a[it]){
    ///PPP
    f[bel[i]]+=a[it];
    a[it]=a[it]*xs[it]/10;
    }
    }
    else{
    ng[bel[i]].emplace_back(node(bel[e[it]],a[it]));
    }
    }
    }
    }//重建图
    inline void dfs(int x){
    v[x]=1;
    for(auto it:ng[x]){
    if(!v[it.y]){
    dfs(it.y);
    }
    dp[x]=max(dp[x],dp[it.y]+it.w);
    }
    dp[x]+=f[x];
    }//DP
    int main(){
    scanf("%d%d",&n,&m);
    for(int i=1;i<=m;i++){
    scanf("%d%d%d%Lf",&tx,&e[i],&a[i],&h);
    g[tx].emplace_back(i);
    xs[i]=h*10;
    }
    scanf("%d",&s);
    for(int i=1;i<=n;i++)if(!dfn[i])tarjan(i);
    mkmap();
    dfs(bel[s]);
    printf("%d",dp[bel[s]]);
    return 0;
    }

    缩点后树型DP注意事项:

    1.无环

    2.无后效性

    [JSOI2010]连通数

    题目背景

    本题数据过水,可前往 https://www.luogu.com.cn/problem/U143178 提交

    $\text{upd 2022.8.4}$:已作为 Hack 数据合并进来。

    题目描述

    度量一个有向图连通情况的一个指标是连通数,指图中可达顶点对个的个数。

    如图

    qwq

    顶点 $1$ 可达 $1, 2, 3, 4, 5$

    顶点 $2$ 可达 $2, 3, 4, 5$

    顶点 $3$ 可达 $3, 4, 5$

    顶点 $4, 5$ 都只能到达自身。

    所以这张图的连通数为 $14$。

    给定一张图,请你求出它的连通数

    输入格式

    输入数据第一行是图顶点的数量,一个正整数 $N$。
    接下来 $N$ 行,每行 $N$ 个字符。第 $i$ 行第 $j$ 列的 1 表示顶点 $i$ 到 $j$ 有边,0 则表示无边。

    输出格式

    输出一行一个整数,表示该图的连通数。

    样例 #1

    样例输入 #1

    1
    2
    3
    4
    3
    010
    001
    100

    样例输出 #1

    1
    9

    提示

    对于 $100 %$ 的数据,$1 \le N \le 2000$。

    u,i

    =1

    =0

    $f[u][i]=f[v][i] or f[u][i]$

    1 01 010 01 01

    bitset 1/8

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98

    #include<stdio.h>
    #include<algorithm>
    #include<stack>
    #include<list>
    #include<iostream>
    #include<string>
    #include<bitset>
    #define MAXN 2005
    #define PPP puts("GUCK");
    using namespace std;
    list<int>g[MAXN];
    list<int>ng[MAXN];
    stack<int>st;
    int n,m,ans,tx,tot,dfn[MAXN],low[MAXN],cnt,f[MAXN],bel[MAXN],in[MAXN];
    string s;
    bool vis[MAXN],v[MAXN];
    bitset<MAXN>dp[MAXN];
    inline void link(int x,int y){
    g[x].emplace_back(y);
    }
    inline void tarjan(int x){
    low[x]=dfn[x]=++cnt;
    st.push(x);
    vis[x]=1;
    for(auto it:g[x]){
    if(!dfn[it]){
    tarjan(it);
    low[x]=min(low[x],low[it]);
    }
    else if(vis[it]){
    low[x]=min(low[x],dfn[it]);
    }
    }
    if(low[x]==dfn[x]){
    int now;
    tot++;
    dp[tot][tot]=1;
    do{
    now=st.top();
    vis[now]=0;
    st.pop();
    bel[now]=tot;
    f[tot]++;
    }while(x!=now);
    }
    }
    inline void mkmap(){
    for(int i=1;i<=n;i++){
    for(auto it:g[i]){
    if(bel[i]!=bel[it]){
    dp[bel[i]][bel[it]]=1;
    ng[bel[i]].emplace_back(bel[it]);
    in[bel[it]]++;
    // printf("%d %d %d %d %d %d %d\n",i,it,bel[i],bel[it],in[bel[i]],in[bel[it]],bel[it]);
    }
    }
    }
    }
    inline void dfs(int x){
    v[x]=1;
    //dp[x]=f[x];
    //printf("%d %d df\n",dp[x],x);
    for(auto it:ng[x]){
    if(!v[it])dfs(it);
    dp[x]|=dp[it];
    }
    }
    int main(){
    scanf("%d",&n);
    for(int i=1;i<=n;i++){
    cin>>s;
    for(int j=0;j<s.size();j++){
    if(s[j]=='1'){
    //printf("%d %d %d dfdd\n",s[j],i,j+1);
    link(i,j+1);
    }
    }
    //link(i,i);
    }
    for(int i=1;i<=n;i++)if(!dfn[i])tarjan(i);
    mkmap();
    for(int i=1;i<=tot;i++){
    //printf("%d \n",in[i]);
    if(!in[i]){
    dfs(i);
    }
    }
    for(int i=1;i<=tot;i++){
    for(int j=1;j<=tot;j++){
    if(dp[i][j])
    ans+=f[i]*f[j];//printf("%d %d %d\n",i,j,ans);
    }
    }
    printf("%d",ans);
    return 0;
    }

    总结一下:

    适用:

    有环有向图,同时环内的贡献是一致的

    优点:

    • 将非DAG图处理为DAG

    • 可以跑拓扑排序和一些其他的算法

    局限性:

    • 不可以缩有效性的环
    • 不可以跑有后效性的DAG图
    ]]>
    + + + + + <p>基本的方程:</p> +<p>$f[u]&#x3D;\sum_{v \in son(u)}f[v]+calc(v)$</p> +<p>$f[u]&#x3D;\max_{v \in son(u)}f[v]+calc(v)$</p> +<h1 id="CTSC1997-选课"><a + + + + + +
    + + + 整除分块.md + + http://cmach_socket.github.io/2024/06/13/%E6%95%B4%E9%99%A4%E5%88%86%E5%9D%97-md/ + 2024-06-13T14:38:57.000Z + 2024-06-13T14:39:03.325Z + + 数论分块结论
    对于常数 n,使得式子

    $$\left\lfloor\dfrac ni\right\rfloor=\left\lfloor\dfrac nj\right\rfloor$$

    成立的最大的满足 $i\leq j\leq n$ 的 $j$ 的值为 $\left\lfloor\dfrac n{\lfloor\frac ni\rfloor}\right\rfloor$。

    即值

    $$\left\lfloor\dfrac ni\right\rfloor$$
    所在的块的右端点为

    $$\left\lfloor\dfrac n{\lfloor\frac ni\rfloor}\right\rfloor$$

    ]]>
    + + + + + <p>数论分块结论<br>对于常数 n,使得式子</p> +<p>$$\left\lfloor\dfrac ni\right\rfloor&#x3D;\left\lfloor\dfrac nj\right\rfloor$$</p> +<p>成立的最大的满足 $i\leq j\leq + + + + + +
    + + + 排列与组合.md + + http://cmach_socket.github.io/2024/06/13/%E6%8E%92%E5%88%97%E4%B8%8E%E7%BB%84%E5%90%88-md/ + 2024-06-13T14:38:21.000Z + 2024-06-13T14:38:32.512Z + + 排列:

    从集合{a,b,c}中取2个元素的排列有ab,ac,ba,bc,ca,cb

    换言之,元素顺序对于排列是有影响的

    考虑当前排列,第一个位置有N个选择,第二个位置去除第一个还有N-1种选择,以此类推到第M个还有N-M+1个选择

    可以得到公式

    $$A_{N}^{M} = \prod_{i=0}^{m-1}(n-i) = \frac{\prod_{i=1}^{n}i}{\prod_{j=1}^{n-m}j}$$
    前面n-m是不乘的,后面有m个
    转化一下:
    $$A_{N}^{M} = \frac{n!}{(n-m)!}$$

    组合:

    从集合${A,b,c}$中取$2$个元素的组合有${a,b},{a,c},{b,c}$
    换言之,元素顺序对于排列无影响

    • 公式推导:

      对于排列A中每一个排列,它具有相同元素的不同排列总共有N!个

      • 证明:

        相当于从N中选取N个元素,即
        $$A_{N}^{N}=\frac{n!}{(n-n)!}=n!$$

      所以可以得到公式:
      $$C_{N}^{M}=A_{N}^{M}/m!$$
      $$C_{N}^{M}=\frac{n!}{m!(n-m)!}$$

    • 性质:
      $$C_{N}^{M}=C_{N}^{N-M}$$

    最好的预处理方式:

    1
    2
    3
    4
    5
    6
    7
    8
    c[1][0]=c[1][1]=c[0][0]=1;
    for(int i=2;i<=mn;i++){
    c[i][0]=1;
    for(int j=1;j<=i;j++){
    c[i][j]=(c[i-1][j]+c[i-1][j-1])%k;
    if(!c[i][j])s[i][j]++;
    }
    }

    前缀和要加上

    1
    s[i][i+1]=s[i][i];

    因为三角形

    1
    s[i-1][j]

    为$0$

    $$C^M_N=C^{N-M}_N$$

    • 证明:

      将原本的每个组合都反转,把原来没选的选上,原来选了的去掉,这样就变成从n个元素种取出n−m个元素,显然方案数是相等的。

    $$C_{N}^{M}=C_{N-1}^{M}+C_{N-1}^{M-1}$$

    • 证明:

      可理解为:含特定元素的组合有$C_{N-1}^{M-1}$,不含特定元素的排列为$C_{N-1}^{M}$。

      第一个:由于必选这个元素,看作可以把这个元素去掉的排列$(M-1)$,剩下有$(N-1)$个元素可选

      第二个: 去掉这个元素,剩下$C_{N-1}^{M}$种组合

    $$ 2^n = \sum_{i=1}^{n}C_{n}^{i} $$

    相当于从n个球中随便抽出几个球,问可能的组合有多少

    对于每个球,有选和不选两种状态,根据乘法原理,总共有$2 \times 2 \times…\times 2 \quad (n个2)$种取法,即$2^n$

    第二类斯特林数

    1.定义

    第二类斯特林数 表示的是把 $n$ 个不同的元素划分到 $m$ 个集合的方案数。

    2.递推式

    考虑元素的编号是 $1$ 到 $n$ ,那么这 $n$ 个元素排成 $m$ 个集合有两种情况,我们考虑第 $n$ 个元素:

    第 $n-1$ 个元素单独形成一个新的集合,显然方案数是 $S_2(n-1,m-1)$ 。

    第 $n$ 个元素在之前已经形成的集合中,显然有 $m$ 种方法可以选,方案数是 $m \times S_2(n-1,m)$ 。

    综上我们可以得到

    $$S_2(n,m)=S_2(n-1,m-1)+m \times S_2(n-1,m)$$

    我们也可以得到边界条件:

    • $S_2(n,n)=1 (n \geq 0)$

    表示 $n$ 个球和 $n$ 个盒子

    • $S_2(n,0)=0 (n \geq 1)$

    表示没有盒子

    3.应用举例

    第二类斯特林数主要是用于解决组合数学中的放球模型

    1. $n$ 个不同的球放到 $m$ 个无区别的盒子,不允许盒子为空

    $$S_2(n,m)$$

    1. $n$ 个不同的球放到 $m$ 个有区别的盒子,不允许盒子为空

    $$m! \times S_2(n,m) $$

    ]]> + + + + + <h2 id="排列"><a href="#排列" class="headerlink" title="排列:"></a>排列:</h2><p>从集合{a,b,c}中取2个元素的排列有ab,ac,ba,bc,ca,cb</p> +<p>换言之,元素顺序对于排列是有影响的</p> +< @@ -56,23 +286,97 @@ - Hello World - - http://cmach_socket.github.io/2024/06/13/hello-world/ - 2024-06-13T10:57:55.002Z - 2024-06-13T10:57:55.002Z + 众数二进制拆分.md + + http://cmach_socket.github.io/2024/06/13/%E4%BC%97%E6%95%B0%E4%BA%8C%E8%BF%9B%E5%88%B6%E6%8B%86%E5%88%86-md/ + 2024-06-13T14:37:22.000Z + 2024-06-13T14:37:40.776Z - Welcome to Hexo! This is your very first post. Check documentation for more info. If you get any problems when using Hexo, you can find the answer in troubleshooting or you can ask me on GitHub.

    Quick Start

    Create a new post

    1
    $ hexo new "My New Post"

    More info: Writing

    Run server

    1
    $ hexo server

    More info: Server

    Generate static files

    1
    $ hexo generate

    More info: Generating

    Deploy to remote sites

    1
    $ hexo deploy

    More info: Deployment

    ]]>
    + 这个方法就是 二进制拆分。

    对于一个众数,因为它在原序列中的出现次数超过了一半,那么 对于每一个二进制位来说,众数在这一位上对应的值也超过了一半。

    简要复述一下该方法:对于一个序列 $a$,对于每个二进制位 $b$,求有多少个数该位是 $1$,记作 $cntb$​。

    存在绝对众数 $m$ 时,如果 $m$ 某一位是 $1$,那么 $cntb$​ 一定过半,反则一定不过半。

    ]]>
    - <p>Welcome to <a href="https://hexo.io/">Hexo</a>! This is your very first post. Check <a href="https://hexo.io/docs/">documentation</a> for + <p>这个方法就是 二进制拆分。</p> +<p>对于一个众数,因为它在原序列中的出现次数超过了一半,那么 对于每一个二进制位来说,众数在这一位上对应的值也超过了一半。</p> +<p>简要复述一下该方法:对于一个序列 $a$,对于每个二进制位 $b$,求有多少个数该位是 $1$,记 + + +
    + + + 根号算法相关.md + + http://cmach_socket.github.io/2024/06/13/%E6%A0%B9%E5%8F%B7%E7%AE%97%E6%B3%95%E7%9B%B8%E5%85%B3-md/ + 2024-06-13T14:36:48.000Z + 2024-06-13T14:37:45.156Z + + 分块相关

    分块

    思想简单,题目复杂。

    根号分治

    根号算法——不只是分块。

    有时我们会碰到这样一类问题,长度为$n$的序列,$m$
    个询问(通常$n$和$m$同阶),可能存在两种比较显然的方法,一种是$O(n^2)$预处理$O(1)$
    回答,一种是不预处理$O(n)$回答$m$个询问,这两种方法都是$O(n^2)$的。考虑是否存在一种策略能“平衡”一下预处理和询问的复杂度。

    莫队相关:

    莫队

    never gonna give you up

    不是将询问分成 $\sqrt{q}$块,而是把询问的 $l$ 分成$\sqrt{n}$块,保证每次l的变化在$\sqrt{n}$内

    通过奇偶性排序,单数块r正序排序,偶数块r倒序排序,可以进一步优化复杂度,r指针来回扫嘛

    注意:

    在$del()$和$add()$时记得判断是先操作再变化还是先变化再操作

    栗子:

    1
    2
    3
    4
      while(l<q[i].l)del(a[l++]);
    while(l>q[i].l)add(a[--l]);
    while(r<q[i].r)add(a[++r]);
    while(r>q[i].r)del(a[r--]);

    回滚莫队

    有些题目在区间转移时,可能会出现增加或者删除无法实现的问题。在只有增加不可实现或者只有删除不可实现的时候,就可以使用回滚莫队在 $O(n \sqrt m)$ 的时间内解决问题。回滚莫队的核心思想就是:既然只能实现一个操作,那么就只使用一个操作,剩下的交给回滚解决。

    一般可以直接暴力记录下在块头的状态。

    莫队套分块

    莫队询问通常是 $O(1)$ 的,如果移动指针查询要带 $log$ ,可以差分操作将查询变成单点,询问变成区间。通过分块来完成复杂度平衡。

    ]]> + + + + + <h2 id="分块相关:"><a href="#分块相关:" class="headerlink" title="分块相关:"></a><strong>分块相关</strong>:</h2><h2 id="分块"><a href="#分块" class="headerlink" + + + + + + + + + + + 一般启发式合并.md + + http://cmach_socket.github.io/2024/06/13/%E4%B8%80%E8%88%AC%E5%90%AF%E5%8F%91%E5%BC%8F%E5%90%88%E5%B9%B6-md/ + 2024-06-13T14:35:30.000Z + 2024-06-13T14:38:07.962Z + + 启发式合并就是在合并的时候将size小的那个集合合并到size大的那个集合里面。

    复杂度居然是$O(n log n)$的

    ]]>
    + + + + + <p>启发式合并就是在合并的时候将size小的那个集合合并到size大的那个集合里面。</p> +<p>复杂度居然是$O(n log n)$的</p> + + + + + + + + +
    + + + 树分治相关 + + http://cmach_socket.github.io/2024/06/13/%E6%A0%91%E5%88%86%E6%B2%BB%E7%9B%B8%E5%85%B3/ + 2024-06-13T12:25:28.000Z + 2024-06-13T13:40:42.487Z + + 一种特别的分治思想,但难点不在于点分治思想本身。

    有板子,但是板子跟题目重点几乎无关。

    点分治 淀粉质

    用途

    用于处理树上多对点询问或寻找有条件最远(最近)点对。主要是处理多对点对。

    做法

    我们先选择一个节点作为根节点 $rt$ ,所有完全位于其子树中的路径可以分为两种,一种是经过当前根节点的路径,一种是不经过当前根节点的路径。前一种我们在这次分治中得到,后面一种在之后的分治中计算,就转化为了第一种路径。

    考虑枚举分治中心 $rt$ 的子节点 $u$ ,对于经过 $rt$ 的路径上的所有点 $v$ ,$u$ 都要与其计算一次贡献,可以得出 $v$的点集 是 $rt$ 不包含 $u$ 的子树的子树中所有点。

    一般我们考虑容斥或不计算 $u$ 子树内结点与 $u$ 产生的额外(或者错误)贡献。

    选取分治中心为每次分治后的树的重心,总处理结点数量为$O(nlogn)$

    树的重心用一个简单树型dp求。

    处理方法与难点:

    跟分块一样,分治之后处理是一大问题。常见的处理方式有两种:

    • 套用数据结构,对于每个分治中心维护一个动态的数据结构(如动态开点线段树,平衡树),直接区间查询修改处理子树内贡献
    • 利用排序+二分或双指针,将数据有序化并尽快找到所需的区间端点。

    两种方法各有优缺。

    对于套用数据结构,会增加 $logn$ 级别的常数,此外一般需要支持动态开点保证不爆空间。

    对于双指针,要注意扫描一次序列时间复杂度是 $O(L)$ 的,$L$ 是序列长度。而二分是 $O(logL)$ 的,如果不是在一次序列中求多对符合要求的区间,尽量使用二分。

    离散化和桶排序是点分治中会常用的思想,没思路的时候可以往这两个方面想。如果值域很大桶装不下,可以考虑将权值存出来然后排序。权值相同的元素一定相邻。

    难点在于思考出合适的处理方法。实在想不到就乱搞吧

    边分治

    思路

    与上面的点分治类似,我们选取一条边,把树尽量均匀地分成两部分(使边连接的两个子树的 $size$ 尽量接近)。然后递归处理左右子树,统计信息。

    如果是个菊花图,每次断边只会断掉一个结点,所以会被卡成 $O(n^2)$ ,而二叉树性质很优秀啊(),这时候就需要多叉转二叉(也就是三度化)。

    三度化

    三度化方式有两种。写法简单的一种是:

    把所有儿子依次加一个点串起来

    就算把所有点都加一个点串起来,我们也最多增加了 $n$ 个点, $n$ 条边,所有复杂度还是同阶的。

    新增的点和边要注意他们的值,一般将点权和边权设置为 $0$ ,也有例外,所以还是根据题目需要来。

    可以模拟一下发现,即使分治中心是虚边,也不会存在统计重复的点对。

    小细节是因为我们需要知道分治中心边的两端点,所以需要记录是第几条边。于是乎需要用到成对变换来存边。

    直观的图

    code:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    void mkmap(int x,int fa){//三度化(多叉转二叉)
    int tnd=0;
    for(auto it:og[x]){
    if(it.y==fa)continue;
    if(!tnd){
    link(x,it.y,it.w);
    link(it.y,x,it.w);
    tnd=x;//该连接的结点
    }
    else{
    ++nn;
    //赋值 !!!
    link(tnd,nn,0);link(nn,tnd,0);//赋值!!!
    link(it.y,tnd,it.w);link(tnd,it.y,it.w);
    tnd=nn;
    }
    mkmap(it.y,x);
    }
    }

    处理方法/优点

    边分治的处理方法比点分治容易,有时候还能省下为了容斥才使用到的数据结构使得复杂度降低码量。

    边分治一般不用考虑容斥,一个点在左端点的子树内,那么要统计贡献的点一定都在右端点的子树内。反之同理。所以可以左右子树分开存互不影响。

    边分治将每次的分治联通块中的点恰好分成了两部分,这就省去了像点分治那样单独处理以分治重心为路径端点的答案这一过程。

    适用/局限

    几乎所有点分治的题边分都能做(常数上有差距,但是不卡)。

    局限在于虚点虚边必须不影响答案

    点分树(动态点分治):

    定义:

    点分树是通过更改原树形态使得层数变为$logn$级别。

    点分治的过程就是构造点分树的过程。将上一层的分治中心 $u$ 与他的下一层分治中心 $v$ 连边,重构出一棵虚树。(实际上一般 $fa_v=u$ 就行)

    用途

    处理多次询问和带修的点分治问题。并且不会修改操作改变原树的形态(即不会改变每次重心的选取。)

    在点分数上向上暴力跳链复杂度是不大于 $O(logn)$ 的(因为层数不大于 $O(logn)$ )。

    对于任意一个 $y$,首先在虚树上找到它与 $x$ 的 $lca$ 该点必定在原树的 $x,y$ 路径上。

    • 看不懂的证明:$lca$ :(或者说囊括连通块同时包含 $x,y$ 的所有虚树节点中深度最深的那一个),易知在以此点为重心划分子连通块时 $x,y$会首次被分割开来

    $x$ 与某个结点在虚树上的 $lca$ 一定是 $x$ 的祖先,所以这些点都在 $x$ 的祖先 除开 $x$ 的子树的子树上(类似于点分治的味道),因为 $x$ 的祖先在 $x$子树内的结点与$x$ 的 $lca$ 不是这个祖先而是 $x$ 到这个祖先的链上(不含这个祖先)的一个结点。

    实现

    与点分治板子部分相同。只是多一个建树过程。

    处理方法

    对于一个点,我们要统计或修改其对所有虚树上祖先的贡献。这个过程可以暴力向上跳完成。

    通常我们需要统计虚树上的结点到其虚树上子节点的实树上的信息。实树上的信息与虚树上无关,例如处理虚树上的点到父亲的距离需要在实树上树链剖分求链长。

    注意事项

    实树上的信息与虚树无关,时刻警惕你需要哪棵树的信息。

    ]]>
    + + + + + <p>一种特别的分治思想,但难点不在于点分治思想本身。</p> +<p>有板子,但是板子跟题目重点几乎无关。</p> +<h2 id="点分治-淀粉质"><a href="#点分治-淀粉质" class="headerlink" title="点分治 淀粉质"></a>点分治 <de + + + + + + +
    diff --git a/content.json b/content.json index 1f58d29..c2147da 100644 --- a/content.json +++ b/content.json @@ -1 +1 @@ -{"meta":{"title":"cmach_socket的博客","subtitle":"一个隐身于众多躯壳中 孤愤而又堕落的残废","description":"cmach_socket 自建博客,放放自己的记录","author":"cmach_socket","url":"http://cmach_socket.github.io","root":"/"},"posts":[{"title":"[404]","date":"2024-06-13T13:50:09.430Z","path":"2024/06/13/404-md/","permalink":"http://cmach_socket.github.io/2024/06/13/404-md/","categories":[],"tags":[]},{"title":"树分治相关","date":"2024-06-13T12:25:28.000Z","path":"2024/06/13/树分治相关/","permalink":"http://cmach_socket.github.io/2024/06/13/%E6%A0%91%E5%88%86%E6%B2%BB%E7%9B%B8%E5%85%B3/","categories":[],"tags":[{"name":"code","slug":"code","permalink":"http://cmach_socket.github.io/tags/code/"}]},{"title":"Hello World","date":"2024-06-13T10:57:55.002Z","path":"2024/06/13/hello-world/","permalink":"http://cmach_socket.github.io/2024/06/13/hello-world/","categories":[],"tags":[]}],"categories":[],"tags":[{"name":"code","slug":"code","permalink":"http://cmach_socket.github.io/tags/code/"}]} \ No newline at end of file +{"meta":{"title":"cmach_socket的博客","subtitle":"一个隐身于众多躯壳中 孤愤而又堕落的残废","description":"cmach_socket 自建博客,放放自己的记录","author":"cmach_socket","url":"http://cmach_socket.github.io","root":"/"},"posts":[{"title":"扩展CRT.md","date":"2024-06-13T23:18:57.000Z","path":"2024/06/14/扩展CRT-md/","permalink":"http://cmach_socket.github.io/2024/06/14/%E6%89%A9%E5%B1%95CRT-md/","categories":[],"tags":[]},{"title":"demogen/容斥.md","date":"2024-06-13T23:18:20.000Z","path":"2024/06/14/demogen-容斥-md/","permalink":"http://cmach_socket.github.io/2024/06/14/demogen-%E5%AE%B9%E6%96%A5-md/","categories":[],"tags":[]},{"title":"一些大运算.md","date":"2024-06-13T23:17:54.000Z","path":"2024/06/14/一些大运算-md/","permalink":"http://cmach_socket.github.io/2024/06/14/%E4%B8%80%E4%BA%9B%E5%A4%A7%E8%BF%90%E7%AE%97-md/","categories":[],"tags":[]},{"title":"hash.md","date":"2024-06-13T14:41:16.000Z","path":"2024/06/13/hash-md/","permalink":"http://cmach_socket.github.io/2024/06/13/hash-md/","categories":[],"tags":[]},{"title":"矩阵乘法.md","date":"2024-06-13T14:41:02.000Z","path":"2024/06/13/矩阵乘法-md/","permalink":"http://cmach_socket.github.io/2024/06/13/%E7%9F%A9%E9%98%B5%E4%B9%98%E6%B3%95-md/","categories":[],"tags":[]},{"title":"FHQ-Treap.md","date":"2024-06-13T14:40:46.000Z","path":"2024/06/13/FHQ-Treap-md/","permalink":"http://cmach_socket.github.io/2024/06/13/FHQ-Treap-md/","categories":[],"tags":[]},{"title":"图上二分.md","date":"2024-06-13T14:40:28.000Z","path":"2024/06/13/图上二分-md/","permalink":"http://cmach_socket.github.io/2024/06/13/%E5%9B%BE%E4%B8%8A%E4%BA%8C%E5%88%86-md/","categories":[],"tags":[]},{"title":"2-SAT.md","date":"2024-06-13T14:40:05.000Z","path":"2024/06/13/2-SAT-md/","permalink":"http://cmach_socket.github.io/2024/06/13/2-SAT-md/","categories":[],"tags":[]},{"title":"差分约束系统.md","date":"2024-06-13T14:39:49.000Z","path":"2024/06/13/差分约束系统-md/","permalink":"http://cmach_socket.github.io/2024/06/13/%E5%B7%AE%E5%88%86%E7%BA%A6%E6%9D%9F%E7%B3%BB%E7%BB%9F-md/","categories":[],"tags":[]},{"title":"树型DP和缩点后树型DP.md","date":"2024-06-13T14:39:21.000Z","path":"2024/06/13/树型DP和缩点后树型DP-md/","permalink":"http://cmach_socket.github.io/2024/06/13/%E6%A0%91%E5%9E%8BDP%E5%92%8C%E7%BC%A9%E7%82%B9%E5%90%8E%E6%A0%91%E5%9E%8BDP-md/","categories":[],"tags":[]},{"title":"整除分块.md","date":"2024-06-13T14:38:57.000Z","path":"2024/06/13/整除分块-md/","permalink":"http://cmach_socket.github.io/2024/06/13/%E6%95%B4%E9%99%A4%E5%88%86%E5%9D%97-md/","categories":[],"tags":[]},{"title":"排列与组合.md","date":"2024-06-13T14:38:21.000Z","path":"2024/06/13/排列与组合-md/","permalink":"http://cmach_socket.github.io/2024/06/13/%E6%8E%92%E5%88%97%E4%B8%8E%E7%BB%84%E5%90%88-md/","categories":[],"tags":[{"name":"code","slug":"code","permalink":"http://cmach_socket.github.io/tags/code/"}]},{"title":"众数二进制拆分.md","date":"2024-06-13T14:37:22.000Z","path":"2024/06/13/众数二进制拆分-md/","permalink":"http://cmach_socket.github.io/2024/06/13/%E4%BC%97%E6%95%B0%E4%BA%8C%E8%BF%9B%E5%88%B6%E6%8B%86%E5%88%86-md/","categories":[],"tags":[{"name":"code","slug":"code","permalink":"http://cmach_socket.github.io/tags/code/"}]},{"title":"根号算法相关.md","date":"2024-06-13T14:36:48.000Z","path":"2024/06/13/根号算法相关-md/","permalink":"http://cmach_socket.github.io/2024/06/13/%E6%A0%B9%E5%8F%B7%E7%AE%97%E6%B3%95%E7%9B%B8%E5%85%B3-md/","categories":[],"tags":[{"name":"code","slug":"code","permalink":"http://cmach_socket.github.io/tags/code/"}]},{"title":"一般启发式合并.md","date":"2024-06-13T14:35:30.000Z","path":"2024/06/13/一般启发式合并-md/","permalink":"http://cmach_socket.github.io/2024/06/13/%E4%B8%80%E8%88%AC%E5%90%AF%E5%8F%91%E5%BC%8F%E5%90%88%E5%B9%B6-md/","categories":[],"tags":[{"name":"code","slug":"code","permalink":"http://cmach_socket.github.io/tags/code/"}]},{"title":"树分治相关","date":"2024-06-13T12:25:28.000Z","path":"2024/06/13/树分治相关/","permalink":"http://cmach_socket.github.io/2024/06/13/%E6%A0%91%E5%88%86%E6%B2%BB%E7%9B%B8%E5%85%B3/","categories":[],"tags":[{"name":"code","slug":"code","permalink":"http://cmach_socket.github.io/tags/code/"}]}],"categories":[],"tags":[{"name":"code","slug":"code","permalink":"http://cmach_socket.github.io/tags/code/"}]} \ No newline at end of file diff --git a/index.html b/index.html index 2b8d8d4..a72a07c 100644 --- a/index.html +++ b/index.html @@ -451,12 +451,110 @@

    - + - [404] + 扩展CRT.md
    + 思路:转化为求解二元一次方程,再合并 +求解:$$\begin{cases}x \equiv r_{1} \quad (mod \quad m_{1} ) \x \equiv r_{2} \quad (mod \quad m_{2} )\\quad … \x \equiv r_{n} \quad (mod \quad m_{n})\end{cases}$$ +其中$x \in Z \bigvee r,m \subseteq Z$ +首先考虑:$$\begin{cases}x \equiv r_{1} \quad (mod ... +
    + + + +
    +
    + + + + + + + +
    + + demogen/容斥.md + +
    + 德摩根:$$\overline{\bigcup_{i=1}^{n}A_{i}}=\bigcap_{i=1}^{n}\overline{A_{i}}$$ +$$\overline{\bigcap_{i=1}^{n}A_{i}}=\bigcup_{i=1}^{n}\overline{A_{i}}$$ +求一个全集中所有子集的交 +$$\begin{split}\left|\bigcup_{i=1}^{n}S_i\right|=&\sum_{i}|S_i|-\sum_{i<j}|S_i\cap S_j|+\... +
    + + + +
    +
    + + + + + + + +
    + + + 一些大运算.md + +
    + 总体来说,也遵循提公因式和因式分解 +此外,还有一些特殊的运算 +设 +$$\overline{x} = \frac{1}{n} \sum_{i=1}^{n} a_{i} $$ +$$s = \frac{1}{n} \sum_{i=1}^{n} (a_{i}-\overline{x})^2 $$ +则有 +$$s = \frac{1}{n} \sum_{i=1}^{n} (a_{i}^2 - 2 \overline{x}a_{i} + \overline{x}^2) $$ $$ = \frac{1}{n} \sum_{i=... +
    + + + +
    +
    + + + + + + + +
    + + + hash.md + +
    + 单hash定义了上面的两个数组,首先 hash[i] 表示前 i 个字符的字串的hash 值。而 p[i] 表示 $Base ^ i$  +那么对应的 Hash 公式为: +$$hash[i] = (hash[i-1] * Base + idx(s[i])) % MOD$$ +对于此种Hash方法,将Base和MOD尽量取大即可,这种情况下,冲突的概率是很低的。 +双Hash用字符串Hash,最怕的就是,出现冲突的情况,即不同字符串却有着相同的hash值,这是我们不想看到的。所以为了降低冲突的概率,可以用双Hash方法。 +将一个字符串用不同的Base和MOD,hash两次,将这两个结果...
    @@ -478,16 +576,13 @@

    - + - 树分治相关 + 矩阵乘法.md
    - 一种特别的分治思想,但难点不在于点分治思想本身。 -有板子,但是板子跟题目重点几乎无关。 -点分治 淀粉质用途:用于处理树上多对点询问或寻找有条件最远(最近)点对。主要是处理多对点对。 -做法:我们先选择一个节点作为根节点 $rt$ ,所有完全位于其子树中的路径可以分为两种,一种是经过当前根节点的路径,一种是不经过当前根节点的路径。前一种我们在这次分治中得到,后面一种在之后的分治中计算,就转化为了第一种路径。 -考虑枚举分治中心 $rt$ 的子节点 $u$ ,对于经过 $rt$ 的路径上的所有点 $v$ ,$u$ 都要与其计算一次贡献,可以得出 $v$的点集 是 $rt$ 不包含 $u$ 的子树... + $A_{i,j}=c$ 表示 将$c$倍$f_{j}$转移到$f_{i}$ +
    @@ -498,13 +593,75 @@

    -
    - +
    +

    +
    - + + + + + + +
    + + + FHQ-Treap.md + +
    + 依赖分裂合并的tree+heap(听起来像ODT) +核心操作:分裂: +一种是按权值分裂,一种是按排名分裂 +根据粉兔的博客,发现权值操作都可以通过rank转化为排名 +于是乎只打排名了 +当前需要的排名比左儿子数量大,即左子树和其本身归为第一颗分裂树,进入右子树 +反之同理,上述过程可以用BST性质解释 +通过BST的性质,也可以知道传下来的引用就是两颗子树预备插入节点 +合并: +treap以随机化id来构造期望平衡的BST,合并的时候第一颗树的所有节点一定比第二颗树小, +于是合并时候只需考虑合并节点的 $id$ +左子树 $id$ 小,将右子树挂载到右儿子下,右子树 $id$ 小,则将左子树挂载到右... +
    + + + +
    +
    - + + + + + + +
    + + + 图上二分.md + +
    + 一般是二分边或者点的权值。属于二分答案 +设 $check$ 为检测值, +当 $it.w>check$ 或者 $a[it.y]>check$ 时,走或者不走 +用于解决最大值最小或者最小值最大的问题。 +二分正确性:答案在边权或者点权的值域上,值域是单调的 +
    + + +
    @@ -517,16 +674,93 @@

    - + - Hello World + 2-SAT.md
    - Welcome to Hexo! This is your very first post. Check documentation for more info. If you get any problems when using Hexo, you can find the answer in troubleshooting or you can ask me on GitHub. -Quick StartCreate a new post1$ hexo new "My New Post" + 思路类似于差分约束,将数学问题转化为图论问题 +也是判环来判断可行性 +建图+tarjan +为什么不用spfa判环? +tarjan算法更优秀 $O(n+m)$ ,并且tarjan序就是反拓扑序,方便求解 +2-sat问题指每一个变量存在两种状态(2),这些变量需要满足一些条件(sat) +这些条件是逻辑条件:or,xor,and +2-sat问题转化所有的逻辑关系都可以转化为这样的形式:选择了A,则必须选择B +从A到B连一条边,就可以表示这样的关系 +若存在环内有一个变量的两个状态,则说明有一个无法满足的依赖链(例如 选$A_1$必选$B_2$ …. 选$B_2$必选$A_2$),这时选$A_1$也... +
    + + + +
    +
    + + + + + + + +
    + + + 差分约束系统.md + +
    + 差分约束系统 +$x_1-x_2 \leq y_1$ +… +$x_i-x_j \leq y_i$ +将$x_i-xj \leq y_i$ 移项,得 +$x_i \leq x_j+y_i$ +可建立一条从$x_j$到$x_i$的路径,权值为$y_2$ +将线性规划问题转化为图论问题 + +差分约束系统的转化: +$x_1-x_2 \geq y \to x_2-x_1 \leq -y_1$ -More info: Writing -Run server1$ hexo ... +$x_1 = x_2 \to x_1-x_2 \leq 0 \quad and \quad x_2-x_1 \leq 0$ + +$x_1 - x_2 < y \to x_1-x_2 \l... +
    + + + +
    +
    + + + + + + + +
    + + + 树型DP和缩点后树型DP.md + +
    + 基本的方程: +$f[u]=\sum_{v \in son(u)}f[v]+calc(v)$ +$f[u]=\max_{v \in son(u)}f[v]+calc(v)$ +[CTSC1997] 选课题目描述在大学里每个学生,为了达到一定的学分,必须从很多课程里选择一些课程来学习,在课程里有些课程必须在某些课程之前学习,如高等数学总是在其它课程之前学习。现在有 $N$ 门功课,每门课有个学分,每门课有一门或没有直接先修课(若课程 a 是课程 b 的先修课即只有学完了课程 a,才能学习课程 b)。一个学生要从这些课程里选择 $M$ 门课程学习,问他能获得的最大学分是多少? +...
    @@ -543,6 +777,10 @@

    + + @@ -754,7 +992,150 @@

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -769,7 +1150,7 @@

    diff --git a/page/2/index.html b/page/2/index.html new file mode 100644 index 0000000..07761ec --- /dev/null +++ b/page/2/index.html @@ -0,0 +1,1225 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Cmach_socket's Blog + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    +
    +
    + +
    + +
    + + +
    + +
    +
    + +
    + + + + + + + Cmach_socket's Blog + +
    + + +
    + + +
    + + +
    + + +
    +
    + + + + + + +
    +
    +
    + +

    + + + Cmach_socket's Blog + + +

    + +

    + + + + 一个隐身于众多躯壳中 孤愤而又堕落的残废 + + + +

    + + +
    +
    + + + + +
    +
    + + + + + + + +
    + + + 整除分块.md + +
    + 数论分块结论对于常数 n,使得式子 +$$\left\lfloor\dfrac ni\right\rfloor=\left\lfloor\dfrac nj\right\rfloor$$ +成立的最大的满足 $i\leq j\leq n$ 的 $j$ 的值为 $\left\lfloor\dfrac n{\lfloor\frac ni\rfloor}\right\rfloor$。 +即值 +$$\left\lfloor\dfrac ni\right\rfloor$$ 所在的块的右端点为 +$$\left\lfloor\dfrac n{\lfloor\frac ni\rfloor}\rig... +
    + + + +
    +
    + + + + + + + +
    + + + 排列与组合.md + +
    + 排列:从集合{a,b,c}中取2个元素的排列有ab,ac,ba,bc,ca,cb +换言之,元素顺序对于排列是有影响的 +考虑当前排列,第一个位置有N个选择,第二个位置去除第一个还有N-1种选择,以此类推到第M个还有N-M+1个选择 +可以得到公式 +$$A_{N}^{M} = \prod_{i=0}^{m-1}(n-i) = \frac{\prod_{i=1}^{n}i}{\prod_{j=1}^{n-m}j}$$前面n-m是不乘的,后面有m个转化一下: $$A_{N}^{M} = \frac{n!}{(n-m)!}$$ +组合: ... +
    + + + +
    +
    + + + + + + + +
    + + + 众数二进制拆分.md + +
    + 这个方法就是 二进制拆分。 +对于一个众数,因为它在原序列中的出现次数超过了一半,那么 对于每一个二进制位来说,众数在这一位上对应的值也超过了一半。 +简要复述一下该方法:对于一个序列 $a$,对于每个二进制位 $b$,求有多少个数该位是 $1$,记作 $cntb$​。 +存在绝对众数 $m$ 时,如果 $m$ 某一位是 $1$,那么 $cntb$​ 一定过半,反则一定不过半。 + +
    + + + +
    +
    + + + + + + + +
    + + + 根号算法相关.md + +
    + 分块相关:分块思想简单,题目复杂。 +根号分治根号算法——不只是分块。 +有时我们会碰到这样一类问题,长度为$n$的序列,$m$个询问(通常$n$和$m$同阶),可能存在两种比较显然的方法,一种是$O(n^2)$预处理$O(1)$回答,一种是不预处理$O(n)$回答$m$个询问,这两种方法都是$O(n^2)$的。考虑是否存在一种策略能“平衡”一下预处理和询问的复杂度。 +莫队相关:莫队never gonna give you up +不是将询问分成 $\sqrt{q}$块,而是把询问的 $l$ 分成$\sqrt{n}$块,保证每次l的变化在$\sqrt{n}$内 +通过奇偶性排序,单数块r正序排序... +
    + + + +
    +
    + + + + + + + +
    + + + 一般启发式合并.md + +
    + 启发式合并就是在合并的时候将size小的那个集合合并到size大的那个集合里面。 +复杂度居然是$O(n log n)$的 + +
    + + + +
    +
    + + + + + + + +
    + + + 树分治相关 + +
    + 一种特别的分治思想,但难点不在于点分治思想本身。 +有板子,但是板子跟题目重点几乎无关。 +点分治 淀粉质用途:用于处理树上多对点询问或寻找有条件最远(最近)点对。主要是处理多对点对。 +做法:我们先选择一个节点作为根节点 $rt$ ,所有完全位于其子树中的路径可以分为两种,一种是经过当前根节点的路径,一种是不经过当前根节点的路径。前一种我们在这次分治中得到,后面一种在之后的分治中计算,就转化为了第一种路径。 +考虑枚举分治中心 $rt$ 的子节点 $u$ ,对于经过 $rt$ 的路径上的所有点 $v$ ,$u$ 都要与其计算一次贡献,可以得出 $v$的点集 是 $rt$ 不包含 $u$ 的子树... +
    + + + +
    +
    + + + + + +
    + + + +
    + avatar +
    cmach_socket
    + +
    + best wishes +
    + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + +
    + + +
    +
    + + + + + + + + + + +
    + + + PV: :) + +
    + +
    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tags/code/index.html b/tags/code/index.html index 0da7681..0f940d0 100644 --- a/tags/code/index.html +++ b/tags/code/index.html @@ -435,6 +435,162 @@

    +
    + + + 排列与组合.md + +
    + 排列:从集合{a,b,c}中取2个元素的排列有ab,ac,ba,bc,ca,cb +换言之,元素顺序对于排列是有影响的 +考虑当前排列,第一个位置有N个选择,第二个位置去除第一个还有N-1种选择,以此类推到第M个还有N-M+1个选择 +可以得到公式 +$$A_{N}^{M} = \prod_{i=0}^{m-1}(n-i) = \frac{\prod_{i=1}^{n}i}{\prod_{j=1}^{n-m}j}$$前面n-m是不乘的,后面有m个转化一下: $$A_{N}^{M} = \frac{n!}{(n-m)!}$$ +组合: ... +
    + + + +
    +
    + + + + + + + +
    + + + 众数二进制拆分.md + +
    + 这个方法就是 二进制拆分。 +对于一个众数,因为它在原序列中的出现次数超过了一半,那么 对于每一个二进制位来说,众数在这一位上对应的值也超过了一半。 +简要复述一下该方法:对于一个序列 $a$,对于每个二进制位 $b$,求有多少个数该位是 $1$,记作 $cntb$​。 +存在绝对众数 $m$ 时,如果 $m$ 某一位是 $1$,那么 $cntb$​ 一定过半,反则一定不过半。 + +
    + + + +
    +
    + + + + + + + +
    + + + 根号算法相关.md + +
    + 分块相关:分块思想简单,题目复杂。 +根号分治根号算法——不只是分块。 +有时我们会碰到这样一类问题,长度为$n$的序列,$m$个询问(通常$n$和$m$同阶),可能存在两种比较显然的方法,一种是$O(n^2)$预处理$O(1)$回答,一种是不预处理$O(n)$回答$m$个询问,这两种方法都是$O(n^2)$的。考虑是否存在一种策略能“平衡”一下预处理和询问的复杂度。 +莫队相关:莫队never gonna give you up +不是将询问分成 $\sqrt{q}$块,而是把询问的 $l$ 分成$\sqrt{n}$块,保证每次l的变化在$\sqrt{n}$内 +通过奇偶性排序,单数块r正序排序... +
    + + + +
    +
    + + + + + + + +
    + + + 一般启发式合并.md + +
    + 启发式合并就是在合并的时候将size小的那个集合合并到size大的那个集合里面。 +复杂度居然是$O(n log n)$的 + +
    + + + +
    +
    + + + + + + +
    @@ -591,7 +747,150 @@

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -606,7 +905,7 @@