2022杭电多校部分好题题解(更新至Day 10)
Day 1
-
枚举两个点,计算剩下一个点的选取方法:
- 题解做法:从小到大加入边,相当于要求与其中一个点右边而与另一个没有,直接 \(bitset\) 维护,\(\mathcal O(\frac{Tn^3}{\omega})\) 即可通过。
- 考场做法:注意到与一个点曼哈顿距离 \(\le d\) 的点形成一个正方形。两个正方形的是矩形,于是就变成一个二维偏序,复杂度 \(\mathcal O(Tn^2)\)。
-
题目中的条件意味着不会存在一条边被两个环经过,因此原图是仙人掌。然后直接莫比乌斯反演变为求 \(gcd\) 为 \(x\) 的倍数的路径数,将边权为 \(x\) 的倍数的边建出来 \(dp\) 即可。
-
枚举某一个点是通过哪种方式被覆盖的,再加入任意一个无法通过这种方式被一起覆盖的其他点,即可确定仅有的三个可能的位置,直接判断即可。
-
将每个值为 \(i\) 的数字视为 \(2^{n-i}\),则只要出现 \(2^n\) \(Alice\) 赢,每一步 \(Bob\) 是选一个集合乘 \(2\)。于是每一步总和都不可能增加,初始总和必须要 \(\ge 2^n\),同时如果总和 \(\ge 2^n\) 则 \(Alice\) 每一步一定有方法分为两个总和 \(\ge 2^{n-1}\) 的集合,可以继续递归下去分。因此总和 \(\ge 2^n\) 则 Alice 获胜,否则 Bob 获胜。
Day 2
-
离线询问,倒着扫一遍所有修改,每一个修改 \([l,r]\) 相当于将 \(x>r\) 的询问的 \(x-=r-l+1\)。注意到只需要求所有询问的答案异或和,因此同一位置的相同查询可以地抵消,只需用 \(bitset\) 维护当前哪些地方有询问,再倒着扫一遍所有修改即可做到 \(\mathcal O(\frac{n^2}{\omega})\)。赛时暴力艹过去了。
-
记 \(dp_i\) 表示从 \(0\) 级升级到 \(i\) 级的期望次数。设当前买了一本书 \((a,b)\),记 \(x=\frac{a}{A},y=\frac{b}{B}\)。
有 \(dp_{i+1}=\min(dp_{i+1},dp_i+(1-x)(1-y)(dp_{i+1}-dp_i)+(1-x)ydp_{i+1})+1\)。
可以发现选择买这本书当且仅当 \(dp_i+(1-x)(1-y)(dp_{i+1}-dp_i)+(1-x)ydp_{i+1}\le dp_{i+1}\)。
展开式子得到 \(dp_{i+1}\ge dp_i\frac{x+y-xy}{x}\)。
虽然不知道 \(dp_{i+1}\) 的具体值。但将所有可能的书按照 \(\frac{x+y-xy}{x}\) 排序,我们一定会选择一个前缀,枚举前缀的长度计算贡献,取最优解即可得到 \(dp_{i+1}\)。复杂度 \(\mathcal O(kAB)\)。
-
将相邻的相同字符合并到一起,使用栈维护当前的字符串。若在加入 \(k\) 个 \(c\) 后目标串第一次作为当前串的子串出现,则一定满足目标串的最后一段相同字母为 \(len\) 个 \(c\),并且去掉最后 \(\max(len,k)\) 个字符后的部分是加入前串的后缀,使用哈希判断即可。这里的哈希可以将连续相同字母压缩到一起,即可快速判断。
-
题意即为选择最小的边集使得,每个最大权值生成树前经过至少一个被选择的边。
如果从图中删去某条边会导致最大生成树权值增加,那么选择这条边就行了。
否则,最终被选择的一定是一些权值相同的边,枚举权值 \(w\),用 \(kruskal\) 将 \(\ge w\) 的边全部加入,此时每个连通块内权值 \(=w\) 的边构成相互竞争关系,相当于要选择它们中最少的边使得图不连通,跑无向图最小割即可。由于每一组的边数不超过 \(100\),所以可以通过。
Day 3
-
记 \(sum_s\) 为点集 \(s\) 的糖果数之和,一个朴素的做法是记 \(f_{i,S}\) 表示将 \(S\) 集合的箱子分给 \(i\) 个孩子的最小代价。则有转移:
\[f_{i,S}=\min_{T\subset S}\{f_{i-1,T}+(sum_S-sum_T)^2\}=\min_{T\subset S}\{f_{i-1,T}+sum_T^2-2sum_Ssum_T\}+sum_S^2 \]直接转移是 \(\mathcal O(3^nm)\) 的,考虑优化。
这是一个经典的斜率优化的形式,将每个 \(T\) 看作直线 \(-2sum_Tx+sum_T^2\),如果能求出 \(S\) 子集对应的凸壳,就可以快速求解 \(f_{i,S}\)。求凸壳可以类似于高维前缀和:初始对每个状态 \(S\) ,凸壳中只包含 \(T=S\),然后从小到大遍历每一位,遍历到第 \(x\) 位时取出所有第 \(x\) 位为 \(1\) 的 \(S\),将 \(S\) 与 \(S \oplus (1<<x)\) 的凸壳归并起来即可,归并的复杂度为二者凸壳大小之和。因此总代价不超过每个最终凸壳大小的两倍,也就是 \(\mathcal O(3^n)\)。
这个复杂度依然无法接受,考虑折半优化,枚举 \(A\) 作为 \(T\) 的前半部分,以及 \(A\) 的超集 \(A'\) 作为 \(S\) 的前半部分,再枚举 \(S\) 的后半部分 \(B'\),寻找找一个 \(B'\) 的子集 \(B\) 作为 \(T\) 的后半部分,这里再使用之前的方法。对每个 \(A\) 花费 $\mathcal O(3^{\frac{n}{2}}) $ 的代价预处理所有 \(B'\) 子集的凸壳,再按照 \(sum_{A'}\) 递增的顺序枚举 \(A'\) 与 \(B'\),即可保证对于同一个 \(B’\), \(sum_S\) 递增,在凸壳上询问 \(x=sum_S\) 的点的纵坐标即可做到均摊 \(\mathcal O(1)\)。
于是总复杂度为 \(\mathcal O(2^{\frac{n}{2}}3^{\frac{n}{2}})=\mathcal O(6^{\frac n2})\)。
-
核心性质:对于一个点集,仅保留其凸包上的点,最小圆覆盖不会改变。
由于数据随机,一个点集的凸包上点数期望时 \(\mathcal O(\log n)\) 的,于是使用线段树维护区间凸包,最后对 \(\mathcal O(\log n)\) 个顶点运行最小圆覆盖算法即可。
-
核心性质:每个障碍的行数均为 \(w\),列数均为 \(h\)。
按 \(w\) 行一块,将矩阵分成 \(\lceil\frac{m}{w}\rceil\) 块,那么每个障碍要么完全属于某一块,要么经过相邻两块。于是每个矩形障碍对某个块的影响只能是:块的第 \(x\sim x+h-1\) 列的前若干行/后若干块是障碍。
对每一块找出经过这一块的矩形障碍,假设共有 \(k\) 个。以障碍的左右边界为分界点将这个块分为 \(\mathcal O(k)\) 个区域,每个区域内只有一个连续的行区间可以行走,由于每个障碍的宽度是相同的,可以使用单调队列 \(\mathcal O(k)\) 求出每个区域的可走矩形范围,就将这个块划分为了 \(\mathcal O(k)\) 个矩形。
如果相邻两个块都没有障碍,可以把它们直接合并起来,这样就将整张图划分为了 \(\mathcal O(n)\) 个矩形区域,在相连个矩形区域连边,在形成的图上求解即可:同一块内相邻的区域连边,相邻块之间相邻的区域需要连边,这可以通过双指针来找出上块的每个区域相邻的下块区域,总边数依然是 \(\mathcal O(n)\) 的。
由于需要排序,因此总复杂度是 \(\mathcal O(n\log n)\) 的。
-
记 \(f_{i,j}\) 表示从 \(i\) 出发能否只经过第 \(j\) 个询问中保留的边走到 \(v_j\)。离线询问,使用 \(bitset\) 存储,对每条边 \((u,v)\) 有转移 \(f_u|=f_v\&S\),其中 \(S\) 是保留了边 \((u,v)\) 的询问集合。
考虑如何求出所有的 \(S\)。将每个询问拆成两个事件:在 \(l\) 处加入,在 \(r+1\) 处删除,然后按时间顺序扫一遍所有事件,维护当前的 \(bitset\),即可求出所有的 \(S\)。
但这样一共需要 \(m+n\) 个 \(bitset\) 空间开不下。考虑每次处理 \(B\) 个事件,每次扫一遍这 \(B\) 个事件,求出每条边关于这 \(B\) 个事件的 \(bitset\) \(S\),再进行一次转移即可。最终复杂度 \(\mathcal O(\frac{nq}{\omega})+\mathcal O(m\frac{q}{B})\)。因此只要空间开得下,\(B\) 尽量开大即可。
Day 4
-
可以发现每个士兵能造成的伤害,就是其每一种攻击方式对应的点构成的凸包内部的所有点。于是原问题等价于求这些凸包的闵可夫斯基和中是否包含给定点。
考虑如何支持修改,对每个士兵维护动态凸包,求出添加点后会删去哪些边增加哪些边。为了实现闵可夫斯基和,用平衡树按极角大小关系维护所有凸包的边,在平衡树上修改即可。查询在平衡树上二分查出 \(x\) 坐标所对应的边即可。
-
\(d\) 的正负会影响我们的方案。注意到先选正数,再选负数一定不劣,因此可以将正负分开考虑。而考虑负数时,可以先将上所有的 \(d\) 再倒着考虑变成 \(-d\),就变成正数的情况了。
现在考虑全为正数的情况,注意到如果某个关卡的需求我们没有满足,把它提前到一开始就挑战,获得它的分数一定不劣。而剩余的关卡一定会按照 \(s\) 从小到大挑战。
将所有关卡按 \(s\) 从小到大排序,从后往前考虑。考虑到关卡 \(i\) 时,实际挑战过程中挑战到 \(i\) 时的分数应该是 \(i\) 前所有关卡的 \(d\) 之和 \(pre\),初始分数 \(s_0\),以及 \(i\) 后被提前的关卡分数之和 \(c\)。如果 \(pre+s_0+c\ge s_i\),就可以保留 \(i\),否则必须有一个关卡无法保留,贪心的选择 \([i,n]\) 中 \(d\) 最大的数提前即可,可以证明提前这个数后一定可以满足其他所有数,于是使用一个 \(set\) 维护即可。
证明:实际上只用考虑数 \(i\) 能否被满足。假设我们提前的是 \(j>i\),注意到 \(pre+d_i+s_0+c\ge s_{i+1}\ge s_i\),而 \(d_j\ge d_i\),因此提前 \(j\) 后 \(pre+d_j+s_0+c\) 一定 \(\ge s_i\)。
-
由于同一个交点只算一次,因此 \(sg\) 函数等方法较为困难。但注意到这个条件同样意味着操作空间是非常大的,最后一个操作的人会有很大优势。这启发我们考虑 \(m\) 较大的情况。
-
\(m=2n\):游戏已经结束,数交点即可。
-
\(m=2n-1\):
考虑 \(Bob\) 通过一次操作能增加交点个数的奇偶性,可以发现,如果存在以下两种情况中的一种:
- 斜率为某个值的直线有奇数条。
- 某个交点被奇数条直线经过。
则 \(Bob\) 可以同时增加奇数/偶数个交点:第一种情况选择与这些直线平行或者与所有直线相交;第二种情况选择只过这个交点或者不过任何交点即可。
如果这两种情况都不存在,那么无论 \(Bob\) 如何操作都只能增加奇数个交点,直接判断当前交点数的奇偶性即可。
-
\(m=2n-2\):
\(Alice\) 有一次操作机会,显然她会避免上面两种情况的出现。如果奇数斜率不止一个,那么 \(Alice\) 必败,否则 \(Alice\) 需要与唯一的奇数斜率平行(如果存在)并经过所有的奇数交点,如果这样的线有无限个/ \(0\) 个则可以直接判断,否则判断这条线是否出现过即可。
-
\(m=2n-3\):
此时如果存在一个经过偶数次的交点:则 \(Bob\) 如果已经有奇数的斜率组了,直接画个新斜率,否则就用一个偶数组的斜率,再经过这个交点,这样产生了一个奇数斜率以及奇数交点,同时满足它们的线就是当前这条,\(Alice\) 不能再选了,\(Bob\) 必胜。
如果存在交点且都经过了奇数次:如果已经存在奇数斜率组了,\(Bob\) 直接画个新斜率即可。否则至少有两个交点,用一个新斜率经过其中一个即可。
于是 \(Alice\) 获胜的唯一机会时所有直线平行,此时 \(Bob\) 无论怎么操作,\(Alice\) 只要画一条与它平行的线即可。
-
\(m=2n-4\):
\(Alice\) 多了一次操作机会,需要操作后所有直线平行,因此只需要判断是否所有直线平行即可。
-
\(m=2n-5\):
这里 \(Bob\) 随便画一条线产生交点就必胜了。因此 \(m\le 2n-5\) 的所有情况 \(Bob\) 都必胜。
-
Day 5
巨大多码农题的一场。
-
考场做法:将最终串中连续 \(4\) 个字母分为一组,记 \(dp_{i,w,j,k}\) 表示当前考虑了原串的前 \(i\) 个字符,下一个要填写的是当前组的第 \(w\) 个元素,当前组的第一、二各元素分别为 \(j\) 和 \(k\)。注意到连续删去 \(4\) 个字母一定不优,因此状态数实际上并不多。再对每个 \(w\) 分开处理,最终可以优化到 \((w,i,j)\) 共约 \(30\) 个状态,可以通过。
题解做法:考虑将原串分为若干个区间,钦定每个区间最终变成一组。那么区间长度如果 \(\ge 8\) ,则变成一组一定不优,据此可以写出转移 \(dp_i=\min\{\min_{j=1}^{7}\{dp_{i-j}+w(j+1,i)\},dp_{i-1}+1\}\),对于转移代价 \(w\) 的计算,将区间 \([j+1,i]\) 中相同的字符分到同一组,则该区间的答案只与分组情况有关,因此状态数是贝尔数级别的,可以接受,直接暴力对每种不同的状态预处理出代价,这可以通过枚举最终的形态 \(abba\) 中 \(a,b\) 分别是哪一组来完成。
-
静态问题是一个 \(SAM\) 模板题,在 \(fail\) 树上查询子树和即可。对于动态问题:
- 可以动态维护 \(SAM\),用 \(LCT\) 维护 \(fail\) 树,那么删除操作只需要单点修改节点 \([l,n]\) 的权值,查询用 \(LCT\) 维护 \(fail\) 树子树即可。
- 可以根号重构,每个 \(\sqrt{n}\) 次修改重构一次 \(SAM\),散块的贡献可以暴力。
-
所有未确定的位置将序列分为 \(\mathcal O(m)\) 个区间,在每个区间中,对每个初始四面题的状态 \(S\) 预处理 \(S\) 经过这段区间的操作后的结束状态以及这段区间的贡献。然后就可以 \(\mathcal O(4^m)\) 爆搜未确定位置的操作,再使用 meet in middle 即可优化到 \(\mathcal O(2^m)\) 。
-
如果你是群论大师:本题的操作相当于是六面体旋转群,模拟旋转状态即可。
否则:写暴力进行打表,可以发现长度 \(=5\) 的串都可以变成长度 \(\le 4\) 的串,于是打表出长度 \(\le 5\) 的串之间的等架关系,然后不断取出询问串的前 \(5\) 位,转化为长度 \(\le 4\) 的串直到总长度 \(\le 4\) 即可。
Day 6
-
首先对于某一个数的操作,可以调整为先除而乘,而答案不劣。
于是可以据此 \(dp\),记 \(f_{i,j,k}\) 表示考虑了前 \(i\) 个数,第 \(i\) 个数除了 \(j\) 次乘了 \(k\) 次的最小操作次数,转移可以前缀和优化到 \(\mathcal O(1)\),第二维是 \(\mathcal O(\log n)\) 的,但第二维可能比较大。
但注意到如果从某一个 \(i\) 开始,\(a_i>10^5\) 了,那么之后的 \(a\) 一定都至少乘了一次,确定 \(i\) 之后的 \(a\) 除的次数后,最优解一定是先全部乘到 \([2^{17},2^{18})\) 区间,然后从小到大考虑每个 \(j>i\),若 \(a_{j-1}>a_j\),则将 \(j\) 以后的 \(a\) 全部乘上 \(2\)。据此,可以将预处理 \(g_{i,j}\) 表示第 \(i\) 个数除了 \(j\) 次并且超过 \(10^5\) 时,\([i,n]\) 的数至少操作了多次。然后就可以枚举分界点,对两边分别 \(dp\),做到 \(\mathcal O(n\log^2m)\)。
-
B - Hack of Multiply 2 Divide 2
大致思路:记 \(m\) 为值域,\(c_i\) 表示最终 \(a_i\) 的最高位。再记 \(d_i\) 表示 \(c=i\) 的位置数量。注意到将最大 \(c_i\) 降低的方法为:对某个 \(2^p>m\) 的 \(p\),将 \(c_i>p\) 的位置全部改为花费 \(\log_2 m+p\) 的代价直接变成与 \(c_i\le p\) 的数中最大的 \(a_i\)。因此需要保证\(\sum_{i>p}c_ii>(\log_2m+p)\sum_i(i>p)c_i\)。于是可以据此贪心的从大到小考虑每个 \(p\),增加 \(c_p\) 使得该柿子满足。但乱取数的话更改的代价并不是 \(\log_2 m\) 的,考虑全部取用 \(512\) 的倍数,将更改的代价变为 \(8\),就可以做到 \(>128\) 了。
-
先将题目中标号 \(reverse\) 一下。
记 \(dp_{i,j}\) 表示从 \(n-1\) 经过恰好 \(j\) 条边走到 \(i\) 的方案数。
有转移:
\[dp_{i+1,j}=(j+1)dp_{i,j+1}+\sum_{k=0}^{j-1}dp_{i,k}a_{j-k} \]记 \(f_i,A\) 为 \(dp_i,a\) 的生成函数,则有:
\[f_{i+1}(x)=f_{i}'(x)+f_i(x)A(x) \]神秘转化:记 \(g(x)=e^{\int A(x)\mathrm dx}\),则有 \(g(x)A(x)=g'(x)\)。
于是记 \(p_i(x)=f_i(x)g(x)\),则有:
\[\begin{aligned} p_{i+1}(x)&=(f'_i(x)+f_i(x)A(x))g(x)\\ &=f'_i(x)g(x)+g'(x)f_i(x)\\ &=p_i'(x) \end{aligned} \]于是只需要求一个 \(k\) 阶导即可得到 \(p_k(x)\),再乘上 \(g^{-1}(x)\) 即可得到答案。
-
D - Yet Another Easy Permutation Count Problem
记 \(x_i=\sum_{j=1}^{i-1}[p_j>p_i],f_i=[x_i>0]\),那么每个排列的贡献就是每次冒泡排序后 \(f\) 序列中 \(01\) 的数量,也就是 \(f\) 中 \(1\) 连续段的个数。而每轮冒泡排序会将 \(x\) 中 \(>0\) 的元素减 \(1\) ,再将所以 \(>0\) 的 \(x\) 前移,因此最终的贡献就是 \(\sum_i\max(x_i-x_{i-1},0)\)。
回到原序列就相当于对 \(\forall i\le j\),若 \(p_{j+1}<p_{i}\le p_{j}\) 则会产生 \(1\) 的贡献。于是可以得到一个好算的 \(\mathcal O(n^2)\) 柿子,使用树状数组优化即可。
Day 7
-
考虑枚举正方形的边长,计算这样的正方形会在多少种方案中出现,不同的边长只有 \(\min(n,m)\le \mathcal O(\sqrt{nm})\) 个,不妨假设 \(n\le m\)。
对于每一个边长,首先 \(4^4\) 暴力枚举四个角上的点的状态,在剩余的点中,分别考虑横边与竖边上点,只有十字形 \((a=15)\) 的点可以能同时在两条边中出现,可以暴枚有多少个十字形点在竖边中出现,这部分枚举复杂度也是 \(\mathcal O(\sqrt{nm})\) 的,之后其他形态的点,至多只能在横边和竖边中的一个出现,对横边竖边独立考虑,预处理出有多少个点可以放在横边/竖边上,就可以一个组合数 \(\mathcal O(1)\) 完成了。
最终复杂度 \(\mathcal O(nm)\),还需要乘上一个枚举的常数 \(256\)。
-
可以想到暴力 \(dp\):记 \(f_{u,i}\) 表示在 \(u\) 的子树选择一个包含 \(u\) 的连通块,满足连通块内部符合条件,且连通块内所有点到 \(u\) 的距离不超过 \(i\) 的最大权值和,\(md_u\) 为 \(u\) 子树内点到 \(u\) 距离的最大值。
自然想到长链剖分优化,考虑如何将轻儿子的答案合并上来:
对于点 \(u\) 及其轻儿子 \(v\),合并时转移:
\[\forall i+j\le k,w\ge \max(i,j)\ \ \ f_{v,i}+f_{u,j}\to f_{u,w} \]根据 \(\max\) 的取值分别讨论:
- \(i>j\):此时可以枚举 \(i\),用 \(f_{v,i}+f_{u,\min(i,k-i})\) 更新,是一个后缀取 \(\min\),可以使用线段树/单调栈维护。
- \(i\le j\):此时同样枚举 \(i\),若 \(f_{v,i}<0\) 直接忽略,否则相当于对 \(j\in[i,k-i]\) 进行一个区间加 \(f_{v,i}\),最后再加一个后缀 \(\min\)。可以使用线段树维护,同时注意到没有加到的地方只有 \([0,md_v]\) 和 \([k-md_v,k]\),可以对这些位置打标记,再打上全局加 \(tag\),转移完后再 \(\mathcal O(md_v)\) 扫一遍。
最终复杂度是 \(\mathcal O(n)\)。
tip:长链剖分+线段树的维护方法:对每条长链建一棵线段树,对 \(u\) 的修改端点加上 \(dep_u-dep_{top_u}\) 即可。
Day 9
-
可以发现答案就是区间内的前缀最大值数量:不妨设区间为 \(a_1s_1a_2s_2\dots a_ks_k\),其中 \(a_1,a_2,\dots a_k\) 为前缀最大值,则排序后变为 \(s_1a_1s_2a_2\dots a_ks_k\)。
离线询问,从右至左扫描左端点,使用单调栈维护以当前左端点开头的后缀的所有前缀最大值即可。
-
记 \(f_n\) 表示 \(n\) 个随从中有一个亡语时的答案。注意到随机执行 \(k\) 次亡语后每个亡语是独立的,因此答案期望就是一次亡语 \(\times k\) ,因此有:
\[f_n=\frac{1}{n}(kf_{n-1}+1)+\frac{n-1}{n}f_{n-1}=(1+\frac{k-1}{n})f_{n-1}+\frac{1}{n}\\ f_{n}+\frac{1}{k-1}=\frac{n+k-1}{n}(f_{n-1}+\frac{1}{k-1}) \]于是可以得到:
\[f_n=\frac{1}{k-1}\prod_{i=1}^{n}\frac{i+k-1}{i}-\frac{1}{k-1}\\ =\frac{(n+k-1)!}{(k-1)(k-1)!n!}-\frac{1}{k-1}\\ \]可以 \(\mathcal O(m)\) 递推出所有 \(k\) 的答案。
-
K - The Alchemist of the Discrete Mathematics
等。
Day 10
-
有关交换排列的构造题,判定无解大概率是判逆序对数奇偶性,当然仅仅会判定也没什么用。
本题也不例外,可以发现 \(rotate\) 操作也不会改变逆序对数奇偶性。对于逆序对数为偶数的排列,可以从下往上从左至右依次复原,直接找到当且位置的数字将其先向右再向下最后向左旋转过来,对每行最右侧一个特殊处理。这样第 \(3\sim n\) 行都可以成功复原,前两行由于满足逆序对奇偶性,一定可以只旋转这个三角形完成复原,枚举 \(3\) 种情况即可。
-
矩阵树定理,则原问题相当于求基尔霍夫矩阵去掉第 \(i\) 行第 \(i\) 列后的行列式。
缺一分治,先不管列,维护其他 \(n-1\) 行内部消元的结果,最后去掉第 \(i\) 列在进行高斯消元,此时用一行消另一行只会进行 \(\mathcal O(n)\) 次,因此复杂度是正确的。
如果要对所有 \(i,j\) 求去掉第 \(i\) 行第 \(j\) 列后的行列式,上面的做法就寄了。
注意到此时相当于要求解矩阵 \(A\) 的伴随矩阵 \(A^*\)。首先 \(A\) 的秩不超过 \(n-1\),且如果 \(<n-1\) 则所有代数余子式均为 \(0\),因此仅考虑 \(r(A)=n-1\) 的情况。
由于 \(A^*A=|A|I=0\),因此 \(r(A^*)+r(A)\le n\),故 \(r(A^*)=1\)。
因此 \(A^*\) 的各项系数之间满足以下关系:
由于 \(A\) 的秩为 \(n-1\),因此存在不全为 \(0\) 的实数 \(x_1,x_2,\dots,x_n\) 使得 \(\sum_i x_i\vec{a_i}=0\),其中 \(a_i\) 为 \(A\) 的第 \(i\) 行的行向量;同理可以得出关于列向量的 \(y_i\),则有:
\[A^*_{a,b}=A^*_{i,j}\frac{x_ay_b}{x_iy_j} \]因此找到一对不为 \(0\) 的 \((x_i,y_j)\) 计算 \(A^*_{i,j}\) 后就可以得出所有代数余子式了。
-
判断点是否在多边形内:由该点出发任意引一条射线,该点在多边形内当且仅当射线与多边形有奇数个交点。
对于本题同样考虑分析原点出发的射线:对于一个包含原点的三角形,其任意一个顶点与原点的连线一定将剩余两个顶点划分到两侧(穿过奇数条边);对于一个不包含圆点的三角形,则恰有两个顶点满足与原点的连线将剩余两个顶点划分到同侧。
因此连接每个点与原点,记 \(l_i,r_I\) 为点 \(i\) 与原点连线两侧的点数,则包含原点三角形数就是 \(\binom n3-\dfrac{\sum_{i=1}^{n}\binom{l_i}{2}+\binom{r_i}{2}}{2}\),因此只需要对每个点最大化 \(l_i\) 与 \(r_i\) 的差,最优情况为取 \(l_i=\lfloor \frac{n-1}{2}\rfloor,r_i=\lceil \frac{n-1}{2}\rceil\)。
可以发现这个上界可以达到,取所有 \(x=\rm 1,y=\rm 1\) 的点,关于原点对称的点只取一个即可。

浙公网安备 33010602011771号