diff --git "a/2023/07/22/DP\346\200\273\347\273\223/index.html" "b/2023/07/22/DP\346\200\273\347\273\223/index.html" index 48cb935e6..3ea088769 100644 --- "a/2023/07/22/DP\346\200\273\347\273\223/index.html" +++ "b/2023/07/22/DP\346\200\273\347\273\223/index.html" @@ -2,6 +2,7 @@ + @@ -246,110 +247,131 @@
-

DP总结

$线性DP$

-

二维平面上的$DP$ 与 状态压缩$DP$

-

区间$DP$

都离不开三重循环: $\sum\limits{长度} \sum\limits{左端点} \sum\limits_{转移的断点} f…$

-
    -
  1. 石子合并

    题目:
    +

    区间\(DP\)

    +

    都离不开三重循环: \(\sum\limits_{长度} \sum\limits_{左端点} \sum\limits_{转移的断点} f...\)

    +
      +
    1. 石子合并

      +
      题目:
      +

      在一个圆形操场的四周摆放 N 堆石子,现要将石子有次序地合并成一堆,规定每次只能选相邻的 2 堆合并成新的一堆,并将新的一堆的石子数,记为该次合并的得分。

      试设计出一个算法,计算出将 N* 堆石子合并成 1 堆的最小得分和最大得分。

      -
      思路:
      +
      思路:
      +

      dp[i][j]表示区间[i,j]的最小价值。

      不妨从终点考虑问题,即结果为两个子区间合并的最小值再加上合并需要的代价即可。

      枚举两个子区间,即枚举这个区间的中间点k,使这个区间被分为[i,k][k+1,j]两个区间,取一遍最小值加上合并的即为当前区间所求。

      至于合并的代价,用前缀和即可。

      所以dp[i][j]=min(dp[i][j],dp[i][k]+dp[k+1][j]+sum[j]-sum[i-1])

      -
      -
    2. -
    3. Deque

      题目:
      -

      给定 N 个数的序列 $A$。

      +
    4. +
    5. Deque

      +
      题目:
      +
      +

      给定 N 个数的序列 \(A\)

      A 和 B 轮流取数,每个人每次可以从序列头部或者尾部取走一个数(直到序列为空)。

      A 和 B 都希望自己取得的数的总和尽可能大。

      假设最优策略下,A 取得的数的总和是 X,B 取得的数的总和是 Y, 请输出 X-Y。

      -
      思路:
      -

      显然游戏过程中剩下的数必然是连续的一段。设 $f_{i,j}$ 表示剩下下标为 $[i,j]$ 的数时,先手(并非当前的先手而是开始时的先手,下同)能取得的最大分数差。

      +
      思路:
      +
      +

      显然游戏过程中剩下的数必然是连续的一段。设 \(f_{i,j}\) 表示剩下下标为 \([i,j]\) 的数时,先手(并非当前的先手而是开始时的先手,下同)能取得的最大分数差。

      分两种情况讨论:

        -
      • 已经取走的数为偶数个,此时先手取,$f{i,j}$=$max⁡$ ($f{i+1,j}+ai$,$f{i,j-1}$,$f_{i,j-1}+a_j$)
      • -
      • 已经取走的数为奇数个,此时后手取,$f{i,j}$=$max$⁡ ($f{i+1,j}-ai$,$f{i,j-1}$,$f_{i,j-1}-a_j$)
      • +
      • 已经取走的数为偶数个,此时先手取,\(f_{i,j}\)=\(max⁡\) (\(f_{i+1,j}+a_i\),\(f_{i,j-1}\),\(f_{i,j-1}+a_j\))
      • +
      • 已经取走的数为奇数个,此时后手取,\(f_{i,j}\)=\(max\)⁡ (\(f_{i+1,j}-a_i\),\(f_{i,j-1}\),\(f_{i,j-1}-a_j\))
      -
      -
    6. +
-

换根$DP$

本质上只是把序列变成了树

-
    -
  1. Subtree

    题目:
    -

    有一个 n 个节点的树,对一些节点染色,使得所有被染色的节点是一个连通块。求对于 $1,2,3,…,n$每个节点,该节点被染色的方案个数。所有答案对 M 取模。

    +

    换根\(DP\)

    +

    本质上只是把序列变成了树

    +
      +
    1. Subtree

      +
      题目:
      +
      +

      有一个 n 个节点的树,对一些节点染色,使得所有被染色的节点是一个连通块。求对于 \(1,2,3,...,n\)每个节点,该节点被染色的方案个数。所有答案对 M 取模。

      -
      思路:
      -

      我们设$p_i$表示以$i$为跟的子树中的可行方案数,$q_i$表示$i$的父节点中除了$i$的方案数。

      -

      那么,有$ans_i=(q_i+1)*p_i$。

      -
      -
    2. +
      思路:
      +
      +

      我们设\(p_i\)表示以\(i\)为跟的子树中的可行方案数,\(q_i\)表示\(i\)的父节点中除了\(i\)的方案数。

      +

      那么,有\(ans_i=(q_i+1)*p_i\)

      +
    -

    $DP$优化

    根据方程运用相应的数据结构即可

    +

    \(DP\)优化

    +

    根据方程运用相应的数据结构即可

@@ -503,7 +525,7 @@

- +
@@ -681,7 +703,7 @@

- +
@@ -772,5 +794,20 @@

+ MathJax.Hub.Config({ + tex2jax: { + inlineMath: [ ["$","$"], ["\\(","\\)"] ], + skipTags: ['script', 'noscript', 'style', 'textarea', 'pre', 'code'], + processEscapes: true + } + }); + MathJax.Hub.Queue(function() { + var all = MathJax.Hub.getAllJax(); + for (var i = 0; i < all.length; ++i) + all[i].SourceElement().parentNode.className += ' has-jax'; + }); + + diff --git a/2023/10/24/CSP/index.html b/2023/10/24/CSP/index.html index ba3d8f67c..75628462d 100644 --- a/2023/10/24/CSP/index.html +++ b/2023/10/24/CSP/index.html @@ -2,6 +2,7 @@ + @@ -246,68 +247,73 @@
-

$CSP$ 游记

Day 0

-

晚上去了酒店,和另外几个人一起复习了 $Tarjan$ ,然后就睡了。

-

睡觉前想着 $2.5h$ 写前两个题,后两个题打下暴力,应该能拿 一等

+

\(CSP\) 游记

+

Day 0

+
+

晚上去了酒店,和另外几个人一起复习了 \(Tarjan\) ,然后就睡了。

+

睡觉前想着 \(2.5h\) 写前两个题,后两个题打下暴力,应该能拿 一等

-

Day 1 + 上午

-

$7\ :\ 40$

-

早上起来的最早,但发现自己感冒了。喝了只 $蒲地蓝$ ,还戴上了 $开喉剑$ 。

-

心里有种不祥的预感,感觉 $T3$ 会是与式子有关的 大模拟。

-

$\ $

-

$8\ :\ 30$

+

Day 1 + 上午

+
+

\(7\ :\ 40\)

+

早上起来的最早,但发现自己感冒了。喝了只 \(蒲地蓝\) ,还戴上了 \(开喉剑\)

+

心里有种不祥的预感,感觉 \(T3\) 会是与式子有关的 大模拟。

+

\(\ \)

+

\(8\ :\ 30\)

到一中集了合,拍了张照。果老师讲了些关于低级失误的事。

-

$\ $

-

$8\ :\ 30$

+

\(\ \)

+

\(8\ :\ 30\)

进了考场,发现座位设计非常 反人类,腿稍稍往前放一点就会碰到膝盖。

题面与压缩包出现了分离,监考老师也搞了很久

-

$\ $

-

$8\ :\ 55$

-

$T1$ 感觉像约瑟夫,但 手搓样例 后发现每次会消掉 $\lfloor \frac{n-1} {3} \rfloor$ 个,$while(n)$ 即可。

+

\(\ \)

+

\(8\ :\ 55\)

+

\(T1\) 感觉像约瑟夫,但 手搓样例 后发现每次会消掉 \(\lfloor \frac{n-1} {3} \rfloor\) 个,\(while(n)\) 即可。

对于第二个问,有一个显然的性质:

-

在 $n$ 消掉前,他一定在末尾。

+

\(n\) 消掉前,他一定在末尾。

-

所以$while(n)$时判断一下 $(n-1)\%3==1$ 即可。

-

$\ $

-

$9\ :\ 30$

-

把 $T1$ 的对拍打了一下,然后发现 $T2$ 是贪心水题,$15min$ 切了。

-

$\ $

-

$9\ :\ 50$

-

发现 $T3$ 是二次函数求值,回想起了去年 $T2$ 用 $sqrt$ 爆精度,就筛了 $1e6$ 内的质数。

+

所以\(while(n)\)时判断一下 \((n-1)\%3==1\) 即可。

+

\(\ \)

+

\(9\ :\ 30\)

+

\(T1\) 的对拍打了一下,然后发现 \(T2\) 是贪心水题,\(15min\) 切了。

+

\(\ \)

+

\(9\ :\ 50\)

+

发现 \(T3\) 是二次函数求值,回想起了去年 \(T2\)\(sqrt\) 爆精度,就筛了 \(1e6\) 内的质数。

然后模拟即可。

-

$\ $

-

$11\ :\ 00$

-

把前三个题看了一遍,发现没问题,开冲 $T4$。

-

$\ $

-

$12\ :\ 00$

+

