CQ 省集听课记录

CQ 省集听课记录

节奏比较快,不太能跟得太上

day 1

奶龙神

  • qoj1139

    \(dfn\) 的理解加深了。

    按朴素 dfn 标法的话。

    你想要获取路径上的第二个点,你知道父亲是哪个点,问题就在于对方的 \(dfn\) 足够大的话,你无法分辨是从最后一颗子树里还是从父亲绕出去。

    我们想要设计一个方法区分它们,这启发我们相邻层数采取不同策略

    对树黑白染色,黑点取子树内编号最大值,白点取最小值。

    树内编号仍然连续,同时,这样做,对于白点,可以区分目标点范围(因为是向后划分)。

    对于黑点,我也能知道子树的边界。

  • qoj 8650

    问第 \(k\) 近点。

    固定一个树,相当于找到定根后每个点的父亲,因此考虑以 \(1\) 为根,问 \(1\) 到每个点的距离,这样就知道了深度的相对关系,将其排序,此刻后,考虑每个点的父亲都在它前面,所以贪心地,暴力对于每个点,从最近开始不断询问,直到遇到一个点,在这个序列中位于这个点的前面,就找到了父亲。

    考虑这样的次数一定是最坏 \(2(n-1)\) 次,理由是每条边最多被两个端点遍历一次。

    这太坏了,但注意到如果问到的点不是这个点的父亲,则这个点一定是问到的点的父亲,因此一次至少确定一个点的父亲,最多 \(n-1\) 次。

  • qoj13902

    这题神了,而且有点循环论证的感觉(但从字典序从小到大论述也确实是严谨的)

    第一步,你什么都不知道,所以肯定是问 \(P_0-1\)

    考虑得到的物品序列,由于序列是递减的,因此设得到的和为 \(sum\),个数为 \(k\),序列为 \(a_1\sim a_k\)

    这就意味着 \(P_{a_1}> \lfloor\frac{sum}{k}\rfloor\)

    那么我问这个值,就又变成了一个后缀问题,用这个值问一次,设得到的第一个物品是 \(x\),则显然有 \(x>a_1\)\([x,n]\) 形如子问题。我们假装设计一个 solve 函数可以解决一个后缀的整体的值,假装我解出来了,那么把这些值带入 \(a_{1}\sim a_k\) 中可以确定的元素,就可以再去递归了。

    显然第 \(i\) 个点最多被前面 \(i\) 个点发起一次递归,不会超出限制。

  • qoj16001

    • 假设我们能找到一个矩阵 \(B\),使得 \(D = A \oplus B\)满秩矩阵(即秩为 \(N\))。由于在 \(\mathbb{F}_2\) 上,满秩矩阵是可逆的,我们可以通过每次仅翻转 \(D\) 中的一个比特(相当于加上一个秩为 1 的矩阵 \(e_i e_j^T\)),来观察秩的变化。
    • 根据矩阵求逆的性质,对于可逆矩阵 \(D\)

    \[\text{rank}(D \oplus e_i e_j^T) = \begin{cases} N - 1, & \text{如果 } (D^{-1})_{j,i} = 1 \\ N, & \text{如果 } (D^{-1})_{j,i} = 0 \end{cases} \]

    因此,只需要通过几次随机,得到一个满秩的矩阵 \(B\)(将行看作二进制数),就可以通过不断翻转 \(B\) 得到 \(D^{-1}\),接着还原 \(D\),就能得到 \(A\)

  • P15496

    考虑一个点在表达式树上不断跳父亲,当每次作为右侧儿子跳过父亲时,拿出其左侧儿子里最左的叶子。

    因为操作非常特殊,仅有 \((1,0)\) 可达 \(0\),所以尽量靠左的位置是优的。

    考虑你把这些都选出来后,根据选出的点数可以知道最终解是多少。

    那么,考虑从 \(i\to i+1\),显然 \(i+1\) 选出的点集除了可能含有自己之外,一定是 \(i\) 的子集。

    \(i\) 拿出了 \(C_1\sim C_k\),我们想要求出一个 \(C_t\),这样 \(i+1\) 以及 \(C_{1}\sim C_t\) 会组成 \(i+1\) 选出的点集。

    将这些点与 \(i+1\) 都设为 \(1\) 后询问,我们就能知道 \(t\) 的奇偶性。

    如果 \(t=k\),式子的值会与 \(i\) 相比改变。

    • \(t=k-1\) 不变
    • \(t=k-2\) 改变
    • \(\dots\)

    那么这里有了奇偶信息,但我们还是不能求出确切的 \(t\)

    考虑 \(t\neq k(\bmod 2)\),我们能删掉 \(C_k\),那么问题转化为判定当前 \(C_k\) 是否合法。

    一个观察是将 \(C_{k},C_{k-1}\) 都设为零,如果 \(k\neq t\),值不变,否则 \(k=t\)

    判断的时候先判奇偶性,合法再判下面的,每个数字进 \(C\) 和出 \(C\) 一次,同时这里可以跳过奇偶性不同的位置,因此只需要 \(0.5n\) 次。

  • CF1299E

    注意到无法区分 \(p_1\sim p_n\)\(n+1-p_1,n+1-p_2\dots n+1-p_n\)

    先尝试一些较为容易的操作。

    • 可以锁定 \(1,n\),仅有这两个数可以在全集去掉它后被整除。可以先假设第一个是 \(1\)

      可以 \(n\) 次找到。

      锁定 \(1,n\) 后,可以锁定 \(2,n-1\)(只需要删掉 \(1,n\),就是规模为 \(n-2\) 的子问题)

      由此类推,可以在锁定 \(1\sim i,n-i+1\sim n\) 后用 \(n\) 次找出 \(i+1\)\(n-i+1\)

    • 一次询问两个数,可以判断奇偶性。

      由此,在上一个中,我们找到的 \((1,n)\) 不妨假设第一个找到的是 \(1\),根据奇偶性就能判断出后面找到而原组,哪个是 \(i\) 哪个是 \(n-i+1\) 了。

    • 可以在 \((x-1)n\) 次询问中确定 \(p_i\bmod x\)

      前提是你知道 \(1\sim \lceil\frac{x}{2}\rceil\) 以及它的对称值。

      它们一定能够组合出用 \(x-1\) 个数,凑出 $\sum \bmod x=0,1,2\dots x-1 $ 的所有情况。

      原理是先拿出几个,在这个方案上改动。

      比如 \(x=7\)\((1,2,3,n-3,n-2,n-1)\) 就是一个方案。

      在此基础上,删掉 \(1\sim 3\) 的某个加入 \(4\),以及删掉 \(n-3\sim n-1\) 的某个加入 \(n\),都能带来 \(1\sim 3\) 的正收益,则总收益是 \(7\)

      显然你只需要取其中 \(x-1\) 种,都不是就取最后一种。

    • 考虑 \(n\le 800<8\times 3\times 5\times 7\)

      选取 \(3,5,7,8\) 四个两两互质的去做

      求出 \(x=1,2,3,4,n-3,n-2,n-1,n\),只需要 \(4n\) 次。

      对于 \(3,5,7\) 都是好说的,只需要 \(2+4+6=12n\) 次即可。

      仔细分析是到不了这么多的,原因是你按固定策略去检验,则对于每个 \(\bmod q =t\) 的值,会校验 \(\min(t+1,q-1)\) 次。

      而值是均匀分布的,可以简单认为只需要一半次数,即只需要平均 \(n\frac{q+1}{2}\),同时规避最后一个,即减 \(\frac{n}{q}\) 次。

      \(\frac{1+2+\dots +q-1+q-1}{q}\)

      所以其实还有好几次。

      然后考虑 \(8\) 怎么算,一般的方法太炸裂了。

      注意到,容易求出 \(2\),按照 \(\mod 2=1,\bmod 2=0\) 分两组,每组分别构造 \(\bmod 4=1,\bmod 4=0\) 能够判断出来其 \(\mod 4\) 的具体值,到这里只需要 \(n\) 次。

      再者扩展到 \(8\),对每个 \(\bmod 4\) 的组分别设计一个 \(\bmod 8\) 的值去检验,只需要 \(n\) 次。

      \(3n\) 次。

      用了 \((4+3+\frac{(3+1)+(5+1)+(7+1)}{2}-\frac{1}{3}-\frac{1}{5}-\frac{1}{7})n=15.3n\) 次。

  • qoj6774/P9512

    最暴力的,拼一个 \(m=1002\) 的东西。

    这是暴力枚举前缀,我们也可以考虑暴力枚举后缀,建立KMP自动机即可,\(m=1001\)

    两个东西结合取一半可以有 \(502\)

    考虑一个神秘的想法:建立两个大小同为 \(p\) 的环,在每个环的第 \(r\) 个位置之间建立边。

    当跳到这个第 \(r\) 个位置且值为 \(1\) 时就去另一个环。

    这样能够知道 \(\sum v_x[v\bmod p=r]\bmod 2\) 的值。

    相当于给了一个异或方程。

    对所有的 \((p,r)\) 用线性基进行枚举,最大的基底只需要 \(m=114\)

    (显然只需要用未知数个方程,按 \(p\) 从小到大)。

    因此,考虑用最暴力的前后缀,在 \(102\) 范围内求出合理的前缀和后缀,这样就只剩下八百个未知数了。

    发现此刻就只需要 \(m=102\) 能够凑出所有的解了。

  • P11988

    需要 key obversion.

    考虑一点基础操作:

    • 我们知道,树就可以完整表达两点连通性,两点可达性信息了,那么如何将图转化为树?

      随意找一颗生成树,然后将树确定后,跑拓扑得到拓扑序,所有原图中的边全部按照拓扑序来定方向。

      这样,如果原本树上可达,则操作后一定同样可达。

      同理,如果 \(rk_A>rk_B\),同样是不可达的。

      综上,只有在树不可达的时候才可能出现保留图边之后的按拓扑序的可达。

      因此问题相当于被强化。

    • 当我们得知树上一个 \(A\) 可达 \(B\) 的方案后,如何找出两点?

      设树拓扑序 \(l=rk_A<rk_B=r\)

      则有仅保留拓扑序在 \([l,r]\) 的点以及顺序后仍然连通,目标求出 \(l\)\(r\)

      那么可以先二分 \(l\),将 \([mid,n]\) 的部分放在最前面,再将 \([1,mid-1]\) 逆序放到最后。

      如果 \(mid<l\) 则显然可达,否则显然不可达。

      二分 \(r\) 同理。

    • 如何构造不超过 \(70-2\log\) 个树定向方案,使得 任意有序点对 必然在一个定向方案里可达。

      考虑一个很有效的操作,可以一次性解决大部分点对。

      拿出树的重心,并将各个儿子按照 \(sz\) 做石子合并,直到最后只剩下两堆,第一堆中的子树里的点,全部定向指向父亲,第二堆里全部指向儿子。

      这样,如果两个点分属两堆,则一定可以在这个方案,以及这个方案的逆方案(反转所有顺序)中被表达。

      那么我们就只剩下两堆内部的点对了,此刻可以递归解决(如果一堆中不止一颗子树,可以将建一个虚点用来表达根,与这一堆里所有子树根连边。)

      你不会建立超过 \(n\) 个虚点(一条边最多一个,其实相当于在做儿子兄弟表示法)。

      并且,加上了石子合并后,一定可以说明下传的两堆大小都不超过 \(\frac{2}{3}sz\)

      因此只需要 \(2\log_{1.5}(2n)\)

    虽然算下来是 \(74\) 次,但由于几个过程都不可能跑满,可以通过 \(70\) 次的限制。

  • qoj3097

    感觉对二分的本质理解了好多。

    • 由于 A 能够发给的 bit 尽量少,如何给 B 传递一个尽量小的范围呢?

      建立广义线段树(根节点也代表序列一个位置)

      然后将 \([l,r]\) 放到线段树上去查找,最多查找 \(13\) 步,或者遇到这个区间即将被切割后停止。

      传递在线段树上的深度和行走路径,给B缩小范围。

      卡常:由于只有13层,而深度0,1的要求高得多。

      000,001 表达深度 0/1
      01__ ,10__ ,11__ 分别表达深度 [2,5],[6,9],[10,13]

      那么 N’ = N/2^d 了

    • A 能做得很少了,B 如何让 A 尽量不需要回复信息就能推断?

      此刻 \(A,B\) 都能知道区间范围,B 直接传一个长度为 \(2len\) 的笛卡尔树括号序列进去(也就是单调栈的进出序列)。

      A可以还原这个笛卡尔树,进而求 \([l,r]\) 的 LCA 作为最值点。

    • 但这样在深度比较浅的时候,A 还能回复信息,但 B 不堪重负。

    • 如何?考虑如下区间构造:

      拿出目前 \(B\) 所知候选区间 \([ql,qr]\),它在线段树上一定是一颗子树代表的区间,所以真实区间 \([l,r]\) 一定过树根 \(p\)

      \(I_0=[p,p]\)

      考虑 \(I_{i+1}\),从 \(I_i\) 的两侧中选择较大且可拓展的方向拓展。

      那么满足性质:只要我知道真正区间 \([l,r]\),被 \(I_{R}\) 包含,且不被 \(I_L\) 包含。

      则有:
      \([l,r]\) 的最小值要么等于 \(I_L\) 最小值,要么就完全不在 \(I_L\) 区间里

      证明:反证法:\(I_L\) 最小值 \(t\) 小于 \([l,r]\) 最小值 \(k\),且 \(k\in I_L\)

      显然,只有在 \(p<t<k\) 或者 \(p>t>k\) 的时候,才能出现这种情况。

      但这样就能推出 \(t\in [l,r]\)

      因此,\(B\) 可以求出 \(I_0\sim I_{qr-ql}\)

      并且来做二分(做是否包含的二分)。

      由于双方都知道是怎么做二分的,因此,只需要传入这次的区间与上次的区间,其左端点的 \(\Delta\) 即可。

      这样 A 能算出来右端点 \(\Delta\) 并回复。

      位数要传够,所以不足可以高位补零。

      最开始取 \(k=\lceil\log_2(qr-ql+1)\rceil\),后面依次取 \(k-1,k-2\dots\)

    • 仔细计算次数,发现问题已经解决。


