我的一位神兽朋友4

我有一位神兽朋友,后面忘了。


  • [Xmas2020] Famous in Russia

    2025.1.1

    先不考虑计数。对 \(b_i\) 排序,然后 dp,有转移 \(f_{i,j}=\min(f_{i-1,j},\max(f_{i-1,j-1},b_i)+a_i)\)。容易发现 \(f\) 下凸。维护这个凸包:考虑 \(b_i\) 的意义,即有一条基准线,线下凸包的形态不会改变,每次线会抬升,然后将 \(a_i\) 插入至线上的一个位置即可。

    直接 dp 套 dp 维护凸包是不行的。考虑拆贡献,即对每个分界点算出其贡献,一个点的贡献只与其属于第几个被基准线覆盖的和值有关。记 \(f_{i,l,r,j,k}\) 表示前 \(i\) 个点,钦定的分界点左边斜率为 \(l\) 右边为 \(r\),当前弹出了 \(j\) 个点,目前的值为 \(k\),直接转移,在被基准线盖住时计算贡献即可。时间复杂度 \(\mathcal{O}(n^3V^4)\)

  • BSOJ2562 在乡村V

    2025.1.3

    \(L=x+y\)。dp,记 \(f_{i,j}\) 用完前 \(j\) 时刻,做到第 \(i\) 个任务所需的最小金币数,这里我们只希望 \(j=kL\),即时间总为整天。转移时考虑从第 \(i+1\) 个任务一次加入,若对于任务 \(x\),目前时刻为 \(t\),做完时其没有处于睡觉时间,那么此时用金币显然不优,没必要转移。否则我们有两种决策:一是睡到第二天继续做任务,此时可以转移到 \(f_{x+1,t}\);二是用一些金币是的能在睡前完成,即在 \(\lfloor\frac tL\rfloor\cdot L+x\) 时刻吗然后再次计入 \(x+1\)。因为这一用金币最多只会回退一天,故不同的天数是不会超过 \(n\),总时间 \(\mathcal{O}(n^3)\),考虑优化。注意到我们在第二种决策的时候是会继续走的,若我们把他直接转移到 \(f\),那么实际上转移量就是 \(\mathcal{O(1)}\) 的了。具体地,我们让 \(j\in \{kL,kL+x\}\) 即可。

    最后统计答案,首先我们可以一次用 \(L\) 个金币,即直接回退一天。设还剩下 \(k\) 枚金币,此时最终时刻为 \(t\),若 \(t\mod L\ge k\)\(y+(t\mod L)-1\le k\),则最终时刻为 \(t-k\),否则为 \(\lfloor\frac tL\rfloor\cdot L\)。正确性容易证明。

  • [CEOI2020] 象棋世界

    2025.1.7

    只考虑 \(\texttt{B,K}\) 的部分,剩余是简单的。

    • 对于 \(\texttt{B}\),考虑枚举第一步的方向,因为要求步数尽量少,每一步我们尽量走到边界再折返。对于计数,我们发现之前的贪心部分的最后一段有些折线会空一部分。可以把这段的空任意分给其他折线,方案数是个组合数。
    • 对于 \(\texttt{K}\),最小步数显然为 \(n-1\)。方案数相当于,计数从 \((1,s)\to (n,t)\) 的方案,每次可以从 \((x,y)\)\((x+1,y+k),k\in \{-1,0,1\}\)。考虑到其有左右两边界,故可以反射容斥,那么一个点 \(x\) 会在 \((2m+2)k+x\) 时为正贡献,在 \((2m+2)k-x\) 为负贡献,这本质时一个在模 \(x^{2m+2}\) 意义下的多项式乘法,直接多项式快速幂可以做到 \(\mathcal{O}(m^2\log n)\)\(\mathcal{O}(m\log m\log n)\)
  • CF1444E Finding the Vertex

    2024.1.8

    类似于 AGC009D,只不过是边分,要复杂许多。

    \(f_x\)\(x\) 子树内最优情况下没有消掉的边权值集合,\(f_x\) 显然是字典序越小越好。合并子树时可以逐位确定答案,即先将所有位设为 \(1\),从高往低枚举该位是否能为 \(0\)。check 的时候也是从高往低位扫,遇到一个 \(1\) 时取出最大的 \(f\),若其最高位高于当前位,肯定是不行的;若等于,消掉 \(f\) 的这一位;否则 \(f\) 可以完全被消完。最后看一下 \(f\) 消完没有即可。

    但是这样并不好确定每条边的值,直接枚举即可,复杂度是可接受的。

  • [THUWC 2020] 某科学的动态仙人掌

    2025.1.9

    对于每个连通块,我们想找到一个代表元,然后只需统计有贡献的代表元即可。不难发现我们可以拿深度最小的点作为代表元,若有多个,可任取(如编号最小),这是因为一个点若不是连通块中深度最小的点,其必会连向一个深度比他小的,证明显然。

    按深度排序,记排名数组 \(id\)。对于每个点 \(x\),求出其作为代表元个贡献区间,即 \(L_x=\max\{y\ |\ id_y<id_x,y<x,dis(x,y)\le X\},R_x=\min\{y\ |\ id_y<id_x,y>x,dis(x,y)\le X\}\),可以拿点分治维护。然后其有贡献当且仅当 \(l\in(L_x,x],r\in[x,R_x)\)。二维数点即可,时间复杂度 \(\mathcal{O}(n\log^2n+m\log n)\)

  • CF1545D AquaMoon and Wrong Coordinate

    2025.1.11

    首先我们记每一行的和,即 \(s1_t=\sum x+t\sum v\),故 \(s1_i\) 是一个一次函数,我们可以直接确定不在直线上的点,求出第一问。对于第二问,类似地记平方和,即 \(s2_t=\sum_{i=1}^n(x_i+v_it)^2=\sum x^2+2t\sum vx+t^2\sum v^2\),这是个二次函数,知道任意三项后可以解出 \(\sum v^2,\sum vx,\sum x^2\),即函数解析式,由前面我们还知道 \(\sum v\),那我们便得知操作的数的变化量 \(\Delta\),故可以枚举哪个点被操作了,检查此时的 \(s2\) 是否在函数上即可,容易证明这是唯一的。

  • CF1392H ZS Shuffles Cards

    2025.1.22

  • CF1967E2 Again Counting Arrays

    2025.2.5

    转成格路计数的形式,从 \((0,b_0)\) 开始,每次 \(x\gets x+1,y\gets y\pm1\),要求在 \(n\) 步之内碰到直线 \(y=-1\),且不能碰到 \(y=m\)。对于每一步,走到 \(y+1\) 的贡献为 \(m-1\)\(y-1\)\(1\),求贡献和。

    枚举碰到 \(y=-1\) 的位置,问题变为走到 \((x,-1)\) 的方案贡献和,中间不能碰 \(y=-1,y=m\)。我们发现对于固定终点,向上走和向下走次数固定,故贡献和固定,只需算方案数即可,方案数可以用经典的反射容斥解决,时间复杂度 \(\mathcal{O}(\frac{n^2}{m})\)。结合暴力 dp 可以做到 \(\mathcal{O}(n^{1.5})\)

    考虑将反射容斥的组合数写出来,可以得到这样的形式: \(\sum_{k\ge0}\binom{x}{y+k(m+1)}\)。但是 \(x\) 是变化的,很难直接维护。怎么办呢,之前在碰到 \(y=-1\) 后,我们直接结束了,实际上我们可以强制钦定走 \(n\) 步,但是必须碰到 \(y=-1\) 且在碰到之前不能碰到 \(y=m\)。枚举终点 \((n-y,y)\),若 \(y\ge-1\) 则将其与 \(y=-1\) 对称表示必须经过。然后直接反射容斥即可。注意我们实际计算的是 \((-1)-(m,-1)+(-1,m,-1)-(m,-1,m,-1)...\),故应对终点对称。最后的式子中满足 \(x=n\),故直接需处理组合数和即可。总时间复杂度 \(\mathcal{O}(n)\)

  • CF1948G MST with Matching

    2025.2.7

    注意到 二分图中 最大匹配 = 最小点覆盖。故直接 \(\mathcal{O}(2^n)\) 枚举点覆盖,拿所有存在一个端点在点覆盖中的边跑 MST 即可。时间复杂度 \(\mathcal{O}(2^nn^2)\)

  • AGC034F RNG and XOR

    2025.2.8

    设答案数组 \(f\),有 \(f_i=\begin{cases}0&i=0\\1+\sum\limits_{j\oplus k=i}f_jp_k&i>0\end{cases}\),于是 \(f=c+f*p\),其中 \(c(x)=tx^0+\sum_{i\ge0} x_i\)(因为实际上 \(f_0=0\) 所以加个 \(t\) 做修正参数)。考虑集合幂级数:\(\operatorname{FWT}(f)_i=\operatorname{FWT}(c)_i+\operatorname{FWT}(f)_i\operatorname{FWT}(p)_i\),带入 \(i=0\) 得:\(\operatorname{FWT}(f)_0\cdot (1-\operatorname{FWT}(p)_0)=\operatorname{FWT}(f)_0\cdot 0=\operatorname{FWT}(c)_0\),故 \(\operatorname{FWT}(c)_0=0\),由此得到 \(t=1-2^n\)(因为 \(\operatorname{FWT}(f)_0=\sum f_i\))。然后就可以求逆解决了。但是注意到 \(\operatorname{FWT}(1-p)_0=0\),无法求出第 \(0\) 项,但我们发现不管第 \(0\) 项取什么值,最后答案中每一项的变化量相同,故直接带入 \(f_0=0\) 即可得到答案。时间复杂度 \(\mathcal{O}(2^nn)\)

  • QOJ4635 Graph Operation

    2025.2.13

    建图,首先 \(|S_x|\neq|T_x|\) 无解。否则一定有解,枚举 \(u=1\sim n\),考虑 \(u\) 的出边:

    • \(S_u=T_u\),则说明出边相同,跳过。

    • 否则令 \(p,q\) 满足 \(p\in S_u,p\notin T_u,q\notin S_u,q\in T_u\),我们想找到 \(w\) 满足 \(q\in S_w,p\notin S_w\)

      • \(w\) 存在,在 \(S\) 上操作 \((u,p,q,w)\) 即可。
      • 否则注意到操作可逆,所以不妨在 \(T\) 上进行操作。同样的找到 \(w\) 满足 \(p\in T_w,q\notin T_w\)(此时一定能找到),在 \(T\) 上操作 \((u,q,p,w)\)

      回到第一步继续上述步骤。

    为什么 \(w\) 一定存在?若第一种 \(w\) 不存在,则必有 \(S_q\subseteq S_p\),若不存在第二种则有 \(T_p\subseteq T_q\)。因为 \(\forall x,|S_x|=|T_x|\),所以若两个条件同时满足当且仅当 \(S_p=S_q\),此时 \(p,q\) 一定不存在。

    bitset 实现可做到 \(\mathcal{O}(\frac{n^3}{\omega})\)

  • QOJ10042 Scheduling

    2025.2.13

    首先将值域离散化:维护集合 \(S\),每次加入 \(\ge L_i\) 的三个值即可。然后用离散化的值求出新的 \([L_i,R_i]\)

    若我们知道一个选值集合 \(B\),则答案是好求的。考虑如何判断 \(B\) 是否合法,令 \(c(l,r)=\sum_i[l\le L_i\le R_i\le r],d(l,r)=|[l,r]\cap B|-c(l,r)\)。那么合法当且仅当 \(\forall l,r,d(l,r)\ge 0\)

    先确定一些必填的位置,令 \(f(l,r)=r-l+1-2c(l,r)\)。若 \(f(l,r)<-1\) 则必定无解;若 \(f(l,r)=-1\),则只能填 \((l,l+2,...,r-2,r)\)。扫描线求出 \(f\),对于每个 \(r\) 求出最小的 \(l\) 满足 \(f(l,r)=-1\)。这样序列被分成若干未确定的段,我们分段考虑,假设现在为 \([l,r]\):

    • \(r-l+1\) 为奇数,则必定填 \((l+1,l+3,...,r-1)\)
    • 若为第首尾段,非常简单,不再赘述。
    • 否则一定存在一个值 \(p\),我们会填成 \((l+1,l+3,...p-1,p+2,...,r-3,r-1)\)。贪心的考虑确定 \(p\) 的值,找到最小的满足 \(\forall l'\le r'\le r,d(l',r')\ge 0\) 的位置即可。可以用线段树扫描线维护。

    总时间复杂度 \(\mathcal{O}(n\log n)\)

  • CF1770F Koxia and Sequence

    2025.2.16

    可以看洛谷博客

    首先 \(n\) 为偶数答案显然为 \(0\)。否则一定只有回文序列的回文中心有贡献。

    先只算方案数,记为 \(F(n,x)\),考虑到 \(y\) 这维无法逆运算,我们容斥掉,即枚举 \(y'\in y\) 让填的数为 \(y'\) 的子集即可,同样的只有回文有贡献。若 \(n\) 为偶数,直接递归到 \(F(\frac n2,\frac x2)\);否则枚举回文中心的值 \(v\),递归到 \(F(\frac{n-1}2,\frac{x-v}2)\)。容易发现我们只用枚举 \(\operatorname{popcount}(n)\) 个值,记为 \(\{v_i\}\),再记 \(n\) 二进制下 \(1\) 的集合 \(\{c_i\}\)。我们即求满足 \(\sum 2^{c_i}v_i=x,v_i\subseteq y'\) 的序列 \(v\) 的方案数。

    考虑数位 dp,并把每个 \(v_i\) 拆位,记 \(t_i\) 表示有多少个 \(v\) 能贡献到 \(2^i\) 位,令 \(f_{i,j}\) 表示从后往前处理到了第 \(i\) 位,后 \(i\) 位还需 \(2^ij\) 的方案数。容易发现 \(j\le \log y\),故一次数位 dp 复杂度是 \(\mathcal{O}(\log x\log^2 y)\) 的,加上容斥难以通过。

    观察转移式:\(f_{i,j}=\sum\limits_{k}f'_{i,j+k}\binom{t_i}{k},f'_{i,2j+[i\in x]}=f_{i+1,j}\)。由 lucas 定理:\(\binom xy\equiv [y\subseteq x] \pmod 2\),故我们只用考虑 \(k\subseteq t_i\) 的情况即可。再将 \(t_i\) 拆位,即将 \(j\in t_i\) 贡献到 \(i+j\) 位去,同理可记 \(t_i'\)。我们发现新的数位 dp 转移和原本一样,但是复杂度变为了 \(\mathcal{O}(\log x\log\log^2 y)\)。既然 dp 形式一样,我们不妨重复做上述变换直到满足 \(t_i\le 1\),此时 dp 形式已经足够简单,那我们看看能否直接得出结果,观察一下:记 \(T=\sum2^it_i\),答案即为 \([x\subseteq T]\)

    那么如何求出 \(T\) 呢,不断暴力变换不够优秀,注意到第一次求 \(t_i\) 时是二进制位下的一个卷积操作,而后面的变换其实就是不断地进位操作,故实际上这就是乘法!即 \(T=n\times y'\)

    最后计算异或和,显然我们只用考虑 \(v_0\) 的贡献,依然拆位算,在容斥时枚举每一位 \(i\) 计算满足 \(i\in v_0\) 的方案数,实际上这等价于是对 \(t_i\)\(1\),再令 \(x\gets x-2^i\),最后求方案数乘上 \(2^i\) 计入答案。根据上面的结论,不难推出修改 \(t_i\) 即对 \(T\) 做加减法操作,一样算即可。最终答案即为 \(\bigoplus\limits_{y'\subseteq y,i\in y'}[x-2^i\subseteq ny'-2^i]\times 2^i\)。总时间复杂度 \(\mathcal{O}(y\log y)\)

  • [2021 集训队互测 Round 3] Alice、Bob 与 DFS

    2025.2.20

  • BSOJ2708 【2.21省选测试】字符串

    2025.2.21

    建出后缀树,按结点的字典序将出边排序。将询问离线,按 \(d_i\) 从小往大枚举,当 \(d_i\) 变化时,会使一些结点的儿子顺序做轮换操作,即选取最后若干个儿子,依次将其提到最前面。显然一个儿子只会提一次,暴力提即可。因为要支持 \(k\) 大查询,可以用平衡树维护 dfn 序,提儿子操作即为区间平移。总时间复杂度 \(\mathcal{O((n+q)\log n)}\)

  • CF1882E2 Two Permutations

    2025.2.21

    先对每个排列各自求解。考虑再每个排列前添一个 \(0\),那么一次操作即为选择一个数与 \(0\) 交换,然后将排列轮换知道 \(0\) 再首位。我们忽略轮换操作,转而枚举 \(0\) 最后的位置。对于每种情况计算最优结果即可。可以求出置换环再根据 \(0\) 是否再环上讨论求出一种情况的最优解。

    容易发现每种情况操作奇偶性不会变,对于奇偶分别求解。若两排列不存在奇偶性相同的解就无解,否则可以不断操作 \(1,n\) 来调整。对奇偶取 min 输出即可。总时间复杂度 \(\mathcal{O}(n^2+m^2)\)

  • CF1205E Expected Value Again

    2025.2.22

    首先把平方拆成 \(\sum\limits_{i,j}[i\in\operatorname{period}(s)][j\in\operatorname{period}(s)]\)。考虑对于固定 \(i,j(i\le j)\) 计算和法串数:

    • \(i+j-\gcd(i,j)\le n\),由 周期引理 知其存在长为 \(\gcd(i,j)\) 的周期,故方案数为 \(k^{\gcd(i,j)}\)
    • \(i+j-\gcd(i,j)>n\),考虑将 border 匹配位置对应字符连边,只考虑 \(i\) 时连通块数为 \(i\),加上 \(j\) 连通块会加 \(n-j\) 条边,加 \(\max(0,n-j-i+\gcd(i,j))=0\) 条环,故贡献为 \(k^{i+j-n}\)

    剩下的拿莫反推一推就可以做到 \(\mathcal{O}(n\ln^2n)\)

  • BSOJ2709 【2.24省选测试】数据结构

    2025.2.24

    一次操作即为对形似 ....????.. 的二进制串做加法/查询,其中 ? 表示 0/1 任填。对于一个加法和询问,若其两边都为非问号的部分相等则会有贡献,贡献为 \(2\) 的 两边都为问号的位置数 次方。对于加,我们枚举询问的问号区间,拿哈希表存。查询时再枚举加法区间,再反过来查询即可。朴素实现时空复杂度 \(\mathcal{O}(nm^2)\),离线下来可以把空间做到线性。

posted @ 2025-12-10 22:21  real60t  阅读(1)  评论(0)    收藏  举报