做题记录 25.1.31

\(\textcolor{purple}\odot\) P6071 『MdOI R1』Treequery

分类讨论

\(lc\) 为节点 \(l\sim r\)\(lca\)

\(lc\) 在子树 \(p\) 中,可得答案为 \(lc\)\(p\) 的链长

否则若 \(l\sim r\) 中有至少一个点在子树 \(p\) 中,则答案为 \(0\)

否则若 \(p\)\(lc\) 互不在对方子树中,答案为 \(lc\)\(p\) 的链长

否则 \(lc\)\(p\) 的祖先,答案为 \(p\)\(lc\) 的链上第一个 \(l\sim r\) 中有至少一个在其子树中 的节点,其可通过二分转化为 \(O(\log n)\) 个查询 \(l\sim r\) 中是否有点在给定子树中

原问题拆分为:

  1. 查询 \(l\sim r\)\(lca\)
  2. 判断一个点是否在另一个点的子树中
  3. 查询两点之间路径长度
  4. 查询一个点的 \(k\) 级祖先
  5. 判断 \(l\sim r\) 中是否有点在子树 \(x\)

\(2\)\(dfn\) 求,预处理 \(O(n)\),单次 \(O(1)\)

\(3\)\(4\) 都可树剖求,预处理 \(O(n)\),单次 \(O(\log n)\)

对于子问题 \(1\),树上给定点集的 \(lca\) 等于点集中 \(dfn\) 最小的点和 \(dfn\) 最大的点的 \(lca\),找到最小最大可 \(ST\) 表求,预处理 \(O(n\log n)\),单次 \(O(1)\)\(lca\) 可树剖求,单次 \(O(\log n)\)

对于子问题 \(5\),可通过 \(dfn\) 转化为二维数点,可主席树处理,预处理 \(O(n\log n)\),单次 \(O(\log n)\)

总时间复杂度 \(O(n\log n+q\log^2 n)\),瓶颈在于最后一种情况的处理,空间复杂度 \(O(n\log n)\)

\(O((n+q)\log n)\) 的解法

代码

\(\textcolor{purple}\odot\) P4587 [FJOI2016] 神秘数

一种暴力的算法是将 \(a_l\sim a_r\) 排序,从小到大扫描,初始令 \(x=0\),表示当前可以表示出 \([1,x]\) 内所有数,但无法表示 \(x+1\),设扫到的值为 \(v\),若 \(v>x+1\),则无法表示 \(x+1\),否则令 \(x\) 加上 \(v\)

暴力做是 \(O(mn\log n)\)\(O(nm)\) 的,考虑优化

\(x=0\),意义不变,求出区间中 \(\le x+1\) 的数之和 \(T\),若 \(T\ge x+1\),则 \([1,T]\) 内都能表示,令 \(x=T\),否则答案为 \(x+1\),容易证明该过程与之前算法等价

因此问题转化为快速求 \([l,r]\)\(\le x+1\) 的数之和,可主席树维护

总时间复杂度 \(O(n\log V+q\log^2 V)\)

代码

\(\textcolor{purple}\odot\) P2481 [SDOI2010] 代码拍卖会

转化为有长度为 \(9\) 的非负整数序列 \(a_{1\sim 9}\),单调不升,且 \(a_1=n\),满足 \(\sum_{i=1}^9 \frac{10^{a_i}-1}9\equiv 0\pmod p\)(类似珠排序的方式翻转序列)

对于每个 \(0\le x<p\),求出 \(g_x=\sum_{i=1}^n [\frac{10^{a_i}-1}9\equiv x\pmod p]\),可证 \(\{v_i\mid v_i=\frac{10^{a_i}-1}9\bmod p\}\) 有长度不超过 \(O(p)\) 的循环节,因此 \(g_{0\sim p-1}\)\(O(p)\) 求出

\(f_{i,j,k}\) 表示 \(g_{0\sim i-1}\) 中选择了 \(j\) 个数,总和 \(\equiv k\pmod p\)