\(\ \)

+

\(11\ :\ 00\)

+

把前三个题看了一遍,发现没问题,开冲 \(T4\)

+

\(\ \)

+

\(12\ :\ 00\)

考试结束,预估

-

$100\ +\ 100\ +\ 100\ +\ 10\ =\ 310 $ , 感觉一等没问题。

+

$100 + 100 + 100 + 10 = 310 $ , 感觉一等没问题。

-

Day 1 + 下午

-

$2\ :\ 30$

-

进入了考场,$pdf$ 的密码老师没找到,延迟了 $5min$。

-

$\ $

-

$3\ :\ 00$

-

发现 $T1$ 是水题,枚举所有状态再反过来判断即可。

-

$\ $

-

$3\ :\ 35$

-

$T2$ 先打了一个 $O(n^3)$ 的暴力,然后发现枚举右端点太费时间,优化成了 $O(n^2)$

-

$\ $

-

$3\ :\ 55$

-

看了一下 $T4$ ,感觉像 树上DP ,但没推出来,转去了 $T3$。

-

$\ $

-

$6\ :\ 00$

-

一直在调 $T3$ ,感觉灵魂出窍。

-

$对其原则$ 很好做,但 $4$ 操作难调得死,最后修修补补的过了大样例。

+

Day 1 + 下午

+
+

\(2\ :\ 30\)

+

进入了考场,\(pdf\) 的密码老师没找到,延迟了 \(5min\)

+

\(\ \)

+

\(3\ :\ 00\)

+

发现 \(T1\) 是水题,枚举所有状态再反过来判断即可。

+

\(\ \)

+

\(3\ :\ 35\)

+

\(T2\) 先打了一个 \(O(n^3)\) 的暴力,然后发现枚举右端点太费时间,优化成了 \(O(n^2)\)

+

\(\ \)

+

\(3\ :\ 55\)

+

看了一下 \(T4\) ,感觉像 树上DP ,但没推出来,转去了 \(T3\)

+

\(\ \)

+

\(6\ :\ 00\)

+

一直在调 \(T3\) ,感觉灵魂出窍。

+

\(对其原则\) 很好做,但 \(4\) 操作难调得死,最后修修补补的过了大样例。

考完发现没有初始化

-

$\ $

-

估分 $100\ +\ 50\ +\ +\ ?\ +\ 0\ =\ 150^+$

+

\(\ \)

+

估分 \(100\ +\ 50\ +\ +\ ?\ +\ 0\ =\ 150^+\)

-

反思

-

比赛节奏感觉可以,$S$ 组 $T4$ 没看出来感觉很可惜。

-

听说 $J$ 组的 $T4$ 是分层图最短路,考场上自己没去想。

-

$S$ 组 $T3$ 能拿多少是多少,得一等的希望就在他身上了。

+

反思

+
+

比赛节奏感觉可以,\(S\)\(T4\) 没看出来感觉很可惜。

+

听说 \(J\) 组的 \(T4\) 是分层图最短路,考场上自己没去想。

+

\(S\)\(T3\) 能拿多少是多少,得一等的希望就在他身上了。

@@ -478,7 +484,7 @@

反思
- +
@@ -656,7 +662,7 @@

反思
- +
@@ -747,5 +753,20 @@

反思 + MathJax.Hub.Config({ + tex2jax: { + inlineMath: [ ["$","$"], ["\\(","\\)"] ], + skipTags: ['script', 'noscript', 'style', 'textarea', 'pre', 'code'], + processEscapes: true + } + }); + MathJax.Hub.Queue(function() { + var all = MathJax.Hub.getAllJax(); + for (var i = 0; i < all.length; ++i) + all[i].SourceElement().parentNode.className += ' has-jax'; + }); + + diff --git "a/2023/12/09/23.12.9 \350\200\203\350\257\225\346\200\273\347\273\223/index.html" "b/2023/12/09/23.12.9 \350\200\203\350\257\225\346\200\273\347\273\223/index.html" index b48a53985..cd201d977 100644 --- "a/2023/12/09/23.12.9 \350\200\203\350\257\225\346\200\273\347\273\223/index.html" +++ "b/2023/12/09/23.12.9 \350\200\203\350\257\225\346\200\273\347\273\223/index.html" @@ -2,6 +2,7 @@ + @@ -246,69 +247,72 @@
-

$23.12.9$ 考试总结

分数 : $60$ ($50+10+0+0$)

A. stick


-

先是一个数字,然后一串$0$,最后一串$8$。贪就完了。

-

注意模数是 $998244$8$53$。挂分 $50pts$

-

B. game


-

正解爆搜。少打 break挂 $90pts$。

-

答案很多,所以 $yes$ 跑得很快。

-

最坏情况$5\times 6$,此时$O(1^4\times2^{14}\times3^{16})$。

+

\(23.12.9\) 考试总结

+

分数 : \(60\)\(50+10+0+0\))

+

A. stick

+
+

先是一个数字,然后一串\(0\),最后一串\(8\)。贪就完了。

+

注意模数是 \(998244\)8\(53\)。挂分 \(50pts\)

+

B. game

+
+

正解爆搜。少打 break\(90pts\)

+

答案很多,所以 \(yes\) 跑得很快。

+

最坏情况\(5\times 6\),此时\(O(1^4\times2^{14}\times3^{16})\)

注意到数据很小,考虑可行性剪枝即可。

来自 永远的7日之都 :

-

image

-

C. noip


-

万恶的 $O2$,$RE\ \ 0$。

-

字典序从大到小搜索,$DP$ 预处理 $每个后缀首字母确定的情况下所能得到的最大权值$ ,判断当前是否 $\geq\ x$ $(可行性剪枝)$。

+

+

C. noip

+
+

万恶的 \(O2\)\(RE\ \ 0\)

+

字典序从大到小搜索,\(DP\) 预处理 \(每个后缀首字母确定的情况下所能得到的最大权值\) ,判断当前是否 \(\geq\ x\) \((可行性剪枝)\)

-

学的是 $DP作为部分$ 的思路。

+

学的是 \(DP作为部分\) 的思路。

-

D. remove


-

区间 $DP$。求

-

设方程 $f{l,r,max,min}$ 表示 消除区间 $[l,r]$ 使其剩下的最大值为 max ,最小值为 min 的最小代价。$g{l,r}$ 表示 区间$[l,r]$中全消的最小代价。

+\right\} +\]

+

设方程 \(f_{l,r,max,min}\) 表示 消除区间 \([l,r]\) 使其剩下的最大值为 max ,最小值为 min 的最小代价。\(g_{l,r}\) 表示 区间\([l,r]\)中全消的最小代价。

所以

-
    -
  1. 初始化 :
  2. +
      +
    1. 初始化 :
    -

    $g{l,r}=min${$f{l,r,max,min}+a+b\times (r-l)^2$}

    -
      -
    1. 转移
    2. +

      \(g_{l,r}=min\){\(f_{l,r,max,min}+a+b\times (r-l)^2\)}

      +
        +
      1. 转移

      左边空或右边空 :

        -
      • $f{l,r,max,min}=\min{g{l,k} + f_{k+1,r,max,min}}$
      • -
      • $f{l,r,max,min}=\min{g{k+1,r} + f_{l,k,max,min}}$
      • +
      • \(f_{l,r,max,min}=\min\{g_{l,k} + f_{k+1,r,max,min}\}\)
      • +
      • \(f_{l,r,max,min}=\min\{g_{k+1,r} + f_{l,k,max,min}\}\)

      两边都空

        -
      • $f{l,r,max,min}=\min{f{l,r,max,min} + f_{k+1,r,max,min}}$
      • +
      • \(f_{l,r,max,min}=\min\{f_{l,r,max,min} + f_{k+1,r,max,min}\}\)

      端点刷表

        -
      • $f{l,r+1,max(max,w_l),min(min,w_r)}=f{l,r,max,min}$
      • +
      • \(f_{l,r+1,max(max,w_l),min(min,w_r)}=f_{l,r,max,min}\)
      -
        -
      1. g?

        $g{l,r}=min${$f{l,r,max,min}+a+b\times(max-min)^2$}

        -
      2. -
      3. 离散化后 $O(n^4)$
      4. +
          +
        1. g?
          +

          \(g_{l,r}=min\){\(f_{l,r,max,min}+a+b\times(max-min)^2\)}

        2. +
        3. 离散化后 \(O(n^4)\)
-
-

问题:

    -
  1. 手抄斩手,使用CV大发。
  2. -
  3. $O2$ 要看返回值。
  4. -
  5. 对拍数据要把时间卡到满,不能放水。
  6. +
    +

    问题:

    +
      +
    1. 手抄斩手,使用CV大发。
    2. +
    3. \(O2\) 要看返回值。
    4. +
    5. 对拍数据要把时间卡到满,不能放水。
@@ -479,7 +483,7 @@

- +
@@ -657,7 +661,7 @@

- +
@@ -748,5 +752,20 @@