day2

全程开飞机,不知道xqw说了什么。

收获如下:

  • 遇到复杂的组合式子,需要优化复杂度,可以尝试编组合意义
  • 格路容斥,遇到路径中强行与 \(0\)(或者 \(k\))取 \(\max / \min\) 时,考虑这本质上是一个对称

day3

  • CF1646F

    核心思想是找中间状态。一般满足中间状态特殊,存在容易调整到中间状态的策略。

    这样就只需要单独构造一个独特的中间状态到目标的操作。

    考虑一个中间状态是所有人手里的牌是不一样的,即每个人都拥有 \(\{ 0,2,\dots n-1\}\)

    这个中间态到解是容易的。

    操作 \(\{1,2,3,4\dots n-1,0\}\)

    操作 \(\{2,3,\dots n-1,0,1\}\)

    操作 \(\{1,2,3\dots n-1,0\}\)

    操作 \(\{3,\dots 0,1,2\}\)

    ……

    分为第 \(1\sim n-1\) 轮,第 \(i\) 轮执行 \(i\) 次。目标是将人 \(x\) 手上的牌 \(x+i\) 送到 \(x+i\) 手上去。

    所以轮流传递。

    \(\frac{n(n-1)}{2}\)

    一般态到中间态也是容易的。

    考虑从第一个拥有两张相同牌的人开始逐步传递,这个人将相同牌传一张给下一个人,如果下一个人有也有相同牌就把自己的相同牌往下传,否则就传这个人传给我的。

    考虑每一轮每个人只要传递一次,则总的牌距就会下降至少 \(1\),因此只需要最多 $\frac{n(n-1)}{2} $ 轮。

    牌距定义为每一类牌距离之和。

    每一类牌距离定义为给牌标号后,每个牌最初位置和其标号之间的环距差的最小值。

    这个值显然不超过 \(\frac{n(n-1)}{2}\)

  • qoj10429

    这个比较神秘啊。

    但核心思想和上题一致是 找共享中间状态

    注意仙人掌最有效的中间状态是 \(m=n-1+\lfloor\frac{n-1}{2}\rfloor\)

    即菊花套三元环,我们想要让两个都调整为这个形态。

  • CF1508D

    同样是考虑调整到一个好的中间状态

    交换本质上是在合并/分裂置换环

    可以考虑将所有点合并为一个大环,再去直接消去。

    拿出最左下角的点,然后对剩下的点做极角排序。

    考虑按排序后顺序遍历点,如果相邻两个没有在同一置换环就交换,这样就组合成一个大环了(这里把左下角的点先忽略)。由于做了极角排序,所以线段不会有交。

    然后,考虑拿出左下角的点,按顺序与每个点进行操作。

    这样环会一直缩小,最终达成每个点都是自环的目的。

        for(int i:b)if(find(i)!=find(a[i]))f[find(i)]=find(a[i]);
        vector<pair<int,int> >ans;
        for(int i=1;i+1<b.size();++i){
            int u=b[i],v=b[i+1];
            if(find(u)!=find(v)){
                swap(a[u],a[v]);
                f[find(u)]=find(v);
                ans.emplace_back(u,v);
            }
        }
        while(a[p]!=p){
            ans.emplace_back(p,a[p]);
            swap(a[p],a[a[p]]);
        }
    
  • CF1053E

    欧拉序这种强递归定义的,自然也是考虑递归构造。

    考察当前在构造 \([l,r]\),它是一颗子树的欧拉序。

    要求 \(r-l\) 是偶数,否则直接无解。

    要求 \(a_l=a_r\) 因为是树根。

    同时要求区间出现的数字个数是 \(\frac{r-l}{2}\)(这里除掉树根)表达子树大小。

    首先,若 \(a_i=a_j\neq 0\),可以先递归 \([i+1,j-1]\),接着删掉 \([i+1,j]\)

    可以通过记录每个位置,后面首次值相同的位置做到。

    如果这个过程中有跳出 \([l,r]\) 的情况,直接无解。

    解决掉这个之后,就没有相同元素了。

    接着就只需要保证区间内出现过的值的个数是区间长度的一半这个限制(之前的递归不会影响这个限制),以及解决一下 \(0\) 的问题。

    如果出现的值太多,直接无解,否则考虑将在整个序列尚未出现的元素取若干个出来达成值个数的要求。

    直接填在 \(0\) 的空位上即可。

    接着,考虑剩下的空位 \(0\) 如何处理。

    当前,一半及以上的位置有值,两端有值,没有重复值(可以把树根一并在前面的递归处理了,显然不会影响正确性)

    直觉是将 \(0\) 全部变成树根,但树根不能替换连续的两个 \(0\)

    一个构造方法是:找到所有的 ab0 或者 0ba,将其替换为 aba 后缩点为一个 a

    最后不能缩了,就替换为树根。

    正确性:最终状态显然正确,一定是 a0b0c0d0e0f…… 这种,填入一定没问题。

    而一般情况,会减少一个非零 和一个 0,最终一定可以规约到最终状态。

  • CF 1168E

    这个题其实比较神了。

    考虑最开始令 \(p_i=q_i=i,v_i=p_i\oplus q_i\),我们想要 \(i:1\to n\) 调整使得 \(v_i=a_i\)

    考虑扫描 \(i:1\to n\),若 \(v_i\neq a_i\),则让 \(v_i,v_{i+1}\) 都异或上 \(v_i\oplus a_i\),然后调整 \(i,i+1\)\(p,q\)

    定义操作 sol(i,j) 为调整 \(p_i,q_i,p_j,q_j\) 使得满足 \(v=p\oplus q\)

    sol(i,j) 执行步骤:

    • 找到 \(p_k=q_i\oplus v_i\)
    • \(k=i\) 已经 OK。
    • \(k=j\) 直接交换 \(p_i,p_j\) 即可。
    • 否则交换 \(p_i,p_k,q_i,q_k\),继续调整 sol(k,j)

    可以说明一个 \(k\) 不会被操作两次。

    核心思路:调整法通过微扰制造调整局面,再逐渐调整消去扰动并达成目的

