已经删除了一些很没有营养的题
建议倒序阅读
CF1307B
题意:
在数轴上给你一个点 \((0,n)\),和一些你可以走的距离 \(a_i\) ,问最少多少次才能恰好走到 \((0,n)\) .
思路:
首先它说是最少次数,那肯定尽量走最长的距离,这么走最后会剩下 \(n\) 对 \(\max\{a_i\}\) 取模这么长需要走,显然这部分是可以走俩 \(\max\{a_i\}\) 构成一个等腰三角形走完的,但答案难道就是
\[\frac{n}{\max\{a_i\}}+2 \]显然不是的,思考怎么让自己少走点,比如后退一步(少走一步最长距离),然后发现必然仍然满足三角形性质(此处排除恰好走完的情况,恰好走完特判就行),则省下了一步,既然如此,哪能不能少走两步呢,显然不可以,毕竟此题中 \(2\times\max\{a_i\}+k\) 一定大于等于 \(2\times\max\{a_i\}\) 。
CF1486B
题意:
给你 \(n\) 个坐标 \(p_i\) (\(i\leq n\)),求满足到 \(p_i\) 的曼哈顿距离之和最小的整点个数 。
思路:
初中课本教过我们这个题目的弱化版:求到数轴上到 \(n\) 个点距离之和最小的点的个数,当 \(n\) 为奇数时只能取 \(n\) 个数的中位数 ,偶数时可以取 \(p_\frac{n}{2}\) 到 \(p_{\frac{n}{2}+1}\) 之间的所有点 ,整点则共有 \(p_{\frac{n}{2}+1}-p_\frac{n}{2}+1\) 个 (此时假设 \(n\) 个点顺序排列)。
不妨把 \(x_{p_i}\) 与 \(y_{p_i}\) 分开在两个数轴上考虑,那么所选的点一定是满足到 \(x_{p_i}\) 距离之和最小的点且到 \(y_{p_i}\) 距离之和最小的点,显然这样的点在 \(n\) 为奇数时只有 \(1\) 个 ,\(n\) 为偶数时有 \((x_{p_{\frac{n}{2}+1}}-x_{p_\frac{n}{2}}+1) \times (y_{p_{\frac{n}{2}+1}}-y_{p_\frac{n}{2}}+1)\) ,排序一下再统计即可。
CF1363C
题意:
给定一棵 \(n\) 个节点的无根树,和一个目标节点 \(x\) ,每次可以删除一个叶子节点,问是谁能先删掉 \(x\) 节点。
思路:
注意是无根树,即将结束时的情况一定可以认为是以 \(x\) 为根和一些深度为 \(1\) 的叶子节点构成的树,因为每个人都不会在一棵子树上使劲删,而是尽量使得 \(x\) 的度数不变,所以最后是这样子,判断 \(n\) 的奇偶即可,当 \(n\) 为偶数时先手会把与 \(x\) 相邻的唯一一个点删掉,后手胜,反之先手胜。
CF1527C
题意:
给定长度为 \(n\) 序列,求每个子段 \([l,r]\) 中 \(a_i=a_j\) \((l\leq i<j\leq r)\) 的个数
\(1\leq n\leq 10^5\)
思路:
首先考虑 \(O(n^2)\) 做法,找到每一对 \(a_i=a_j\) \((1\leq i<j\leq n)\) ,对答案累加 \(i\times (n-j+1)\) 因为包含 \([i,j]\) 的区间 \([l,r]\) 的 \(l\) 有 \(i\) 种选择,\(r\) 有 \(n-j+1\) 种选择,优化这种方法,可以对每一个数分别考虑有哪些与其相等,比如 与 \(x\) 相等的有 \(a_i\) ,\(a_{j}\) ,\(a_{k}\) ,假设 \(1\leq i<j<k \leq n\) ,那么答案增加了 \((i+j+k)\times (n-k+1)\) ,设 \(b_i\) 为所有满足 \(a_i=a_j\) \((j<i)\) 的下标 \(j\) 之和,那么对答案的贡献将增加 \(b_i\times (n-i+1)\) ,对每个数分别统计即可。
CF785C
题意:
给定 \(n\) 和 \(m\) ,第 \(i\) 天 \(n \gets \max(n,n+m)-i\) ,求哪天起 \(n \leq 0\)
思路:
如果 \(n\leq m\) ,那等价于 \(n\gets n-i\) ,直到第 \(n\) 天 \(n-i=0\) ;
否则可以发现前 \(m\) 天减去的都会被下一天补回到 \(n\) ,那么在第 \(m+1\) 天 \(n\) 下一天只能被补成 \(n-1\) ,所以第 \(m+i\) 天 \(n\) 减少了 \(i\) ,第 \(m\) 天往后 \(i\) 天总共减少了 \(\frac{(i+1)\times i}2\) ,因为第 \(m+1\) 天开始时 \(n\) 为 \(n-m\) ,所以求解 \(n-m\leq\frac{(i+1)\times i}2\) 的最小 \(i\) 即可,二分或者暴力枚举都行,我写的二分。
CF1423K
题意:
多组询问,每次询问给出 \(n\) ,回答对于所以 \(i\in [1,n]\) ,有多少个 \(i\) 满足不存在 \(j\in [1,n]\) 使得 \(\gcd(i,j)\) ,\(\frac{j}{\gcd(i,j)}\) ,\(\frac{i}{\gcd(i,j)}\) 构成三角形 。
思路:
首先观察样例可以发现:
- 偶数一定不对答案有贡献,因为可以选择 \(i\) 和 \(i\pm2\) 使得他们的最大公约数为 \(2\) ,另外两边之差一定是 \(1\) ;
可以依照这种思路分类下去,由于奇数的情况有些复杂在最后讨论;
- 考虑某些质数 \(p\) ,那么 \(\gcd(p,j)\) 一定是 \(1\) 或 \(p\) ,\(\frac{p}{\gcd(p,j)}\) 与对应上面是 \(p\) 或 \(1\) ,\(\frac{j}{\gcd(p,j)}\) 与上面对应一定是 \(j\) 或 \(\frac{j}{p}\) ,发现不管怎么样都存在恰好 \(1\) 个 \(1\) ,所以两个不等于 \(1\) 的值必须相等,那么 \(j\gets p^2\) 即可,那么显然 \(p\leq \sqrt n\) 的质数都存在 \(j\) 满足条件;
- 现在考虑奇数的情况,质数已经证明可以,合数可以选择其最小的质因子 \(p\) ,可以构造 \(i-p\) ,\(i\) 即可;
综上,所有合数满足条件,大于 \(\sqrt n\) 的质数都不满足,\(1\) 不满足,求前缀素数个数 \(s_i\) 表示 \(1-i\) 的素数个数,答案即为 \(s_n-s_{\sqrt n}+1\)
CF1554D
题意:
构造一个字符串使得其每个子串都出现奇数次
思路:
考虑极为形式化的构造,摆一堆相同的字符上去,可以发现
- 如果长度为偶数,那么他长度为奇数的子串有偶数个,长度为偶数的子串有奇数个
- 反之如果长度为奇数,那么长度为奇数的子串奇数个,长度为偶数的子串偶数个
那么我们可以想到把让相同的子串拼起来,使得偶数变成奇数,那么我们需要一个长度为 \(l\) 的字符串和一个长度为 \(l-1\) 的字符串达到目标,但是我们需要保证这两个串是相互独立的,只需要在中间添加无关的字符
简而言之,就是在前面摆 \(\frac{n}{2}\) 个某一种字符,在最后摆 \(\frac{n}{2}-1\) 个相同种类的字符 ,中间缺失的部分至多只有 \(2\) 个,放上无关字符即可,容易证明无关字符不对答案产生影响
CF1179B
题意:
你站在一个 \(n\times m\) 的网格的 \((1,1)\) ,每次可以选择一个数对 \((dx,dy)\) ,把你的位置 \((x,y)\) 变为 \((x+dx,y+dy)\) ,使得你经过了每一个格点,并且没有重复使用同一个数对,请构造出路径。
思路:
神仙构造题,观察第一个样例,发现可以对于每一行都形如 \((1,y)-(n,y)-(2,y)-(n-1,y)\) 这么走下来,考虑纵向怎么走。默认你在 \((a,b)\) 这个位置 ,大力构造,每次把未被处理的最下面一行和未被处理的最上面一行进行操作,即前两次的处理是 \((1,1)-(n,m)-(2,1)-(n-1,m)-...-(1,n)-(n,1)\) ,然后每次找该处理那两行即可。
注意分讨奇偶
CF761E
思路:
无解显然等价于存在点度大于 \(4\) 的节点,因为与 \((x,y)\) 关于坐标轴平行的点满足边不相交只有 \(4\) 个
钦定 \(1\) 为根
第一反应是边权要尽量大,要不然容易出现兄弟节点重合的情况,但由于边不能相交,所以边权要随着树的层数的增加不断减小,假设深度为 \(d\),\(i\) 和它子节点的连边的权值是 \(p_i\),那么应该满足对于任意 \(i\),都有 \(p_i > \sum_{i< k \leq d} p_k\),满足这个等式的构造方法是显然的,即对于任意 \(1\leq i\leq d\),满足\(p_i=2^{n-i+1}\),因为 \(n\) 很小,所以不必担心跑出 \(10^{18}\)。
现在每条边的权值已经得到,还需要考虑 \(u\) 的子节点的方向不能朝向 \(u\) 的父节点,记录来的方向即可。
CF118E
题意:
判断是否能把一个无向图的所有无向边改成有向边,使得改完后两两点可达,并给出方案。
思路:
可以糊出一个模糊的做法,就是先从图里深度优先遍历一条经过所有点且只经过一次的路径,然后就是有了一条链(请把它看作一个链,而不是生成树)。
那么剩下的边必然连到它的祖先或者直接儿子。
然后可以发现,不存在方案等价于任意一种深度优先遍历的方式都存在一个点和它的子树内都没有返祖边。
也就是说,存在桥。
当然,如果知道了结论是桥的话,证明是很简单的,因为删了桥后图不再连通,那么定向后两块一定有一块总到不了另一块
Tarjan 判一发桥。
然后怎么改,由于已经保证没有桥,所以每个点的子树内都有返祖边,当然就是树上的边指向儿子,剩余的边指向祖先
为啥这是对的呢,假设根是 \(root\)。
那么很明显 \(root\) 能到达所有点,那么只需要证明所有点都能到 \(root\) 即可:
首先,必然存在一个 \(root\) 的度大于等于 \(2\),选他为正式的 \(root\)。
那么,肯定是一个边是 \(root\) 指向生成树树上的儿子,另一些是 \(u\) 指向 \(root\) 的(注意方向)。
所以 \(root\) 和 \(u\) 之间的所有点都能走到 \(root\) 了
由于所有在 \(u\) 的子树内一定存在 \(v\) 满足 \(v\) 和 \(u\) 的某个祖先有连边,否则就存在桥了。
然后能走到 \(root\) 就有传递性了
感性理解,不能走时就往下走到第一个有返祖边的点再往上跳。