+ MathJax.Hub.Config({ + tex2jax: { + inlineMath: [ ["$","$"], ["\\(","\\)"] ], + skipTags: ['script', 'noscript', 'style', 'textarea', 'pre', 'code'], + processEscapes: true + } + }); + MathJax.Hub.Queue(function() { + var all = MathJax.Hub.getAllJax(); + for (var i = 0; i < all.length; ++i) + all[i].SourceElement().parentNode.className += ' has-jax'; + }); + + diff --git "a/2024/01/09/\345\233\276\350\256\272\346\200\273\347\273\223/index.html" "b/2024/01/09/\345\233\276\350\256\272\346\200\273\347\273\223/index.html" index 733de18a1..b4514adee 100644 --- "a/2024/01/09/\345\233\276\350\256\272\346\200\273\347\273\223/index.html" +++ "b/2024/01/09/\345\233\276\350\256\272\346\200\273\347\273\223/index.html" @@ -2,6 +2,7 @@ + @@ -243,6 +244,7 @@ + @@ -680,5 +682,20 @@ + + diff --git a/2024/01/10/DP_2/index.html b/2024/01/10/DP_2/index.html index 20a131f72..ee39a8ed5 100644 --- a/2024/01/10/DP_2/index.html +++ b/2024/01/10/DP_2/index.html @@ -2,6 +2,7 @@ + @@ -220,7 +221,7 @@ -  515 字 +  517 字 @@ -246,86 +247,81 @@
-

## 1. 状态
$\ \ \ \ $区间$DP$的状态一般 设 f[l][r] 表示区间 [l][r] ....。但有些时候可以直接设 $f_i$ 表示 $[1,i]$…。

-

$\ \ \ \ $转移的时候会依靠断点,即 $f[l][r]=min/max${$f[l][k]+f[k+1][r]$}。

-

$\ \ \ \ $常见的优化有两种 :

+

## 1. 状态 \(\ \ \ \ \)区间\(DP\)的状态一般 设 f[l][r] 表示区间 [l][r] ....。但有些时候可以直接设 \(f_i\) 表示 \([1,i]\)...。

+

\(\ \ \ \ \)转移的时候会依靠断点,即 \(f[l][r]=min/max\){\(f[l][k]+f[k+1][r]\)}。

+

\(\ \ \ \ \)常见的优化有两种 :

-

2.例题

    -
  1. 表达式的亿种可能性
    +

    2.例题

    +
      +
    1. 表达式的亿种可能性
      +

      直接算是不行的,我们要去乘上每一个数的代价。

      原因是 加法和减法可以交换顺序。

      -

      eg. : $(1+1)+2\ =\ 1+(1+2)$

      +

      eg. : \((1+1)+2\ =\ 1+(1+2)\)

      乘法具有分配率。

      -
      -
    2. -
    3. 有味道的数字
      -

      爆搜发现 $max\ ans\ =\ 11$ , 且 $当且仅当\ n=3\ 或\ n=7\ $ 时,$ans=-1$。

      -

      用 $f[i]\ (f:vector)$ 存 $ans_n\ =\ i$ 的 $n$。

      -
      -
    4. -
    5. 守卫
      +
    6. +
    7. 有味道的数字
      +
      +

      爆搜发现 \(max\ ans\ =\ 11\) , 且 \(当且仅当\ n=3\ 或\ n=7\ \) 时,\(ans=-1\)

      +

      \(f[i]\ (f:vector)\)\(ans_n\ =\ i\)\(n\)

      +
    8. +
    9. 守卫
      +

      题目具有迷惑性,容易想成单调栈。

      但发现加入点后需要一段区间的信息。

      -

      所以直接区间 $DP$。

      -

      枚举 $r$ , $l\ =\ r\ \rightarrow\ 1$,递推。

      -
      -
    10. -
    11. 祖玛游戏 && 单调栈
      +

      所以直接区间 \(DP\)

      +

      枚举 \(r\) , \(l\ =\ r\ \rightarrow\ 1\),递推。

      +
    12. +
    13. 祖玛游戏 && 单调栈
      +

      打不过 (二维状态表示不完全) 就加入 (把表示不完全的信息加入状态)

      实在不行还能加辅助数组

      -

      如果循环有后效性,或者循环讨论复杂,用 $dfs$

      +

      如果循环有后效性,或者循环讨论复杂,用 \(dfs\)

      思想来源于二分 : 把原问题转换为可行性问题

      -
      -
    14. -
    15. 括号序列
      +
    16. +
    17. 括号序列
      +

      算重了怎么办? 学习 $Catalan $ !

      -

      我们知道

      -

      同理 , 我们知道 \[ +C_{n+1}=C_0C_n+C_1C_{n-1}+C_2C_{n-2}+...+C_{n-1}C_1+C_nC_0\ (注意这里没有重复) +\] 同理 , image

      -
      -
    18. +
-
-
-

3. 好题

    -
  1. HDU - 2476

    +
    +
    +

    3. 好题

    +
      +
    1. HDU - 2476

      (空 -> B) - (A -> B)

      -
      -
    2. -
    3. CodeForces - 149D

      +
    4. +
    5. CodeForces - 149D

      高维状态 :

      -

      $f_{l,r,x,y}$ 表示 区间$[l,r]$中,左端点是$x$,右端点是$y$的方案数。(左右端点均hash过)。

      -
      -
    6. -
    7. 262144 P

      +

      \(f_{l,r,x,y}\) 表示 区间\([l,r]\)中,左端点是\(x\),右端点是\(y\)的方案数。(左右端点均hash过)。

      +
    8. +
    9. 262144 P

      -

      状态不同于普通区间$DP$,类倍增,设的是

      -
      -
    10. +

      状态不同于普通区间\(DP\),类倍增,设的是 \[ +f_{i,k}\ 表示\ 从\ i\ 开始直到合出\ k\ 所需的最小长度。 +\]

      +
    -
    -

    4.总结

    +
    +

    4.总结

    +

    状态的根本问题是 : 如何用最简洁的信息使得答案能够被(不重复),不遗漏的算出来。

    -

    即使是 $f_{l,r}$ 也是逃不过的。

    -

    区间 $DP$ 一般满足 一些局部最优解能凑出全局最优解,不行的话就得加维度。

    +

    即使是 \(f_{l,r}\) 也是逃不过的。

    +

    区间 \(DP\) 一般满足 一些局部最优解能凑出全局最优解,不行的话就得加维度。

@@ -496,7 +492,7 @@

4.
- +
@@ -674,7 +670,7 @@

4.
- +
@@ -765,5 +761,20 @@

4. + + diff --git "a/2024/01/10/\345\233\276\350\256\272/index.html" "b/2024/01/10/\345\233\276\350\256\272/index.html" index e324543b8..a580c4883 100644 --- "a/2024/01/10/\345\233\276\350\256\272/index.html" +++ "b/2024/01/10/\345\233\276\350\256\272/index.html" @@ -2,6 +2,7 @@ + @@ -230,7 +231,7 @@ -  579 字 +  672 字 @@ -256,54 +257,63 @@
-

图论


-

$0.$有感而发

-

眼睛瞎了有利于打Dijkstra。 by NotDeep

-

如果这题我不会做,那么一定是图论。 by NotDeep

+

图论

+
+

\(0.\)有感而发

+
+

眼睛瞎了有利于打Dijkstra。 by NotDeep

+

如果这题我不会做,那么一定是图论。 by NotDeep

-
-

$1.$ 基本算法

​ $Case\ 1:$ Dijkstra

-

​ 本质是 $贪心\ +\ DP $。

-

​ 适用于非负权权图,保证当前取出的节点的最短路是确定的,是未确定最短路的节点中最小的

-

​ 常见题型 : 补图,非负权图上用 ta ( $SPFA$已死 )。

-

​ $Case\ 2:$ Floyd

-

​ 通过 $O(n^3)$ 的时间求出任意两点的最短路。可以在负权图上使用。

-

​ 可以求 最小环,传递闭包

-

​ 下面对最小环进行说明:

+
+

\(1.\) 基本算法

+

\(Case\ 1:\) Dijkstra

+

​ 本质是 $贪心 + DP $。

+

​ 适用于非负权权图,保证当前取出的节点的最短路是确定的,是未确定最短路的节点中最小的

+

​ 常见题型 : 补图,非负权图上用 ta ( \(SPFA\)已死 )。

+

\(Case\ 2:\) Floyd

+

​ 通过 \(O(n^3)\) 的时间求出任意两点的最短路。可以在负权图上使用。

+

​ 可以求 最小环,传递闭包

+

​ 下面对最小环进行说明:

1
2
3
4
5
6
7
8
9
10
11
12
//g[i][j]表示 i->j 的最短路,f[i][j]表示i->j的 边的长度
//把最短路拆成 (i-j) + (i>k,k->j)
//用 dji 可以做到 O(m(n+m)log m)
for(int k=1;k<=n;k++)
{
for(int i=1;i<=k-1;i++)
for(int j=i+1;j<=k-1;j++)
ans=min(ans,f[i][k]+f[k][j]+g[i][j]);
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
g[i][j]=min(g[i][k]+g[k][j],g[i][j]);
}
-

​ $Case\ 3:$ Bellman–Ford

-

​ 从 的角度考虑最短路:

-

​ 最短路的边的个数 最多 是 n-1。

-

​ 如果 边数 大于了 n-1 , 说明原图上有负环。

-

​ 通过 $for(i=1\ \rightarrow\ n)\ \ \ for([u,v] \in E)\ \ 松弛$ 可以让每一条边都走过。

-

​ 但实际上跑不满,所以有了 $SPFA$。

-

​ $Case\ 4:$ SPFA

-

​ 对$Case\ 3$的广搜优化,可以判负环。最坏 $O(nm)$。

-

​ 优化点这儿

-
-

$2.$ 常见思路

​ $Case\ 1:$ 分层图最短路

-