day 4

这里是各学校巨佬的题目分享。

  • ARC155E

    注意到每次可以让线性基大小减少一——用奇数个基底搞出来的和用偶数个搞出来的分开。

    注意到如果含有零,则最多让线性基大小减少 \(1\)

    一般情况,将所有数字异或上 \(a_1\) 就含有零了

    并且这样显然不会影响答案(同时异或同一个数的影响,做一轮操作就抵消了)

    因此只需要特判 \(n=1\),否则就是 \(a_i\oplus a_0\) 的线性基大小。

  • CF1762G

    等价于将 \(a\) 拆成两个子序列然后归并,使得相邻位置值不同。

    特殊情况是绝对众数炸掉。

    否则考虑增量构造,监测一下每个时刻的,尚未填写的,最大相同值的出现次数及其这个值。

    一般情况下,维护两个指针,遇到下个数字与填的数字相同,就再往后跳一个留下一个gap。

    如果发现新填的数字可以填入 gap 就立刻填入。

    一直这样做,直到绝对众数的出现。

    此刻,直接将尚未填写的位置,从 \(p\) 开始 \(p+2,p+4\dots\) 全部填入绝对众数,gap 填一般数字即可。

  • CF2066F

    显然每次取最长最大子段和替换不差。注意两个最长子段如果有交则它们的并是最长子段。

    考虑第一次操作一个极长最大子段 \([l,r]\),可以说明,以后的所有操作不会跨过 \((l-1,l),(r,r+1)\)

    若跨过,说明其为新的最大子段。设其为 \(x\le l-1<l\le y\)

    则说明 \([x,l-1]\) 这一段和非负,因为其为最大子段,任意前缀后缀和都是正的

    因此最开始左端点就应该扩展到 \(x\)

    由此,可以处理出递归所有的需要操作的区间(取出最大极长子段和,然后分治)。

    目标是调整这些段,使得合法。

    可以说明,存在一个 \(X\),使得段和 \(\le X\) 的段必须和 \(b\) 中的区间直接匹配对应,段和 \(>X\) 的段可以自由变化,但最终只能有一段,段和最终 \(>X\),其余必须 \(\le X\)。(即段和 \(>X\) 的段可以匹配 \(b\) 中段和 \(\le X\) 的一段,而段和 \(<X\) 的段必须值一一匹配)。

    构造方法:将所有 \(>X\) 的段调小到 \(\le X\),将最后 \(>X\) 的那个段调到 \(X\)

    最后将这个段放大。

    这个写个 dp 即可。

    枚举 \(X\)\(O(n)\) 个),写 \(dp_{i,j,0/1}\) 表示前 \(i\) 段匹配 \(b[1,j]\),是否已经指定,这个方案是否可行。注意一下转移即可 \(O(n^2m)\)

    在填一个 \(>X\) 的段对应 \(\le X\) 的段时,固定 \(i\),枚举 \(j\),可以动态扫描 \(t\) 满足 \([j,\le t]\) 的和合法。

    记录一下当前已经合法的最大 \(j\),下次转移的时候从 \(j+1\) 开始。对 \(dp_{0/1}\) 分开处理。

  • qoj16230

    我觉得这个题还是比较牛的。

  • agc044e

    容易得到式子:

    \[f_i=\max(A_i,-B_i+\frac{f_{i-1}+f_{i+1}}{2}) \]

    可以从 \(\max A\) 处断开,变成一条链。

    考虑设 \(g_i=f_i-c_i=\max (A_i-c_i,\frac{g_{i-1}+g_{i+1}}{2})\)

    如果这个成立,\(g\) 就是 \((i,A_i-c_i)\) 所组成凸包上的点(引出 \(x=i\) 与凸壳交点的纵坐标)

    考虑:

    \[-B_i-c_i+\frac{f_{i-1}+f_{i+1}}{2}=\frac{g_{i-1}+g_{i+1}}{2}\implies c_i+B_i=\frac{c_{i-1}+c_{i+1}}{2} \]

    因此,设出 \(c_0,c_1\) 即可解出所有 \(c\),然后求凸包即可。

    \(c_0,c_1\) 可以任意指定。

    最后求 \(\sum f\) 即可,在凸壳的直线上求整点权值和,相当于等差数列和。

  • qoj9438

