随笔分类 - 每日一题
摘要:题目 Genius ACM 题解 我们这题使用倍增+归并的思想,要使平方差最大当然是离越远越好,那么自然而然会想到排序。 检查合法性函数 check(l, r): 提取子数组 ( a[l:r] ) 并拷贝到数组 b 进行排序。 计算前 ( m ) 对最大平方差和。 如果总和小于等于 ( k ),返回
阅读全文
摘要:题目 奇数码问题 题解 这题要用模拟出结果是非常麻烦的,具体的可以看八数码问题,经过分析(我根本分析不出来)发现只要两个数组的逆序对的奇偶性相同,那就是能成功转化,那么这道题就变成了求逆序对的数目,具体如何求可参考上一题Ulter-QuickSort。但是要注意0不能算进去。 参考代码 #inclu
阅读全文
摘要:题目 Ultra-QuickSort 题解 这道题本质是求逆序对的个数,用归并思想来做。 参考代码 #include<iostream> using namespace std; typedef long long LL; const int N = 1e5 + 10; int n; int a[N
阅读全文
摘要:题目 Running Median 题解 这题考察的是堆的使用,但要想频繁得出堆中的中位数是极其不方便的,但是我们可以想到建两个堆,左边小的数放在大根堆中,右边大的数放在小根堆中,中位数为大根堆堆顶元素方便取出,每次放入考虑放在哪个堆中,如果堆不平衡只需要移动堆顶元素就行。 参考代码 #includ
阅读全文
摘要:题目 七夕祭 题解 这里借y总的图来用用,我们可以用正负来表示拿过来还是送出去,最终要每个人均分,所以可以列出n个方程,而这个方程组有一个自由变量(因为所有方程相加为恒等式,具体原理去看看线代),我们设x1为自由变量,通过移项可以用x1来表示其他所有x,用c表示后面的常量。我们本来求的是|x1|+|
阅读全文
摘要:题目 货仓选址 题解 这是一道典型的思维题,我们不难看出在中间可以做到和为最小,所以我们只需要找出中间那个数即可。如果个数为奇数,那么就是中间那个值;如果为偶数,中间左右都是一样的,我们可以由数学知识证得。那么只需要给这个数组排个序找出中间那个值,然后再枚举加一遍就完成了。 参考代码 #includ
阅读全文
摘要:题目 Cinema 题解 用一个cnt数组来记录每个出现过的语言有多少科学家懂得,然后遍历一遍电影,设变量maxn为有多少人很开心,如果现在遍历的b[i]种语言比之前的某种语言有更多的科学家懂,那就更新maxn=cnt[b[i]],res记录的是第几部电影;如果现在遍历的b[i]种语言和之前的某种语
阅读全文
摘要:题目 Best Cow Fences 引言 对于二分,我们先引入模板。二分模板一共有两个,分别适用于不同情况,mid在哪一边,版本1属于左半边,版本2属于右半边。 算法思路:假设目标值在闭区间[l, r]中, 每次将区间长度缩小一半,当l = r时,我们就找到了目标值。 版本1 当我们将区间[l,
阅读全文
摘要:题目 Tallest Cow 题解 我们可以假设一开始所有的牛都是最高的,这样子除了邻近的牛谁也看不见谁,然后若想让l,r两只牛相见,只需要把他们中间的牛高度-1即可,那就是将区间[l+1,r-1]的数字减1,所以我们可以想到差分的做法,但是请注意,题目说给的相见牛中可能会有重复数据,我们不能进行两
阅读全文
摘要:题目 IncDec Sequence 题解 差分解决一段区域同时增加或减少的问题 给区间【L,R】上都加上一个常数c,则b[L] += c , b[R + 1] -=c 求出a的差分序列b,其中b1 = a1,b(i) = a(i) - a(i - 1) (2 <= i <= n)。令b(n + 1
阅读全文
摘要:题目 [HNOI2003]激光炸弹 题解 读完题可以发现这几乎就是一个裸的前缀和板子,然后把所有的正方形r遍历一遍找出最大价值。那么开敲,如果不会前缀和差分知识可以单独拿出来学习一下。 参考代码 #include<iostream> using namespace std; const int N
阅读全文
摘要:题目 Fractal Streets 题解 这题的难点在坐标变换和如何进行递归如何化成子问题,我们可以将n级图变成4个n-1级图,而每个n-1级图通过找规律可以知道有4^(n-1)个格子记为cnt,这样我们就可以知道编号m的位置了,m在第m/cnt个n-1级图中,他的编号为m%cnt,这样子我们的递
阅读全文
摘要:题目 Sumdiv 题解 想写出这道题要先知道两个数学知识,分别是约数定理和约数个数定理。 约束个数定理 约数定理 有了上述两个知识之后这题就有了方向,将所有约数分解出来进行计算就可以了,但是求约数个数中的每一项该怎么求呢,不难发现这是个等比数列,可以用等比数列公式来求,但是这个要求逆元,我们也可以
阅读全文
摘要:题目 Strange Towers of Hanoi 题解 如果只有三根柱子的话,记d[i]为移动次数,那就需要将上面i-1跟移动到其中一个盘子,然后最下面那根放到目标盘子,最后将i-1放在目标盘子上,可以得到递推式为 d[i] = 1 + d[i - 1] * 2; 那么如果有四根柱子的话,记f[
阅读全文
摘要:题目 费解的开关 题解 将第一层的状态确定下来,第二层就能确定,同理到最后一层也就确定了,所以只需要枚举第一层所有状态就可以确定步数,满足条件就存下步数,比较并选取最小步数,最后如果步数大于6输出-1。对于翻转操作,dx、dy可以很方便得对周围方格进行枚举,别忘了每枚举完第一层一个状态需要恢复到题目
阅读全文
摘要:题目 递归实现排列型枚举 题解 这道题其实就是求无重复元素的全排列问题,递归一般注意截止条件,这里的截止条件一定是全部遍历完了,因为顺序是乱的,所以我们应该不止拿个数组存储是否使用,还需要拿个数组存储路径,遍历一遍如果没被使用可以选择,然后进行下一个数的选择,此时dfs里面的参数u表示的是当前选了几
阅读全文
摘要:题目 递归实现组合型枚举 题解 可以参考上一题的递归代码,思路是一样的,也是拿个数组存储是否选了该位,多了一个参数记录选了几个,若选了cnt+1,否则直接cnt不变化。 注意观察递归从非递归是如何变化的。 参考代码(递归) #include<iostream> using namespace std
阅读全文
摘要:题目 递归实现指数型枚举 题解 由于书本的顺序,刚做完第一章可能会联想到用位运算这样的手法来遍历所有状态,因为他的范围不大,所以理论可以实现。但是题目要求用递归思路,所以我们用递归思路写一遍,递归有两条路往下,选当前位置和不选当前位置,我们不能一边输出一边选,这样会导致输出混乱,可以拿个数组来记录当
阅读全文
摘要:题目 起床困难综合症 题解 如果将所有伤害点数一一枚举的话,时间复杂度会来到O(nm),对此肯定是满足不了题目要求的,经过分析不难发现,位运算操作只与当前位有关,这样我们可以枚举每一位,再在其中选其优,这样子时间复杂度就来到了O(nlogm),,由于伤害要尽可能大,所以我们要从高位开始往下,接下来会
阅读全文
摘要:题目 最短Hamilton路径 题解 这里的数据范围n为20,若暴力强行解的话时间肯定是不够的,所以我们要考虑如何知道哪些边走过,可以使用状态压缩的思想,而且我们要的不是所有解法而是最优解,所以只需要存储min即可,f[i][j]中的i表示当前状态,比如有1、2、3、4四个点,1100就表示1、2两
阅读全文

浙公网安备 33010602011771号