​ $Case\ 2:$ Bellman–Ford 找负环

-

​ $Case\ 3:$ 跑完最短路后,在 最短路图(DAG) 上$DP$。

-

​ $Case\ 4:$ 多维最短路

-

​ $Case\ 5:$ 拆贡献/拆来源/YY长啥样

-
-

$3.$ 魔改将至

​ $Case\ 1:$ 贪心

-

​ 以$摄像头问题2$为例:

-

​ 对于一段区间 $[l,r]$ 我们连接一条 $l \rightarrow r+1$ 的边,在连接 $i \rightarrow i-1\ ,i\in n$ 。

-

​ 令 $dist_i$ 表示覆盖区间 $[1,i-1]$ 的代价,再跑最短路即可。

-

​ $Case\ 2:$ $DP$

-

​ 以 Wi-Fi 为例:

-

​ 我们把每种操作转换为 带权区间覆盖 , 就转回了 $摄像头2$。

-
-
- -

$4.$ 题目详解

$1.$ $P4366$

​ 卡 $O(m\log m)$ 的 dji 的题目少的很,遇见就要珍惜。

-

​ 考虑异或性质:

-

​ 对于每个节点,拆成 32 个节点: ${v|v=x \oplus2^k,k\in N,v\leq n}$,边数就会缩短成 $n\log n+m$。

-

$2.$ 神秘力量

​ 先对补图进行概念阐述:

-

​ 完全图-现有图=现有图的补图

-

​ 维护时可以用堆乱搞或用链表维护。分别为 $O(m \log m)$ 和 $O(n)$。

+

\(Case\ 3:\) Bellman–Ford

+

​ 从 的角度考虑最短路:

+

​ 最短路的边的个数 最多 是 n-1。

+

​ 如果 边数 大于了 n-1 , 说明原图上有负环。

+

​ 通过 \(for(i=1\ \rightarrow\ n)\ \ \ for([u,v] \in E)\ \ 松弛\) 可以让每一条边都走过。

+

​ 但实际上跑不满,所以有了 \(SPFA\)

+

\(Case\ 4:\) SPFA

+

​ 对\(Case\ 3\)的广搜优化,可以判负环。最坏 \(O(nm)\)

+

​ 优化点这儿

+
+

\(2.\) 常见思路

+

\(Case\ 1:\) 分层图最短路

+

\(Case\ 2:\) Bellman–Ford 找负环

+

\(Case\ 3:\) 跑完最短路后,在 最短路图(DAG) 上\(DP\)

+

\(Case\ 4:\) 多维最短路

+

\(Case\ 5:\) 拆贡献/拆来源/YY长啥样

+
+

\(3.\) 魔改将至

+

\(Case\ 1:\) 贪心

+

​ 以\(摄像头问题2\)为例:

+

​ 对于一段区间 \([l,r]\) 我们连接一条 \(l \rightarrow r+1\) 的边,在连接 \(i \rightarrow i-1\ ,i\in n\)

+

​ 令 \(dist_i\) 表示覆盖区间 \([1,i-1]\) 的代价,再跑最短路即可。

+

\(Case\ 2:\) \(DP\)

+

​ 以 Wi-Fi 为例:

+

​ 我们把每种操作转换为 带权区间覆盖 , 就转回了 \(摄像头2\)

+
+
+ +
+

\(4.\) 题目详解

+

\(1.\) \(P4366\)

+

​ 卡 \(O(m\log m)\) 的 dji 的题目少的很,遇见就要珍惜。

+

​ 考虑异或性质: \[ +x \oplus z=(x\oplus y) \oplus (y\oplus z)<=x\oplus y+y\oplus z +\] ​ 对于每个节点,拆成 32 个节点: \(\{v|v=x \oplus2^k,k\in N,v\leq n\}\),边数就会缩短成 \(n\log n+m\)

+

\(2.\) 神秘力量

+

​ 先对补图进行概念阐述:

+

​ 完全图-现有图=现有图的补图

+

​ 维护时可以用堆乱搞或用链表维护。分别为 \(O(m \log m)\)\(O(n)\)

@@ -465,7 +475,7 @@

- +
@@ -643,7 +653,7 @@

- +
@@ -734,5 +744,20 @@

+ MathJax.Hub.Config({ + tex2jax: { + inlineMath: [ ["$","$"], ["\\(","\\)"] ], + skipTags: ['script', 'noscript', 'style', 'textarea', 'pre', 'code'], + processEscapes: true + } + }); + MathJax.Hub.Queue(function() { + var all = MathJax.Hub.getAllJax(); + for (var i = 0; i < all.length; ++i) + all[i].SourceElement().parentNode.className += ' has-jax'; + }); + + diff --git a/404.html b/404.html index 34d899f61..6dbc428c9 100644 --- a/404.html +++ b/404.html @@ -2,6 +2,7 @@ + @@ -382,5 +383,20 @@ + + diff --git a/about/index.html b/about/index.html index 63153ffea..a2a6b5121 100644 --- a/about/index.html +++ b/about/index.html @@ -2,6 +2,7 @@ + @@ -390,5 +391,20 @@ + + diff --git a/archives/2023/07/index.html b/archives/2023/07/index.html index eefb2b2db..04062bfc3 100644 --- a/archives/2023/07/index.html +++ b/archives/2023/07/index.html @@ -2,6 +2,7 @@ + @@ -402,5 +403,20 @@ + + diff --git a/archives/2023/10/index.html b/archives/2023/10/index.html index 9d17524cf..d22e05683 100644 --- a/archives/2023/10/index.html +++ b/archives/2023/10/index.html @@ -2,6 +2,7 @@ + @@ -402,5 +403,20 @@ + + diff --git a/archives/2023/12/index.html b/archives/2023/12/index.html index 484875312..57fbd53ad 100644 --- a/archives/2023/12/index.html +++ b/archives/2023/12/index.html @@ -2,6 +2,7 @@ + @@ -402,5 +403,20 @@ + + diff --git a/archives/2023/index.html b/archives/2023/index.html index 025b91484..ac2717a0f 100644 --- a/archives/2023/index.html +++ b/archives/2023/index.html @@ -2,6 +2,7 @@ + @@ -416,5 +417,20 @@ + + diff --git a/archives/2024/01/index.html b/archives/2024/01/index.html index 648f0a26d..b25f7016f 100644 --- a/archives/2024/01/index.html +++ b/archives/2024/01/index.html @@ -2,6 +2,7 @@ + @@ -416,5 +417,20 @@ + + diff --git a/archives/2024/index.html b/archives/2024/index.html index d84e93cbc..9e7311af8 100644 --- a/archives/2024/index.html +++ b/archives/2024/index.html @@ -2,6 +2,7 @@ + @@ -416,5 +417,20 @@ + + diff --git a/archives/index.html b/archives/index.html index eb813b390..e9c0fd7d6 100644 --- a/archives/index.html +++ b/archives/index.html @@ -2,6 +2,7 @@ + @@ -446,5 +447,20 @@ + + diff --git a/index.html b/index.html index 2da5f603a..ce69f4c7b 100644 --- a/index.html +++ b/index.html @@ -2,6 +2,7 @@ + @@ -238,13 +239,16 @@

图论 -$0.$有感而发 - 眼睛瞎了有利于打Dijkstra。 by NotDeep - 如果这题我不会做,那么一定是图论。 by NotDeep +\(0.\)有感而发 -$1.$ 基本算法​ $Case\ 1:$ Dijkstra -​ 本质是 $贪... +眼睛瞎了有利于打Dijkstra。 by NotDeep +如果这题我不会做,那么一定是图论。 by NotDeep + + +\(1.\) 基本算法 +​ \(Case\ 1:\) Dijkstra +​ 本...
@@ -292,8 +296,8 @@

- ## 1. 状态$\ \ \ \ $区间$DP$的状态一般 设 f[l][r] 表示区间 [l][r] ....。但有些时候可以直接设 $f_i$ 表示 $[1,i]$…。 -$\ \ \ \ $转移的时候会依靠断点,即 $f[l][r]=min/m... + ## 1. 状态 \(\ \ \ \ \)区间\(DP\)的状态一般 设 f[l][r] 表示区间 [l][r] ....。但有些时候可以直接设 \(f_i\) 表示 \([1,i]\)...。 +\(\ \ \ \ \)转移的时候会依靠断点,即 ...
@@ -342,6 +346,7 @@

+
@@ -389,11 +394,12 @@