day 5

  • qoj11117

    \(i\) 向区间 \([l_i,r_i],i\in [l_i,r_i]\) 连有向边

    存在一个回路(不需要简单)经过点集恰好为 \(S\),等价于点集 \(S\) 导出子图强连通。

    如何判断这样的 \(S\) 是否导出子图强连通?

    每次从 \(S\) 里找两个相邻的点,如果有双向连边就缩起来

    能缩成一个点就合法,否则非法。

    考虑假设一条回路,一定存在点,有左侧第一个点从左往右越过它,而它指向左侧其他点。或者翻过来说右侧点。

  • qoj9698

    若干年前模拟赛题。

    有若干个全局取 \(\min\) 操作,和若干个区间取 \(\max\) 操作,初始序列全 \(0\),安排操作顺序,计数可以得到的序列种数。

    其本质,将所有区间取 \(\max\) 操作复制全局 \(\min\) 操作次数份,每一份跟对应的取 \(\min\) 值取 \(\min\)

    除了 $\le $ 取 \(\min\) 中的最小值的取 \(\max\) 操作必须执行之外,其他操作可以选择执行与否。

    其得到的序列和原操作得到的序列是一致的,这样就只剩下取 \(\max\) 操作了。

    只需要设 \(f_{l,r,k}:a[l,r]\ge k\) 的方案数即可。转移枚举 \([l_1,r_1],[l_2,r_2],r_1+1<l_2\),判断 \([r_1+1,l_2-1]\) 是否可以被全覆盖即可。

  • CF1975I

    神题。循环 dp 神了。

    值得关注的量是 手牌的最大值

    我们希望用手牌最大值最后逐渐减小来刻画问题。

    f[i,j,k]:最大值为a[i],除掉a[i],自己还有j张手牌,首次max<i后,还有k张手牌的概率
    固定i,j,考虑找到k的系数
    设 g[x,t]:固定i,j首次到达<=a[x]的状态时有t张手牌的概率
    除掉初始无效j张牌,概率p=(t-j)/(x-j)拥有此卡牌

    1. 无x,g[x-1,t]+=g[x,t]*(1-p)
    2. 有x,g[x-1,v]+=g[x,t]pf[x,t-1,v] v in [a[x]+t-1,x-1]
      f[i,j,k]=g[i-1,k]

    考虑求答案
    h[i,j]:[1,i],算上初始局面,手捏j张牌输掉概率
    若a[i]=0,则所有pre[i]<=j<=i,h_{i,j}=0
    否则:

    1. 若持有此牌
      h[i,j]=\sum h[i-1,k] * f[i,j-1,k] k in [j+a[i]-1,i-1]
    2. 否则:
      有概率(j-pre[i])/(i-pre[i])拥有,设概率pi
      h[i,j]=pi...上面依托... + (1-pi)h[i-1,j]

    \(g\) 可能会有循环转移,需要小心,可能记一下自己状态是一次函数 \(kx+b\),维护 \(k,b\),然后解 \(kx+b=x\implies x=\frac{b}{1-k}\)

  • CF2018F3

    以前抄题解补过

    核心观察,后面全是 DP 技巧。

    \(l,r\) 合法则 \([l,r]\) 都合法。

    且最优策略是占据 \([l,r]\) 这个区间后再谈其他。

    然后考虑倒序验证合法性,如果一个位置能作为最后到的,那么选它最后到一定没关系。

  • CF2039F2

    转置原理好题。

posted @ 2026-06-14 16:08  spdarkle  阅读(9)  评论(0)    收藏  举报