\(f_{0,0,0}=1\)\(\forall c, \gets f_{i+1,j+c,(k+ci)\bmod p}\binom{c+g_i-1}{c}f_{i,j,k}\)(假定 \(\binom{-1}0=1\)

实现时组合数暴力枚举求值,可交换内部两重循环减少复杂度

时间复杂度 \(O(p^2d^2)\),其中 \(d=8\)

代码

\(\textcolor{purple}\odot\) P5369 [PKUSC2018] 最大前缀和

以下假定最大前缀和在前缀和最大的情况下选择最靠后的一个位置

则一个前缀为最大的,当且仅当该前缀非空,且任意 真后缀 和都 \(\ge 0\),剩余后缀的任意前缀和都 \(<0\)

\(f_i\) 表示选择子集 \(i\) 作为前缀时,其任意后缀和都 \(\ge0\) 的方案数

\(F_i\) 表示选择子集 \(i\) 作为前缀时,其任意 真后缀 和都 \(\ge0\) 的方案数

\(g_i\) 表示选择子集 \(i\) 作为后缀时,其任意前缀和都 \(<0\) 的方案数

显然 \(F_i=f_i+[s_i<0]\sum_{u\in i} f_{u/\{i\}}\)

答案为 \(\sum_{i\ne\emptyset} s_i F_i g_{U/i}\)

考虑求出 \(f,g\)

两者方法相似,以下只考虑 \(f\)

显然 \(f_{\{x\}}=[a_x\ge 0]\)

转移时,每次将数加入到前缀之前,可得 \(f_{i\cup \{x\}} \gets [s_{i\cup \{x\}}\ge 0]f_i\)

总时间复杂度 \(O(n2^n)\)

代码

\(\textcolor{purple}\odot\) CF1758E Tick, Tock

令给定二维数组为 \(a\)

有解当且仅当 \(\forall 1\le i\le n,1\le j\le n,1\le k\le m,1\le l\le m,\{a_{i,k},a_{i,l},a_{j,k},a_{j,l}\}\notni -1(a_{i,k}+a_{j,l}=a_{i,l}+a_{j,k})\)

即存在 \(t_{1\sim m}\)\(\forall 1\le i,1\le j<k\le m,a_{i,j}\ne -1,a_{i,k}\ne -1\),要求 \(t_j-t_k=a_{i,j}-a_{i,k}\),这样一条约束记为 \((j,k,a_{i,j}-a_{i,k})\)

同一行中只需要判断每相邻两个非 \(-1\) 的位置即可

一共 \(O(nm)\) 条限制,可以带权并查集或图上 \(dfs\) 解决

若存在至少一条不合法,则方案数为 \(0\)

否则定义存在约束 \((i,j,\ast)\)\(t_i\)\(t_j\) 在同一联通块中,设联通块有 \(x\) 个,设有 \(y\) 行全为 \(-1\),则 \(x-1\) 组联通块之间偏移量任意,\(y\) 行每行的偏移量任意,答案为 \(h^{x+y-1}\)

时间复杂度 \(O(nm\alpha(m))\)\(O(nm)\)

代码

\(\textcolor{purple}\odot\) CF1783F Double Sort II

\(G_a\) 中每个 \(i\)\(a_i\) 连有向边,图 \(G_b\)\(i\)\(b_i\) 连边,则每个点入度出度都是 \(1\)

若要操作 \(i\),设图 \(a\)\(x_a\) 连向 \(i\)\(i\) 连向 \(y_a\),一次操作相当于 \(i\) 的出边变为自环,然后令 \(x_a\) 的出边连向 \(y_a\)\(G_b\) 中同理

最后要使所有边都是自环

先只考虑数列 \(a\)

对于 \(G_a\) 的一个环,还剩下一个点没有被操作时,其出边已经指向自己,不需要再次操作

因此每个环上有一个点不需要操作,总次数为 \(n\) 减去环数

然后考虑两个环

此时若 \(G_a\)\(G_b\) 中,点 \(u\) 都是其所在环中最后一个点,\(u\) 才能不被操作

因此建立二分图,每个左部点对应 \(G_a\) 中一个环,每个右部点对应 \(G_b\) 中一个环,每个点对应一条边,左右分别连向其所在环对应点,然后求最大匹配,非匹配边对应点为需要操作的点(显然他们之间顺序不重要)

若使用网络流,时间复杂度为 \(O(n\sqrt n)\),若使用匈牙利算法,时间复杂度 \(O(n^2)\)

代码

\(\textcolor{purple}\odot\) CF1725L Lemper Cooking Competition

\(s\)\(a\) 的前缀和数组,则对 \(a_i\) 的一次操作相当于交换 \(s_{i-1}\)\(s_i\),最终要求 \(s_{1\sim n}\) 有序

因此答案为 \(s_1\sim s_{n-1}\) 的逆序对数

若排序后 \(s_1<0\)\(s_n<s_{n-1}\) 则无解

时间复杂度 \(O(n\log n)\)

代码

\(\textcolor{purple}\odot\) CF1237E Balanced Binary Search Trees

\(BST\) 的性质可得根的奇偶性和节点数的奇偶性相同,因此右子树大小为偶数

非空满二叉树节点数都是奇数,因此节点数 \(>1\) 的满二叉树一定不合法(因为右子树不满足要求)

对于合法的树,显然左右儿子都是 \(BST\),且所有点到根的距离之和最小,且奇偶性满足条件,即合法树的左右儿子(如果有)也是合法树

一棵合法树一定为满二叉树最后一层删去若干节点,否则将最后一层补到前面所有点到根的距离之和一定更小

因此 \(i\) 层的合法树的两个儿子要么为 \(i-1\) 层的合法树,要么为 \(1\) 个节点的树(只有 \(i=3\) 时该可能才有效)

\(f_i\) 表示 \(i\) 层的合法树中最少的节点数

则当节点数为 \(f_i\)\(f_i+1\) 时答案为 \(1\),否则为 \(0\)

证明:

  • 考虑归纳
  • \(i\le 3\) 时,分类讨论可得合法
  • \(i>3\) 时,假设对于 \(i-1\) 合法
  • 假设左儿子大小为 \(L\),右儿子大小为 \(R\),节点数 \(n=L+R+1\)
  • \(L\)\(R\) 都为 \(f_{i-1}\)\(f_{i-1}+1\)
  • 其中 \(R\) 为两者中偶数的一个,即 \(R=f_{i-1}+(f_{i-1}\bmod 2)\)
  • \(L\)\(f_{i-1}\) 时当前树节点一定最少,因此 \(f_i=f_{i-1}+f_{i-1}+(f_{i-1}\bmod 2)+1=2f_{i-1}+(f_{i-1}\bmod 2)+1\)
  • \(L\)\(f_{i-1}+1\) 时,节点数为 \(f_i+1\)
  • 即命题对于 \(i-1\) 合法时,对于 \(i\) 也合法

因此根据递推式求出 \(f\) 的同时判断即可

时间复杂度 \(O(\log n)\)

代码

参考

posted @ 2025-02-01 12:51  Hstry  阅读(8)  评论(0)    收藏  举报