- $23.12.9$ 考试总结分数 : $60$ ($50+10+0+0$)A. stick -先是一个数字,然后一串$0$,最后一串$8$。贪就完了。 -注意模数是 $998244$8$53$。挂分 $50pts$ -B. game -正解爆搜。少打 bre... + \(23.12.9\) 考试总结 +分数 : \(60\) (\(50+10+0+0\)) +A. stick + +先是一个数字,然后一串\(0\),最后一串\(8\)。贪就完了。 +注意模数是 \(998244\)8\(53\)。挂分 \(50p...
@@ -441,13 +447,15 @@

- $CSP$ 游记Day 0 -晚上去了酒店,和另外几个人一起复习了 $Tarjan$ ,然后就睡了。 -睡觉前想着 $2.5h$ 写前两个题,后两个题打下暴力,应该能拿 一等。 + \(CSP\) 游记 +Day 0 + +晚上去了酒店,和另外几个人一起复习了 \(Tarjan\) ,然后就睡了。 +睡觉前想着 \(2.5h\) 写前两个题,后两个题打下暴力,应该能拿 一等。 Day 1 + 上午 -$7\ :\ 40$ -早上起来的最早,但发现自己感... + +\(7\ :\ 4...
@@ -495,18 +503,16 @@

- DP总结$线性DP$ + DP总结 +\(线性DP\) + 定义: -具有线性”阶段”划分的$DP$被称为线性$DP$。 +具有线性"阶段"划分的\(DP\)被称为线性\(DP\)。 经典模型 -$LIS$ , $LCS$ , $LCIS$(最长公共上升子序列) , $最长公共子序列$ , $数字三角形$。 - -例题: -LCS题意: -求两个字符串中... +\(LIS\) , \(LCS\) , \(LCIS\)(最长公共上升子序列) , \(最长公共子...
@@ -751,5 +757,20 @@

+ + diff --git a/search.xml b/search.xml index a24d1cc5f..06d23ff8f 100644 --- a/search.xml +++ b/search.xml @@ -3,394 +3,428 @@ 23.12.9考试总结 /2023/12/09/23.12.9%20%E8%80%83%E8%AF%95%E6%80%BB%E7%BB%93/ - $23.12.9$ 考试总结

分数 : $60$ ($50+10+0+0$)

A. stick


-

先是一个数字,然后一串$0$,最后一串$8$。贪就完了。

-

注意模数是 $998244$8$53$。挂分 $50pts$

-

B. game


-

正解爆搜。少打 break挂 $90pts$。

-

答案很多,所以 $yes$ 跑得很快。

-

最坏情况$5\times 6$,此时$O(1^4\times2^{14}\times3^{16})$。

+ \(23.12.9\) 考试总结

+

分数 : \(60\)\(50+10+0+0\))

+

A. stick

+
+

先是一个数字,然后一串\(0\),最后一串\(8\)。贪就完了。

+

注意模数是 \(998244\)8\(53\)。挂分 \(50pts\)

+

B. game

+
+

正解爆搜。少打 break\(90pts\)

+

答案很多,所以 \(yes\) 跑得很快。

+

最坏情况\(5\times 6\),此时\(O(1^4\times2^{14}\times3^{16})\)

注意到数据很小,考虑可行性剪枝即可。

来自 永远的7日之都 :

-

image

-

C. noip


-

万恶的 $O2$,$RE\ \ 0$。

-

字典序从大到小搜索,$DP$ 预处理 $每个后缀首字母确定的情况下所能得到的最大权值$ ,判断当前是否 $\geq\ x$ $(可行性剪枝)$。

+

+

C. noip

+
+

万恶的 \(O2\)\(RE\ \ 0\)

+

字典序从大到小搜索,\(DP\) 预处理 \(每个后缀首字母确定的情况下所能得到的最大权值\) ,判断当前是否 \(\geq\ x\) \((可行性剪枝)\)

-

学的是 $DP作为部分$ 的思路。

+

学的是 \(DP作为部分\) 的思路。

-

D. remove


-

区间 $DP$。求

-

设方程 $f{l,r,max,min}$ 表示 消除区间 $[l,r]$ 使其剩下的最大值为 max ,最小值为 min 的最小代价。$g{l,r}$ 表示 区间$[l,r]$中全消的最小代价。

+\right\} +\]

+

设方程 \(f_{l,r,max,min}\) 表示 消除区间 \([l,r]\) 使其剩下的最大值为 max ,最小值为 min 的最小代价。\(g_{l,r}\) 表示 区间\([l,r]\)中全消的最小代价。

所以

-
    -
  1. 初始化 :
  2. +
      +
    1. 初始化 :
    -

    $g{l,r}=min${$f{l,r,max,min}+a+b\times (r-l)^2$}

    -
      -
    1. 转移
    2. +

      \(g_{l,r}=min\){\(f_{l,r,max,min}+a+b\times (r-l)^2\)}

      +
        +
      1. 转移

      左边空或右边空 :

        -
      • $f{l,r,max,min}=\min{g{l,k} + f_{k+1,r,max,min}}$
      • -
      • $f{l,r,max,min}=\min{g{k+1,r} + f_{l,k,max,min}}$
      • +
      • \(f_{l,r,max,min}=\min\{g_{l,k} + f_{k+1,r,max,min}\}\)
      • +
      • \(f_{l,r,max,min}=\min\{g_{k+1,r} + f_{l,k,max,min}\}\)

      两边都空

        -
      • $f{l,r,max,min}=\min{f{l,r,max,min} + f_{k+1,r,max,min}}$
      • +
      • \(f_{l,r,max,min}=\min\{f_{l,r,max,min} + f_{k+1,r,max,min}\}\)

      端点刷表

        -
      • $f{l,r+1,max(max,w_l),min(min,w_r)}=f{l,r,max,min}$
      • +
      • \(f_{l,r+1,max(max,w_l),min(min,w_r)}=f_{l,r,max,min}\)
      -
        -
      1. g?

        $g{l,r}=min${$f{l,r,max,min}+a+b\times(max-min)^2$}

        -
      2. -
      3. 离散化后 $O(n^4)$
      4. +
          +
        1. g?
          +

          \(g_{l,r}=min\){\(f_{l,r,max,min}+a+b\times(max-min)^2\)}

        2. +
        3. 离散化后 \(O(n^4)\)
-
-

问题:

    -
  1. 手抄斩手,使用CV大发。
  2. -
  3. $O2$ 要看返回值。
  4. -
  5. 对拍数据要把时间卡到满,不能放水。
  6. +
    +

    问题:

    +
      +
    1. 手抄斩手,使用CV大发。
    2. +
    3. \(O2\) 要看返回值。
    4. +
    5. 对拍数据要把时间卡到满,不能放水。
    +]]> + + + CSP总结 + /2023/10/24/CSP/ + \(CSP\) 游记

+

Day 0

+
+

晚上去了酒店,和另外几个人一起复习了 \(Tarjan\) ,然后就睡了。

+

睡觉前想着 \(2.5h\) 写前两个题,后两个题打下暴力,应该能拿 一等

+
+

Day 1 + 上午

+
+

\(7\ :\ 40\)

+

早上起来的最早,但发现自己感冒了。喝了只 \(蒲地蓝\) ,还戴上了 \(开喉剑\)

+

心里有种不祥的预感,感觉 \(T3\) 会是与式子有关的 大模拟。

+

\(\ \)

+

\(8\ :\ 30\)

+

到一中集了合,拍了张照。果老师讲了些关于低级失误的事。

+

\(\ \)

+

\(8\ :\ 30\)

+

进了考场,发现座位设计非常 反人类,腿稍稍往前放一点就会碰到膝盖。

+

题面与压缩包出现了分离,监考老师也搞了很久

+

\(\ \)

+

\(8\ :\ 55\)

+

\(T1\) 感觉像约瑟夫,但 手搓样例 后发现每次会消掉 \(\lfloor \frac{n-1} {3} \rfloor\) 个,\(while(n)\) 即可。

+

对于第二个问,有一个显然的性质:

+
+

\(n\) 消掉前,他一定在末尾。

+
+

所以\(while(n)\)时判断一下 \((n-1)\%3==1\) 即可。

+

\(\ \)

+

\(9\ :\ 30\)

+

\(T1\) 的对拍打了一下,然后发现 \(T2\) 是贪心水题,\(15min\) 切了。

+

\(\ \)

+

\(9\ :\ 50\)

+

发现 \(T3\) 是二次函数求值,回想起了去年 \(T2\)\(sqrt\) 爆精度,就筛了 \(1e6\) 内的质数。

+

然后模拟即可。

+

\(\ \)

+

\(11\ :\ 00\)

+

把前三个题看了一遍,发现没问题,开冲 \(T4\)

+

\(\ \)

+

\(12\ :\ 00\)

+

考试结束,预估

+

$100 + 100 + 100 + 10 = 310 $ , 感觉一等没问题。

+
+

Day 1 + 下午

+
+

\(2\ :\ 30\)

+

进入了考场,\(pdf\) 的密码老师没找到,延迟了 \(5min\)

+

\(\ \)

+

\(3\ :\ 00\)

+

发现 \(T1\) 是水题,枚举所有状态再反过来判断即可。

+

\(\ \)

+

\(3\ :\ 35\)

+

\(T2\) 先打了一个 \(O(n^3)\) 的暴力,然后发现枚举右端点太费时间,优化成了 \(O(n^2)\)

+

\(\ \)

+

\(3\ :\ 55\)

+

看了一下 \(T4\) ,感觉像 树上DP ,但没推出来,转去了 \(T3\)

+

\(\ \)

+

\(6\ :\ 00\)

+

一直在调 \(T3\) ,感觉灵魂出窍。

+

\(对其原则\) 很好做,但 \(4\) 操作难调得死,最后修修补补的过了大样例。

+

考完发现没有初始化

+

\(\ \)

+

估分 \(100\ +\ 50\ +\ +\ ?\ +\ 0\ =\ 150^+\)

+
+

反思

+
+

比赛节奏感觉可以,\(S\)\(T4\) 没看出来感觉很可惜。

+

听说 \(J\) 组的 \(T4\) 是分层图最短路,考场上自己没去想。

+

\(S\)\(T3\) 能拿多少是多少,得一等的希望就在他身上了。

+
]]> DP再次总结 /2024/01/10/DP_2/ - ## 1. 状态
$\ \ \ \ $区间$DP$的状态一般 设 f[l][r] 表示区间 [l][r] ....。但有些时候可以直接设 $f_i$ 表示 $[1,i]$…。

