bzoj一句话题解
bzoj一句话题解
by wawawa8
1000 a+b
1001 平面图最小割->对偶图最短路
1002 就是生成树个数,通过基尔霍夫矩阵可以得出递推式 \(f_i=3f_{i-1}-f_{i-2}+2\),然后高精度算一下
1003 令 \(c[i][j]\) 表示从第 \(i\) 天到第 \(j\) 天从 \(1\) 到 \(n\) 不转换路线的最短距离,然后 \(f[i]\) 表示前 \(i\) 天所需要的最小成本,枚举上一次修改路线的位置 \(j\),即 \(f_i=f_j+c[j+1][i]*(i-j)+K\)
1004 根据 \(\text{Burnside}\)引理 我们要求的就是所有置换的不变元素的平均数,注意我们需要添加一个置换 \(1\ 2 \ 3 \dots n\) 才能成为一个置换群,然后每个置换的不变元素数可以先求出循环节,每个循环必须染同一种颜色,然后用一个三维或四维 \(\text{dp}\) 可以求得
1005 由 \(\text{prufer}\)序列 我们知道,一个合法的方案,对应着一个 \(\text{prufer}\)序列 ,其中度数为 \(d\) 的点在序列中出现 \(d-1\) 次,那么已经确定的 \(d\) 出现次数确定,剩下的空位可以随便填入,判断是否可行($\sum ({d_i-1}) \le n-2 $),若可行,答案就为 ![img](file:///E:\信息\博客\clip_image002.png)
其中 \(k\) 代表 \(d_i\) 不为 \(-1\) 的 \(i\) 的个数
1006 参见cdq的论文 《弦图与区间图》,我们知道答案就是最大团的点数,并且通过按照完美消除序列的反向染色就是最优解,可以用最大势算法求出完美消除序列
1007 单调栈维护上凸壳
1008 用总数 \(m^n\) 减去不符合答案的方案数 \(m*(m-1)^n\)
1009 直接数位\(\text{dp}\),先处理不喜欢的串得到转移方程,我们可以得到复杂度 \(O(400n)\) 的做法,然后用矩阵快速幂优化即可
1010 斜率优化\(\text{dp}\),推荐看 \(\text{hzwer}\)的博客
1011 估算,发现后面的行星可以受到作用的行星比较多,而且比较均匀,所以可以算一个前缀平均值,比较后面的时候直接用它去估算
1012 裸的线段树
1013 可以列出一堆方程,然后直接消元即可
1014 不会
1015 倒着做,就可以并查集维护了
1016 性质:所有最小生成树的边权集合都一样,因为相同权值的边很少,可以对于每一种权值单独考虑,把这些边扣掉之后,有多少种选择当前权值的边的方案使得剩下的玩意联通
1017 树形dp,百度一下比较好
1018 恶心至极的线段树,百度一下比较好,大概得维护10个量。。。
1019 发现任何移动方案都得是把前面n-1个移出去,最后一个动一下,前面的n-1个再移上来,所以 \(f[i][j][k]\) 表示 \(k\) 个盘子,从 \(i\) 移动到 \(j\) 的步数,转移就是枚举前 \(k-1\) 个盘子的移动情况,一共两种,取较小值
1020 不会
1021 发现可以得出最后每个人的钱数,暴力的做法是枚举最后前两个人每种钱的张数,因为只要知道两个人就可以得出第三个人,然后就可以 \(\text{dp}\) 了,可以令 \(f[i][a][b]\) 表示当前考虑到前 \(i\) 种钱,当前第一个人的钱数是 \(a\),第二个人的钱数是 \(b\) 的最少交换钱数,转移就枚举当前这种钱第一个人最后拥有几张,第二个人最后拥有几张,算一下现在每个人的钱数就可以转移了
1022 \(\text{Anti-SG}\) 问题,使用 \(\text{SJ}\) 定理,具体见链接
1023 仙人掌上的 \(\text{dp}\),太神了,建议百度一下
1024 可以直接搜索,我先二分答案,然后搜索的过程中可以剪枝,不过似乎没有直接搜索快
1025 不难发现,排数就是所有循环节的 \(\text{lcm}\),所以就是求 \(lcm\{x_1,x_2, \dots, x_k\}\),其中 \(\sum {x_i} \leq n\),那么我们令 \(f[i]\) 表示一堆数之和恰好等于 \(i\) 的 \(\text{lcm}\) 种数,事实上 \(\text{lcm}\) 仅仅和所有素数的最高次幂有关,我们从小到大枚举素数以及它的次数,然后更新,\(f[i]+=f[i-j*p]\),这样可以不重不漏地统计所有情况,因为一个 \(\text{lcm}\) 会按照其质因数分解从小到大的顺序被计算到
1026 数位 \(\text{dp}\),同时记录下上一位是多少即可
1027 神题,首先发现第三维是个废物,所以我们只考虑前两维。对于两种合金,他们能生成的合金就是前两维在平面直角坐标系上对应点连接形成的线段,进而想到一堆玩意能形成的合金就是他们的凸包内部所有点,所以变成从 \(n\) 个点里面选择最少的点,使他们构成的凸包能够包含给定的 \(m\) 个点,对于两个点 \(A,B\),如果所有 \(m\) 个点都在向量 \(\vec{AB}\) 左侧,那么令 \(dis[A][B]=1\),否则 \(dis[A][B]=\inf\),跑一遍 \(floyd\),则答案就是 \(\min{dis[i][i]}\),想一想就很对,但是根本想不到 😢
1028 首先枚举加哪一张牌,然后就是判断,首先找到对子,拎出对子之后可以直接扫一遍得出是否符合刻子
1029 贪心,首先想肯定是按结束时间排序,早的先选,晚的后选,但是有一些早的需要花太长时间,所以需要一些微调,我们按照结束时间一个个看,假若当前这个没法修,那么就从前面的已选的里面拎出来花时间最长的一个,如果当前这个花的时间比较短,那么就选择这个,用堆维护即可
1030 \(\text{AC}\) 自动机上 \(\text{dp}\),首先肯定是用总数减去不行的方案数,把不行的串建一个 \(\text{AC}\) 自动机,那么不行的方案数就是停留在某一个节点上的方案数,令 \(f[i][j]\) 表示当前长度为 \(i\),当前停留在 \(j\) 这个点上的方案数,枚举下一个字符,如果转移到的位置上有结束标记,那么就禁止转移,注意结束标记的更新,因为存在一个串的前缀是另一个串,这时候这个前缀也需要打上结束标记,即所有能沿着 \(\text{fail}\) 边跑到结束点的点都要打上结束标记,可以在 \(\text{build}\) 过程中处理出来
1031 复制一遍,后缀排序
1032 并不会完全正解,只会一个能过的假做法,首先缩一下,把相同的一段缩起来,令 \(f[i][j]\) 表示从 \(i\) 这一段开始,一共 \(j\) 段,这么长的串需要几次,两种转移,一种直接枚举断开位置,也就是第一段不和最后一段接触,另一种就是第一段的颜色和最后一段相同,那么从 \(f[i+1][j-2]\) 加上把第一段和最后一段合并之后的串消掉的方案数,边界就是 \(f[i][1]\)
1033 大大大大大大大大模拟
1034 贪心,首先把两队排序,考虑最大得分,如果最强的人比对面最强的人强,那么对掉,如果最弱的人比对面最弱的人强,那么对掉,否则用最弱的碰对面最强的,最小得分就是总得分 \(2n\) 减去对面的最大得分,一样做一遍即可
1035 不会
1036 裸树剖
1037 \(f[i][j][a][b]\) 表示当前坐了 \(i\) 个人,当前有 \(j\) 个男生,男生个数-女生个数的后缀最大值是 \(a\),女生个数-男生个数的后缀最大值是 \(b\) 的方案数,转移就枚举下一个是男是女
1038 好像有 \(O(n \log n)\) 的做法,我想的是首先显然可以枚举每一段然后三分(显然是个凸函数),那么问题就是 \(O(n)\) 求 \(pos\) 这个位置的答案,这个可以对于每一条线段算一下取最大值做出来
1039 首先相邻的两条线段可以由另外一对相邻的两条线段变换得到当且仅当这两段的哈希值相同,哈希值为一个四元组,表示两条线段的三个短点两两的叉乘和一个角度的正负。那么一条折线和另一条相似当且仅当每两个相邻线段的哈希值都相同或者前三个值相同角度相反(因为有翻转操作),那么建出 \(\text{AC}\) 自动机之后统计一下即可,附代码link
1040 基环内向森林,那么对于每一棵基环内向树,我们找到环,然后断掉任意一条边,就成为一棵树,然后强制一个点选另一个点不选做一遍,反过来(这个点不选另一个点必选)再做一遍,取最大值
1041 讲不清楚,结论就是分解质因数,对于每一个 \(4k+1\) 的质因数,答案乘上他的指数的两倍加1,最后再乘4
1042 首先做一遍没有任何限制的背包(怎么跟今年noip d1t2一样),然后对于一个限制,容斥即可(总方案数-第一个选了至少 \(d_1+1\) 个的方案数-第二个……+第一个选了至少 \(d_1+1\) 个且第二个选了至少 \(d_2+1\) 个的方案数+……)
1043 不会
1044 先二分答案求第一问,然后 \(\text{dp}\) 求方案数,需要前缀和优化加滚动数组
1045 设第 \(i\) 个小朋友给第 \(i-1\) 个小朋友 \(x_i\) 块糖,我们可以得到 \(n-1\) 个等式,也就是有一个自由元,要求 \(\sum_{i=1}^n|x_i|\) 最小,设每个小朋友最终的糖果数量为 \(y\),大力推一波之后就是:
\(x_2=x_1-a_1+y,x_3=x_2-a_2+y=x_1-a_1+y-a_2+y=x_1+2y-a_1-a_2,x4=x_1+3y-a_1-a_2-a_3 \dots\)
也就是每个 \(x_i\) 都可以写成 \(x_1-b_i\) 的形式,其中 \(b_i\) 是常数,那么就只要找到 \(b\) 的中位数即可
1046 容易看错题,注意字典序最小并非让你序列的值字典序最小,而是下标字典序最小,也就是最靠前,那么只要算出以某个位置开头的最长上升子序列长度就好了,倒着做一遍就可以算出来这个
1047 枚举所有正方形并统计答案,可以一行一行做,每次列向右移动一个等价于减去一个 \(n \times 1\) 的列再加上一个 \(n \times 1\) 的列,最小值最大值用 \(\text{ST}\) 表,然后单调队列维护一下即可
1048 \(f[a][b][c][d][k]\) 表示 \((a,b)\) 到 \((c,d)\) 这个子矩阵分成 \(k\) 块的答案,记忆化搜索
1049 第一问很好做,减去序号最最长不降子序列即可,第二问看题解 link
1050 把边排序,枚举每一个最大值,然后并查集维护连通性,一条条把边加入,直到 \(S\) 和 \(T\) 联通为止,求一个最大值
1051 缩点,看出度为 \(0\) 的点,如果只有一个,那么输出他的大小,否则就是 \(0\)
1052 贪心,首先做出点集的包含矩形,就是最小的矩形覆盖了所有的点,然后易于证明一定有一个正方形在角上,那么就枚举,然后剩下的点再枚举一次,最后只剩一个正方形的时候判断一下即可
1053 实质上就是小于等于 \(n\) 的数里面约数个数最多的,找规律,发现都是有较小的质因数组成,事实上一定由前 \(12\) 个质数组成(不知道怎么证),搜一下即可
1054 直接 \(\text{BFS}\) ,关键是把 \(16\) 个格子压成一个状态来判重,但是据 \(\text{hzwer}\) 的博客,不判重也能过。。。
1055 \(f[i][j][k]\) 表示 \((i,j)\) 这一段能否用第 \(k\) 个字母表示出来,假设 \(k=ab\),那么就是把 \((i,j)\) 分成两段,当 \(f[i][md][a] \&\& f[md+1][j][b]\) 时 \(f[i][j][k]=1\)
1056 平衡树+hash
1057 悬线法求最大子矩形,正方形也一样,求面积的时候用两个长度的较小值就行了
1058 \(\text{multiset}\) 的基础操作,维护两个 \(\text{multiset}\),一个存相邻两项的权值,另一个存排过序之后的数列,支持插入,删除,取最小值
1059 同行同列的点无论经过多少次变换人仍然同行或同列,所以题目可转换为能不能找到 \(n\) 个互相不同行或同列的点,二分图匹配即可
1060 \(\text{dfs}\) 一遍,回溯的过程中统计答案,每个点的儿子们都得相同,所以就是找到儿子们的最大值,把每个儿子都变成这个值
1061 不难列出一堆等式,然后可以单纯形(不会😢)也可以一个神奇的建图之后跑费用流
5286 把序列倍长,我们要求的是 \(\min_{i=1}^{N}\{ \max_{j=i}^{2*N}\{T_j-j+i+N-1 \} \}\),然后令 \(a_i = T_i -i\),上式简化为 \(\min_{i=1}^{N}\{ \max_{j=i}^{2*N}\{a_j \} +i \}+N-1\),我们建立线段树,对于每一个叶子维护 \(max_{j=i}^{2*N} \{ a_j \}\) 和 \(max_{j=i}^{2*N} \{ a_j \} +i\),修改的时候发现事实上影响到的是一个区间,所以可以 \(O(log)\) 处理,查询的时候直接查 \([1,n]\) 最大值即可
5288 乱搞题,扩展的顺序 \(random\) 一下,或者直接倒着扩展一遍,就可以过了。正解是如果 \(i\) 到 \(i + 1\) 的门的钥匙在 \(i\) 及其左侧,则连边 \((i,i+1)\),否则连边 \((i+1,i)\),得到有向无环图,按照它的拓扑序倒序扩展,感觉就是一个点走到的点都已经扩展过了,所以可以直接一步跳过去
5289 把条件转换为将 \(a_i\) 和 \(i\) 连边,然后一个个填上 \(1, 2, 3...\) 作为它的 \(p_i\) 值,要求当前填的点的父亲必须已经填过,求 \(\sum w_i \cdot p_i\) 的最大值。然后因为选完一个点 \(u\) 之后,若它的儿子 \(v\) 权值最小,那么一定选择这个 \(v\) 填下一个数,所以贪心地每次把权值最小的点和他的父亲合并,新节点的权值为这两个点的权值平均值,直到最后只剩下一个点
5296 原根的性质是 \(g_i \mod p\) 在 \(i\) 为 \([0, p-2]\) 之间时都不相等,所以我们已知 \(A\), 可以直接求 \(a\),用 \(\text{BSGS}\) 即可
5297 就是生成树个数,直接上基尔霍夫定理,注意有取模,得使用辗转相除法,不能直接 \(\text{double}\)
5299 \(f[mask][i]\) 表示当前取的点集是 \(mask\),当前点是 \(i\) 的方案数,然后枚举下一个连的点 \(nw\),要求是 \(i\) 到 \(nw\) 的线段上点都已经在 \(mask\) 里面,这些点可以预处理出来
5305 考虑看每条边的贡献,考虑 \(u\) 和 \(fa[u]\) 之间的边的贡献,实质上就是 \(sz[u] \cdot (n-sz[u])\),然后枚举 \(sz[u]\),这样的树的种数是 \(u! \cdot C_{n-u}^{sz[u]-1} \cdot sz[u]! \ \cdot \frac {(n-sz[u]-1)!} {(u-2)!}\),乘上权值就是 \(sz[u]\cdot C_{n-u}^{sz[u]-1} \cdot (n-sz[u])! \cdot sz[u]! \cdot u \cdot (u-1)\)
5323 转化题目变成一个排列的权值是从左到右变僵尸,直到第一次全部被感染的轮数,求所有排列权值和。称所有没有大于 \(l\) 的因子(自己不算)的 \([l,r]\) 之间的数为好数,我们只要求把所有好数变僵尸。首先筛出来好数个数,设为 \(m\),设 \(n = r-l+1\),那么枚举轮数,就是 \(\sum_{i = m}^{n}i\cdot A_{i-1}^{m-1} \cdot m \cdot (n-m)!\)
5335 首先二分答案,然后就是最小可重复路径覆盖,首先做一个传递闭包就变成了最小不重复路径覆盖
5338 线性基是三个 \(log\),所以得使用可持久化 \(trie\)。首先先树剖,然后只要 \(O(log)\) 地查询区间的 \(xor\) 最大值,可以直接上可持久化 \(trie\),每一位看能不能 \(xor\) 出来为 \(1\),就是看那一个儿子的 \(size\) 是否大于零
5339 拉格朗日插值模板题