做题记录 25.2.2
\(\textcolor{purple}\odot\) [ABC213G] Connectivity 2
以下用 \(S\) 表示 \(U=\{1,2,\cdots,n\}\) 的子集,\(E\) 表示边集
对于每个 \(k\),考虑钦定 \(1\) 和 \(k\) 所在联通块(显然两者属于同一联通块)中所有点
令 \(g_S\) 表示在点集 \(S\) 的导出子图中选择若干条边的方案数,令 \(f_S\) 表示在此基础上点集 \(S\) 内联通的方案数
则对于一个 \(2\le k\le n\),其与 \(1\) 联通的方案数为
显然
容易 \(O(n^22^n)\) 求出
对于 \(f_S\),考虑从 \(g_S\) 中去掉 \(S\) 不联通的情况,枚举 \(S\) 中编号最大的点 \(v\) 所在联通块,可得
时间复杂度 \(O(3^n)\)
总时间复杂度 \(O(3^n+n^22^n)\)
\(\textcolor{purple}\odot\) [ABC265F] Manhattan Cafe
暴力 \(dp\) 为令 \(f_{i,x,y}\) 表示当前处理到第 \(i\) 维,前 \(i\) 维中与 \(p\) 距离为 \(x\),与 \(q\) 距离为 \(y\) 的方案数
则初始为 \(f_{0,0,0}=1\),转移为
时间复杂度为 \(O(nd^3)\),考虑优化求和的部分
将绝对值拆开,则转移为三个对角线求和的形式,可通过预处理单次 \(O(1)\) 查询
总时间复杂度 \(O(nd^2)\)
\(\textcolor{purple}\odot\) [ABC273G] Row Column Sums 2
令 \(r\) 中有 \(x\) 个 \(1\),\(y\) 个 \(2\),\(c\) 中有 \(z\) 个 \(1\),\(w\) 个 \(2\)
先将数量为 \(2\) 的行填好,然后同一计算数量为 \(1\) 的行的分配方式
令 \(f_{i,j,k,l}\) 表示还有 \(i\) 个数量为 \(1\) 的行,\(j\) 个数量为 \(2\) 的行,\(k\) 个数量为 \(1\) 的列,\(l\) 个数量为 \(2\) 的列的情况下,矩阵的方案数
若将最后一个数量为 \(2\) 的行拆到两个数量为 \(1\) 的列中,转移为 \(f_{i,j,k,l}\gets f_{i,j-1,k-2,l}\times \binom k2\)
若拆到一个数量为 \(1\) 的列,一个数量为 \(2\) 的列,转移为 \(f_{i,j,k,l}\gets f_{i,j-1,k-1,l-1}\times k\times l\)
若拆到两个数量为 \(2\) 的列,转移为 \(f_{i,j,k,l}\gets f_{i,j-1,k,l-2}\times \binom l2\)
若组成一个数量为 \(2\) 的列,转移为 \(f_{i,j,k,l}\gets f_{i,j-1,k,l-1}\times l\)
边界为 \(f_{i,0,i-2l,l}=\frac{i!}{2^l}\)
答案为 \(f_{x,y,z,w}\)
显然若 \(i+2j\ne k+2l\) 答案一定为 \(0\),因此可以去掉最后一维
第一维没有变化,同样省略
时间复杂度 \(O(n^2)\)
\(\textcolor{purple}\odot\) [ABC313Ex] Group Photo
套路地,考虑按值大小顺序填入,此处尝试从大到小填入,现将 \(a_{1\sim n}\) 和 \(b_{1\sim n+1}\) 从大到小排序,用 \(a^\ast\) 和 \(b^\ast\) 表示排序后的数组
填到一定时刻,已经填完的 \(a\) 形成若干连续子段
对于一个子段 \([l,r]\),强制要求此时 \(b\) 中的 \((l,r]\) 已经填上
令 \(f_{i,j}\) 表示已经选择了 \(a\) 中前 \(i\) 大的数(即 \(a^\ast_{1\sim i-2}\) 和 \(a_0,a_{n+1}\),假定 \(a_0\) 和 \(a_{n+1}\) 都为 \(\infty\)),这些数形成 \(j\) 个连续段(只考虑连续段之间的 相对位置),且对应 \(b\) 中位置也填好,该情况下的方案数
初始只填了 \(a_1\) 和 \(a_{n+1}\),两者显然不相邻,因此边界条件为 \(f_{2,2}=1\)
最终 \(a_{0\sim n+1}\) 和 \(b_{1\sim n+1}\) 都填上,只有一个连续段,因此最终答案为 \(f_{n+2,1}\)
对于 \(f_{i-1,j}\),考虑 \(a\) 中第 \(i\) 大(即 \(a^\ast_{i-2}\))填的方式
一种可能是新建连续段,其位置可以在第 \(1\sim i-1\) 大构成的 \(j\) 个连续段的任意两个之间(因为最左和最右已经强制定好,因此之后的只能在中间),一共 \(j-1\) 种选择,转移为 \((j-1)\times f_{i-1,j}\to f_{i,j+1}\)
第二种可能是接到某一连续段的左端或右端,其位置一共 \(2j-2\) 个选择,因此 \((2j-2)\times f_{i-1,j}\to f_{i,j}\)
但根据限制,此时需要填一个 \(b_i\),一共填了 \(i-j\) 个(每段有且仅有一个没填),贪心地考虑此时对应位置一定会填原 \(b\) 数组中第 \(i-j\) 大的,因此根据题目要求 \(b^\ast_{i-j}\) 必须大于 \(a\) 中两个对应位置的值的较小值,根据填的顺序较小值一定为 \(a^\ast_{i-2}\),因此该转移强制要求 \(a^\ast_{i-2}<b^\ast_{i-j}\)
第三种是将两个连续段拼接,位置有 \(j-1\) 个选择,转移为 \((j-1)\times f_{i-1,j}\to f_{i,j-1}\)
根据限制,此时需要填两个 \(b\),两者都需要大于 \(a^\ast_{i-2}\),而两者中较小的为 \(b^\ast_{i-j+1}\),因此该转移强制要求 \(a^\ast_{i-2}<b^\ast_{i-j+1}\)
时间复杂度 \(O(n^2)\)
\(\textcolor{purple}\odot\) [ABC319F] Fighter Takahashi
显然最优策略是每喝下一瓶药水就尽量打败能到达且能打败的敌人
令 \(f_i\) 表示目前到达了药水点的子集 \(i\),\(i\) 以外部分还没有到达,在此情况下最大的体力值
令 \(rc_{i,j}\) 表示决策 \(f_i\) 中是否能到达 \(j\)
\(f_0\) 和 \(c_{0,\ast}\) 即只从根出发,不经过有药水的节点,所能打败的敌人的总和,可以通过优先队列(其中保存若干二元组 \((u,v)\),表示打败节点 \(v\) 上敌人所需的最小体力,\(u\) 为关键字的小根堆)求出
对于每个 \(f_{i}\;(i\ne\emptyset)\),枚举 \(j\in i\),表示 \(j\) 为子集 \(i\) 中最后一个到达的
转移时同样用优先队列,用 \(rs_{i/\{j\},\ast}\) 判断当前敌人是否已经打败,药水是否已经取走,细节较多
时间复杂度 \(O(2^nm\log m)\)
\(\textcolor{purple}\odot\) [ABC373G] No Cross Matching
点 \(a,b,c,d\),若一组配对方式中 \(ac\) 和 \(bd\) 向匹配,且两者相交,则 \(ac\) 长度加 \(bd\) 长度一定大于 \(ab\) 长度加 \(cd\) 长度(因为保证没有三点共线)
即若选择总长最小的配对,匹配一定不交
因此用费用流或随机调整即可,时间复杂度 \(\Omega(n)\)

浙公网安备 33010602011771号