-

$\ \ \ \ $转移的时候会依靠断点,即 $f[l][r]=min/max${$f[l][k]+f[k+1][r]$}。

-

$\ \ \ \ $常见的优化有两种 :

+ ## 1. 状态 \(\ \ \ \ \)区间\(DP\)的状态一般 设 f[l][r] 表示区间 [l][r] ....。但有些时候可以直接设 \(f_i\) 表示 \([1,i]\)...。

+

\(\ \ \ \ \)转移的时候会依靠断点,即 \(f[l][r]=min/max\){\(f[l][k]+f[k+1][r]\)}。

+

\(\ \ \ \ \)常见的优化有两种 :

    -
    1. -
    2. 四边形不等式
    3. -
    -
  • -
    1. -
    2. 递推
    3. -
    -
  • +
  •       1. 四边形不等式
  • +
  •       2. 递推
-

2.例题

    -
  1. 表达式的亿种可能性
    +

    2.例题

    +
      +
    1. 表达式的亿种可能性
      +

      直接算是不行的,我们要去乘上每一个数的代价。

      原因是 加法和减法可以交换顺序。

      -

      eg. : $(1+1)+2\ =\ 1+(1+2)$

      +

      eg. : \((1+1)+2\ =\ 1+(1+2)\)

      乘法具有分配率。

      -
      -
    2. -
    3. 有味道的数字
      -

      爆搜发现 $max\ ans\ =\ 11$ , 且 $当且仅当\ n=3\ 或\ n=7\ $ 时,$ans=-1$。

      -

      用 $f[i]\ (f:vector)$ 存 $ans_n\ =\ i$ 的 $n$。

      -
      -
    4. -
    5. 守卫
      +
    6. +
    7. 有味道的数字
      +
      +

      爆搜发现 \(max\ ans\ =\ 11\) , 且 \(当且仅当\ n=3\ 或\ n=7\ \) 时,\(ans=-1\)

      +

      \(f[i]\ (f:vector)\)\(ans_n\ =\ i\)\(n\)

      +
    8. +
    9. 守卫
      +

      题目具有迷惑性,容易想成单调栈。

      但发现加入点后需要一段区间的信息。

      -

      所以直接区间 $DP$。

      -

      枚举 $r$ , $l\ =\ r\ \rightarrow\ 1$,递推。

      -
      -
    10. -
    11. 祖玛游戏 && 单调栈
      +

      所以直接区间 \(DP\)

      +

      枚举 \(r\) , \(l\ =\ r\ \rightarrow\ 1\),递推。

      +
    12. +
    13. 祖玛游戏 && 单调栈
      +

      打不过 (二维状态表示不完全) 就加入 (把表示不完全的信息加入状态)

      实在不行还能加辅助数组

      -

      如果循环有后效性,或者循环讨论复杂,用 $dfs$

      +

      如果循环有后效性,或者循环讨论复杂,用 \(dfs\)

      思想来源于二分 : 把原问题转换为可行性问题

      -
      -
    14. -
    15. 括号序列
      +
    16. +
    17. 括号序列
      +

      算重了怎么办? 学习 $Catalan $ !

      -

      我们知道

      -

      同理 , 我们知道 \[ +C_{n+1}=C_0C_n+C_1C_{n-1}+C_2C_{n-2}+...+C_{n-1}C_1+C_nC_0\ (注意这里没有重复) +\] 同理 , image

      -
      -
    18. +
-
-
-

3. 好题

    -
  1. HDU - 2476

    +
    +
    +

    3. 好题

    +
      +
    1. HDU - 2476

      (空 -> B) - (A -> B)

      -
      -
    2. -
    3. CodeForces - 149D

      +
    4. +
    5. CodeForces - 149D

      高维状态 :

      -

      $f_{l,r,x,y}$ 表示 区间$[l,r]$中,左端点是$x$,右端点是$y$的方案数。(左右端点均hash过)。

      -
      -
    6. -
    7. 262144 P

      +

      \(f_{l,r,x,y}\) 表示 区间\([l,r]\)中,左端点是\(x\),右端点是\(y\)的方案数。(左右端点均hash过)。

      +
    8. +
    9. 262144 P

      -

      状态不同于普通区间$DP$,类倍增,设的是

      -
      -
    10. +

      状态不同于普通区间\(DP\),类倍增,设的是 \[ +f_{i,k}\ 表示\ 从\ i\ 开始直到合出\ k\ 所需的最小长度。 +\]

      +
    -
    -

    4.总结

    +
    +

    4.总结

    +

    状态的根本问题是 : 如何用最简洁的信息使得答案能够被(不重复),不遗漏的算出来。

    -

    即使是 $f_{l,r}$ 也是逃不过的。

    -

    区间 $DP$ 一般满足 一些局部最优解能凑出全局最优解,不行的话就得加维度。

    +

    即使是 \(f_{l,r}\) 也是逃不过的。

    +

    区间 \(DP\) 一般满足 一些局部最优解能凑出全局最优解,不行的话就得加维度。

    ]]> DP总结 /2023/07/22/DP%E6%80%BB%E7%BB%93/ - DP总结

    $线性DP$

      -
    • 定义:

      -

      具有线性”阶段”划分的$DP$被称为线性$DP$。

      -
      -
    • -
    • 经典模型

      -

      $LIS$ , $LCS$ , $LCIS$(最长公共上升子序列) , $最长公共子序列$ , $数字三角形$。

      -
      -
    • -
    • 例题:

        -
      1. LCS

        题意:
        -

        求两个字符串中字典序最小的$LCS$。

        -
        -
        方法:
        -

        用 $vector$ 记录下每一个状态下的答案。

        + DP总结 +

        \(线性DP\)

        +
          +
        • 定义:

          +
          +

          具有线性"阶段"划分的\(DP\)被称为线性\(DP\)

          +
        • +
        • 经典模型

          +
          +

          \(LIS\) , \(LCS\) , \(LCIS\)(最长公共上升子序列) , \(最长公共子序列\) , \(数字三角形\)

          +
        • +
        • 例题:

          +
            +
          1. LCS

            +
            题意:
            +
            +

            求两个字符串中字典序最小的\(LCS\)

            -
          2. -
          3. 最长上升子序列(LIS)

            题意:
            +
            方法:
            +
            +

            \(vector\) 记录下每一个状态下的答案。

            +
          4. +
          5. 最长上升子序列(LIS)

            +
            题意:
            +
              -
            • 给定一个长为 n 的序列 $a_i$,求这个序列的最长单调上升子序列长度。
            • -
            • 要求 $O(n log_n)$ 。
            • +
            • 给定一个长为 n 的序列 \(a_i\),求这个序列的最长单调上升子序列长度。
            • +
            • 要求 \(O(n log_n)\)
            -
            方法:
            +
            方法:
            +

            在长度一定的情况下,若结尾元素更小,那么最终答案也就更优。

            -

            所以我们维护一个数组表示当前的$LIS$,每一次插入当前元素。

            +

            所以我们维护一个数组表示当前的\(LIS\),每一次插入当前元素。

            -
            code :
            #include<bits/stdc++.h>
            #define int long long
            #define rep(i,a,b) for(int i=(a);i<=(b);++i)
            using namespace std;

            const int N=1e6 +3;
            int n,m,a[N],f[N];

            signed main()
            {
            cin>>n; for(int i=1;i<=n;i++) cin>>a[i];
            memset(f,0x3f,sizeof f);
            for(int i=1;i<=n;i++) *upper_bound(f+1,f+n+1,a[i])=a[i];
            int res=1; while(f[res]!=f[0]) res++;
            cout<<res-1<<endl;
            return 0;
            }
            -
          6. -
          -
        • +
          code :
          +
          #include<bits/stdc++.h>
          #define int long long
          #define rep(i,a,b) for(int i=(a);i<=(b);++i)
          using namespace std;

          const int N=1e6 +3;
          int n,m,a[N],f[N];

          signed main()
          {
          cin>>n; for(int i=1;i<=n;i++) cin>>a[i];
          memset(f,0x3f,sizeof f);
          for(int i=1;i<=n;i++) *upper_bound(f+1,f+n+1,a[i])=a[i];
          int res=1; while(f[res]!=f[0]) res++;
          cout<<res-1<<endl;
          return 0;
          }
          +
    -

    二维平面上的$DP$ 与 状态压缩$DP$

      -
    • 怎样判断?
      +

      二维平面上的\(DP\) 与 状态压缩\(DP\)

      +
        +
      • 怎样判断?
        +

        二维平面看题面。

        -

        状态压缩的$n\le 22$。

        -
        -
      • -
      • 例题:

          -
        1. Grid 2

          题目:
          -

          给一个 H×W 的网格,每一步只能向右或向下走,给出 $n$ 个坐标,这些坐标对应的位置不能经过,求从左上角 (1,1)走到右下角 (H,W) 的方案数,答案对 $10^9+7$ 取模。

          +

          状态压缩的\(n\le 22\)

          +
        2. +
        3. 例题:

          +
            +
          1. Grid 2

            +
            题目:
            +
            +

            给一个 H×W 的网格,每一步只能向右或向下走,给出 \(n\) 个坐标,这些坐标对应的位置不能经过,求从左上角 (1,1)走到右下角 (H,W) 的方案数,答案对 \(10^9+7\) 取模。

            -
            思路:
            -

            首先对于 $f_{i,j}\ (1\le i\le H,1\le j\le W)$ 可行性显然,但空间不够。我们只能对着 $n$ 个坐标开数组。

            -

            我们设方程 $f_i$ 表示从 (1,1) 做到第i个坐标,且只经过第$i$个坐标的方案总数。

            +
            思路:
            +
            +

            首先对于 \(f_{i,j}\ (1\le i\le H,1\le j\le W)\) 可行性显然,但空间不够。我们只能对着 \(n\) 个坐标开数组。

            +

            我们设方程 \(f_i\) 表示从 (1,1) 做到第i个坐标,且只经过第\(i\)个坐标的方案总数。

            那么,我们尝试使用容斥原理进行转移

              -
            • 从 (1,1) 到 ($xi,y_i$) 的方案数是 ${C{x_i-1+y_i-1}^{x_i -1}}$
            • -
            • 从某一个坐标转移过来的方案数是 $\sum C_{x_i-x_j+y_i-y_j}^{x_i -x_j} $
            • +
            • 从 (1,1) 到 (\(x_i,y_i\)) 的方案数是 \({C_{x_i-1+y_i-1}^{x_i -1}}\)
            • +
            • 从某一个坐标转移过来的方案数是 $C_{x_i-x_j+y_i-y_j}^{x_i -x_j} $
            +
          2. +
          3. Matching

            +
            题目:
            +
            +

            给定 N,表示有 N 个男生和 N 个女生,再给你一个矩阵 a,如果\(a_{i,j}\) 等于 1,表示 i 这个男生和 j 这个女生可以匹配成一对,否则不能。 问要匹配 N 对的方案数。答案对 \(10^9+7\) 取模。

            -
          4. -
          5. Matching

            题目:
            -

            给定 N,表示有 N 个男生和 N 个女生,再给你一个矩阵 a,如果$a_{i,j}$ 等于 1,表示 i 这个男生和 j 这个女生可以匹配成一对,否则不能。 问要匹配 N 对的方案数。答案对 $10^9+7$ 取模。

            -
            -
            思路:
            +
            思路:
            +

            状压男生,枚举女生

            -
            -
          6. -
          -
        4. +
    • +
