题解路程
用来发布本人的部分题解。
(如有疑问,欢迎与我交流)
小新不想起床
这个作者很懒,什么都没留下…
展开
-
AtCoder_221_f Diameter set 题解
思维模拟加数学 因为是最远点,故必定为直径。 我们知道树的直径并不为一。但是考虑一下,如果一棵树的直径中有奇数个结点,其实对于它来说其“中心结点”是 每一条直径都必须通过的。(证明靠脑子) 由上面那个想法我们可以类比出偶数结点的情况,那么其“中心”将会变成一条边,也就是说这条边两边的点是必被 直径通过的存在。 所以,当结点为偶数时,只需要分别计算两侧结点所领导的子树中有多少个结点的深度是直径的一半即可。 但是在结点数为奇数个时问题就会有转变,因为类似于“菊花图”这种的,其实它隐含了一个组合问题,是原创 2021-10-09 11:59:00 · 207 阅读 · 0 评论 -
牛客/20328/J Sudoku Subrectangles 题解
优雅的暴力枚举 首先,根据容斥原理,行不过 52 个元素必有重复(列同理) 我们考虑枚举矩形的上下边界,由于上下边界间距离不会超过 52 所以共有 52*n 种上下边界。 在上下边界之间查找可能的左右边界,假设矩形只有一行那么左右边界显然可以通过尺取判重的方式获得,又注意到 本题中行列判重是分开的,所以我们可以把行列分开判断用一个数组(代码中是 ts 数组)记录当前列的向前最远可 匹配位置。由于行列分开所以我们发现列中具有重复单词时,直接把当前位置 ts 值置为当前位置下标即可,否则用 尺取法判断通过行原创 2021-10-08 17:55:21 · 131 阅读 · 0 评论 -
牛客/20328/A Minimum Cost Perfect Matching 题解
思维(构造) 首先考虑什么时候 i & pi == 0 很显然的一点是当 pi == i ^ t (这里 t 代指一个二进制全为 1 的数)时成立 那么由此得知当 n 为 2 的幂的时候只需要不断地首尾交换数值就够了,而我们进一步的分析上面的条件可以发现如 果将对应 i 的 0 位的数值换为 1 也是可以的,所以可以将后面的大数(高位有 1 的数)向前调整,就可以把高位 的影响给消除。 综上所述,我们可以进行最高位的二进制进行划分,把所有的最高位的二进制以上的值向下调整,然后将二进制内的 数原创 2021-10-08 11:55:34 · 107 阅读 · 0 评论 -
牛客/20328/C Bit Compression 题解
半记忆化搜索(空间与时间平衡的艺术) 单论空间,用 a 数组直接记录;计算实践得出总时间复杂度一亿多一点。 具体思路:前面 14 次幂采用暴力枚举: 3^14 ,后面 4 次幂采用记忆化搜索:2^(2^4) #include <bits/stdc++.h> using namespace std; #define ll long long #define _for(i, a, b) for(int i = (a); i <= (b); i ++) int n, m; bool原创 2021-10-08 11:28:25 · 90 阅读 · 0 评论 -
AtCoder_abc221_e LEQ 题解
1、任意两个节点 i,j (i < j) 2、有 Ai <= Aj 3、那么:点对(i, j)对答案的贡献为( 2^(j - i - 1) ) 综上所述:每个点的贡献与前面所有小于等于其节点到这个点距离和有关系(非线性) 观察 3 的式子之后发现若以 2^(i+1) 表示第 i 个点的价值,那么答案就是当前点用 2^j 表示后分别除上 前方所有的符合条件节点的价值之后的和。 关于除法,我们可以通过转化逆元处理出来由通过提取公因子 2^j 而将原式转化为加法,故本题可以用 树状数组原创 2021-10-07 17:55:40 · 259 阅读 · 0 评论