-

区间$DP$

都离不开三重循环: $\sum\limits{长度} \sum\limits{左端点} \sum\limits_{转移的断点} f…$

-
    -
  1. 石子合并

    题目:
    +

    区间\(DP\)

    +

    都离不开三重循环: \(\sum\limits_{长度} \sum\limits_{左端点} \sum\limits_{转移的断点} f...\)

    +
      +
    1. 石子合并

      +
      题目:
      +

      在一个圆形操场的四周摆放 N 堆石子,现要将石子有次序地合并成一堆,规定每次只能选相邻的 2 堆合并成新的一堆,并将新的一堆的石子数,记为该次合并的得分。

      试设计出一个算法,计算出将 N* 堆石子合并成 1 堆的最小得分和最大得分。

      -
      思路:
      +
      思路:
      +

      dp[i][j]表示区间[i,j]的最小价值。

      不妨从终点考虑问题,即结果为两个子区间合并的最小值再加上合并需要的代价即可。

      枚举两个子区间,即枚举这个区间的中间点k,使这个区间被分为[i,k][k+1,j]两个区间,取一遍最小值加上合并的即为当前区间所求。

      至于合并的代价,用前缀和即可。

      所以dp[i][j]=min(dp[i][j],dp[i][k]+dp[k+1][j]+sum[j]-sum[i-1])

      -
      -
    2. -
    3. Deque

      题目:
      -

      给定 N 个数的序列 $A$。

      +
    4. +
    5. Deque

      +
      题目:
      +
      +

      给定 N 个数的序列 \(A\)

      A 和 B 轮流取数,每个人每次可以从序列头部或者尾部取走一个数(直到序列为空)。

      A 和 B 都希望自己取得的数的总和尽可能大。

      假设最优策略下,A 取得的数的总和是 X,B 取得的数的总和是 Y, 请输出 X-Y。

      -
      思路:
      -

      显然游戏过程中剩下的数必然是连续的一段。设 $f_{i,j}$ 表示剩下下标为 $[i,j]$ 的数时,先手(并非当前的先手而是开始时的先手,下同)能取得的最大分数差。

      +
      思路:
      +
      +

      显然游戏过程中剩下的数必然是连续的一段。设 \(f_{i,j}\) 表示剩下下标为 \([i,j]\) 的数时,先手(并非当前的先手而是开始时的先手,下同)能取得的最大分数差。

      分两种情况讨论:

        -
      • 已经取走的数为偶数个,此时先手取,$f{i,j}$=$max⁡$ ($f{i+1,j}+ai$,$f{i,j-1}$,$f_{i,j-1}+a_j$)
      • -
      • 已经取走的数为奇数个,此时后手取,$f{i,j}$=$max$⁡ ($f{i+1,j}-ai$,$f{i,j-1}$,$f_{i,j-1}-a_j$)
      • +
      • 已经取走的数为偶数个,此时先手取,\(f_{i,j}\)=\(max⁡\) (\(f_{i+1,j}+a_i\),\(f_{i,j-1}\),\(f_{i,j-1}+a_j\))
      • +
      • 已经取走的数为奇数个,此时后手取,\(f_{i,j}\)=\(max\)⁡ (\(f_{i+1,j}-a_i\),\(f_{i,j-1}\),\(f_{i,j-1}-a_j\))
      -
      -
    6. +
-

换根$DP$

本质上只是把序列变成了树

-
    -
  1. Subtree

    题目:
    -

    有一个 n 个节点的树,对一些节点染色,使得所有被染色的节点是一个连通块。求对于 $1,2,3,…,n$每个节点,该节点被染色的方案个数。所有答案对 M 取模。

    -
    -
    思路:
    -

    我们设$p_i$表示以$i$为跟的子树中的可行方案数,$q_i$表示$i$的父节点中除了$i$的方案数。

    -

    那么,有$ans_i=(q_i+1)*p_i$。

    +

    换根\(DP\)

    +

    本质上只是把序列变成了树

    +
      +
    1. Subtree

      +
      题目:
      +
      +

      有一个 n 个节点的树,对一些节点染色,使得所有被染色的节点是一个连通块。求对于 \(1,2,3,...,n\)每个节点,该节点被染色的方案个数。所有答案对 M 取模。

      -
    2. +
      思路:
      +
      +

      我们设\(p_i\)表示以\(i\)为跟的子树中的可行方案数,\(q_i\)表示\(i\)的父节点中除了\(i\)的方案数。

      +

      那么,有\(ans_i=(q_i+1)*p_i\)

      +
    -

    $DP$优化

    根据方程运用相应的数据结构即可

    +

    \(DP\)优化

    +

    根据方程运用相应的数据结构即可

    +]]> + + + 图论总结 + /2024/01/09/%E5%9B%BE%E8%AE%BA%E6%80%BB%E7%BB%93/ + 图论总结 /2024/01/10/%E5%9B%BE%E8%AE%BA/ - 图论
    -

    $0.$有感而发

    -

    眼睛瞎了有利于打Dijkstra。 by NotDeep

    -

    如果这题我不会做,那么一定是图论。 by NotDeep

    -
    -
    -

    $1.$ 基本算法

    ​ $Case\ 1:$ Dijkstra

    -

    ​ 本质是 $贪心\ +\ DP $。

    -

    ​ 适用于非负权权图,保证当前取出的节点的最短路是确定的,是未确定最短路的节点中最小的

    -

    ​ 常见题型 : 补图,非负权图上用 ta ( $SPFA$已死 )。

    -

    ​ $Case\ 2:$ Floyd

    -

    ​ 通过 $O(n^3)$ 的时间求出任意两点的最短路。可以在负权图上使用。

    -

    ​ 可以求 最小环,传递闭包

    -

    ​ 下面对最小环进行说明:

    + 图论 +
    +

    \(0.\)有感而发

    +
    +

    眼睛瞎了有利于打Dijkstra。 by NotDeep

    +

    如果这题我不会做,那么一定是图论。 by NotDeep

    +
    +
    +

    \(1.\) 基本算法

    +

    \(Case\ 1:\) Dijkstra

    +

    ​ 本质是 $贪心 + DP $。

    +

    ​ 适用于非负权权图,保证当前取出的节点的最短路是确定的,是未确定最短路的节点中最小的

    +

    ​ 常见题型 : 补图,非负权图上用 ta ( \(SPFA\)已死 )。

    +

    \(Case\ 2:\) Floyd

    +

    ​ 通过 \(O(n^3)\) 的时间求出任意两点的最短路。可以在负权图上使用。

    +

    ​ 可以求 最小环,传递闭包

    +

    ​ 下面对最小环进行说明:

    //g[i][j]表示 i->j 的最短路,f[i][j]表示i->j的 边的长度
    //把最短路拆成 (i-j) + (i>k,k->j)
    //用 dji 可以做到 O(m(n+m)log m)
    for(int k=1;k<=n;k++)
    {
    for(int i=1;i<=k-1;i++)
    for(int j=i+1;j<=k-1;j++)
    ans=min(ans,f[i][k]+f[k][j]+g[i][j]);
    for(int i=1;i<=n;i++)
    for(int j=1;j<=n;j++)
    g[i][j]=min(g[i][k]+g[k][j],g[i][j]);
    }
    -

    ​ $Case\ 3:$ Bellman–Ford

    -

    ​ 从 的角度考虑最短路:

    -

    ​ 最短路的边的个数 最多 是 n-1。

    -

    ​ 如果 边数 大于了 n-1 , 说明原图上有负环。

    -

    ​ 通过 $for(i=1\ \rightarrow\ n)\ \ \ for([u,v] \in E)\ \ 松弛$ 可以让每一条边都走过。

    -

    ​ 但实际上跑不满,所以有了 $SPFA$。

    -

    ​ $Case\ 4:$ SPFA

    -

    ​ 对$Case\ 3$的广搜优化,可以判负环。最坏 $O(nm)$。

    -

    ​ 优化点这儿

    -
    -

    $2.$ 常见思路

    ​ $Case\ 1:$ 分层图最短路

    -

    ​ $Case\ 2:$ Bellman–Ford 找负环

    -

    ​ $Case\ 3:$ 跑完最短路后,在 最短路图(DAG) 上$DP$。

    -

    ​ $Case\ 4:$ 多维最短路

    -

    ​ $Case\ 5:$ 拆贡献/拆来源/YY长啥样

    -
    -

    $3.$ 魔改将至

    ​ $Case\ 1:$ 贪心

    -

    ​ 以$摄像头问题2$为例:

    -

    ​ 对于一段区间 $[l,r]$ 我们连接一条 $l \rightarrow r+1$ 的边,在连接 $i \rightarrow i-1\ ,i\in n$ 。

    -

    ​ 令 $dist_i$ 表示覆盖区间 $[1,i-1]$ 的代价,再跑最短路即可。

    -

    ​ $Case\ 2:$ $DP$

    -

    ​ 以 Wi-Fi 为例:

    -

    ​ 我们把每种操作转换为 带权区间覆盖 , 就转回了 $摄像头2$。

    -
    -
    +

    \(Case\ 3:\) Bellman–Ford

    +

    ​ 从 的角度考虑最短路:

    +

    ​ 最短路的边的个数 最多 是 n-1。

    +

    ​ 如果 边数 大于了 n-1 , 说明原图上有负环。

    +

    ​ 通过 \(for(i=1\ \rightarrow\ n)\ \ \ for([u,v] \in E)\ \ 松弛\) 可以让每一条边都走过。

    +

    ​ 但实际上跑不满,所以有了 \(SPFA\)

    +

    \(Case\ 4:\) SPFA

    +

    ​ 对\(Case\ 3\)的广搜优化,可以判负环。最坏 \(O(nm)\)

    +

    ​ 优化点这儿

    +
    +

    \(2.\) 常见思路

    +

    \(Case\ 1:\) 分层图最短路

    +

    \(Case\ 2:\) Bellman–Ford 找负环

    +

    \(Case\ 3:\) 跑完最短路后,在 最短路图(DAG) 上\(DP\)

    +

    \(Case\ 4:\) 多维最短路

    +

    \(Case\ 5:\) 拆贡献/拆来源/YY长啥样

    +
    +

    \(3.\) 魔改将至

    +

    \(Case\ 1:\) 贪心

    +

    ​ 以\(摄像头问题2\)为例:

    +

    ​ 对于一段区间 \([l,r]\) 我们连接一条 \(l \rightarrow r+1\) 的边,在连接 \(i \rightarrow i-1\ ,i\in n\)

    +

    ​ 令 \(dist_i\) 表示覆盖区间 \([1,i-1]\) 的代价,再跑最短路即可。

    +

    \(Case\ 2:\) \(DP\)

    +

    ​ 以 Wi-Fi 为例:

    +

    ​ 我们把每种操作转换为 带权区间覆盖 , 就转回了 \(摄像头2\)

    +
    +
    -

    $4.$ 题目详解

    $1.$ $P4366$

    ​ 卡 $O(m\log m)$ 的 dji 的题目少的很,遇见就要珍惜。

    -

    ​ 考虑异或性质:

    -

    ​ 对于每个节点,拆成 32 个节点: ${v|v=x \oplus2^k,k\in N,v\leq n}$,边数就会缩短成 $n\log n+m$。

    -

    $2.$ 神秘力量

    ​ 先对补图进行概念阐述:

    -

    ​ 完全图-现有图=现有图的补图

    -

    ​ 维护时可以用堆乱搞或用链表维护。分别为 $O(m \log m)$ 和 $O(n)$。

    +
    +

    \(4.\) 题目详解

    +

    \(1.\) \(P4366\)

    +

    ​ 卡 \(O(m\log m)\) 的 dji 的题目少的很,遇见就要珍惜。

    +

    ​ 考虑异或性质: \[ +x \oplus z=(x\oplus y) \oplus (y\oplus z)<=x\oplus y+y\oplus z +\] ​ 对于每个节点,拆成 32 个节点: \(\{v|v=x \oplus2^k,k\in N,v\leq n\}\),边数就会缩短成 \(n\log n+m\)

    +

    \(2.\) 神秘力量

    +

    ​ 先对补图进行概念阐述:

    +

    ​ 完全图-现有图=现有图的补图

    +

    ​ 维护时可以用堆乱搞或用链表维护。分别为 \(O(m \log m)\)\(O(n)\)

    ]]>
    图论
    - - CSP总结 - /2023/10/24/CSP/ - $CSP$ 游记

    Day 0

    -

    晚上去了酒店,和另外几个人一起复习了 $Tarjan$ ,然后就睡了。

    -

    睡觉前想着 $2.5h$ 写前两个题,后两个题打下暴力,应该能拿 一等

    -
    -

    Day 1 + 上午

    -

    $7\ :\ 40$

    -

    早上起来的最早,但发现自己感冒了。喝了只 $蒲地蓝$ ,还戴上了 $开喉剑$ 。

    -

    心里有种不祥的预感,感觉 $T3$ 会是与式子有关的 大模拟。

    -

    $\ $

    -

    $8\ :\ 30$

    -

    到一中集了合,拍了张照。果老师讲了些关于低级失误的事。

    -

    $\ $

    -

    $8\ :\ 30$

    -

    进了考场,发现座位设计非常 反人类,腿稍稍往前放一点就会碰到膝盖。

    -

    题面与压缩包出现了分离,监考老师也搞了很久

    -

    $\ $

    -

    $8\ :\ 55$

    -

    $T1$ 感觉像约瑟夫,但 手搓样例 后发现每次会消掉 $\lfloor \frac{n-1} {3} \rfloor$ 个,$while(n)$ 即可。

    -

    对于第二个问,有一个显然的性质:

    -
    -

    在 $n$ 消掉前,他一定在末尾。

    -
    -

    所以$while(n)$时判断一下 $(n-1)\%3==1$ 即可。

    -

    $\ $

    -

    $9\ :\ 30$

    -

    把 $T1$ 的对拍打了一下,然后发现 $T2$ 是贪心水题,$15min$ 切了。

    -

    $\ $

    -

    $9\ :\ 50$

    -

    发现 $T3$ 是二次函数求值,回想起了去年 $T2$ 用 $sqrt$ 爆精度,就筛了 $1e6$ 内的质数。

    -

    然后模拟即可。

    -

    $\ $

    -

    $11\ :\ 00$

    -

    把前三个题看了一遍,发现没问题,开冲 $T4$。

    -

    $\ $

    -

    $12\ :\ 00$

    -

    考试结束,预估

    -

    $100\ +\ 100\ +\ 100\ +\ 10\ =\ 310 $ , 感觉一等没问题。

    -
    -

    Day 1 + 下午

    -

    $2\ :\ 30$

    -

    进入了考场,$pdf$ 的密码老师没找到,延迟了 $5min$。

    -

    $\ $

    -

    $3\ :\ 00$

    -

    发现 $T1$ 是水题,枚举所有状态再反过来判断即可。

    -

    $\ $

    -

    $3\ :\ 35$

    -

    $T2$ 先打了一个 $O(n^3)$ 的暴力,然后发现枚举右端点太费时间,优化成了 $O(n^2)$

    -

    $\ $

    -

    $3\ :\ 55$

    -

    看了一下 $T4$ ,感觉像 树上DP ,但没推出来,转去了 $T3$。

    -

    $\ $

    -

    $6\ :\ 00$

    -

    一直在调 $T3$ ,感觉灵魂出窍。

    -

    $对其原则$ 很好做,但 $4$ 操作难调得死,最后修修补补的过了大样例。

    -

    考完发现没有初始化

    -

    $\ $

    -

    估分 $100\ +\ 50\ +\ +\ ?\ +\ 0\ =\ 150^+$

    -
    -

    反思

    -

    比赛节奏感觉可以,$S$ 组 $T4$ 没看出来感觉很可惜。

    -

    听说 $J$ 组的 $T4$ 是分层图最短路,考场上自己没去想。

    -

    $S$ 组 $T3$ 能拿多少是多少,得一等的希望就在他身上了。

    -
    -]]>
    -
    - - 图论总结 - /2024/01/09/%E5%9B%BE%E8%AE%BA%E6%80%BB%E7%BB%93/ - - diff --git "a/tags/\345\233\276\350\256\272/index.html" "b/tags/\345\233\276\350\256\272/index.html" index 52a376ad3..583e8b4c3 100644 --- "a/tags/\345\233\276\350\256\272/index.html" +++ "b/tags/\345\233\276\350\256\272/index.html" @@ -2,6 +2,7 @@ + @@ -404,5 +405,20 @@ + +