预处理(前缀和,差分,离散化)
爱莉我老婆
Java萌新算法选手一枚,去过蓝桥国赛。励志补全Java版本的算法模板
展开
-
前缀数组-截断数组
问题来了,如何确定第一段的最长的长度,并类推到第二段呢?我们不妨直接设个中间量aaaa,首先在前n-1个数字中寻找累加起来等于average的,找到一个aaaa++,一旦前缀和等于average*2,就证明已经到了第二段的最小长度,这时候就将answer+aaaa,为什么是加aaaa呢,原理就是总数等于第一段的数量乘以第二段的种类数,这是是把乘法变加法。之所以我令编号小于a,不仅仅是因为aa【a】等于average*3,还有一种特殊的样例,三个0,为了规避它的影响的,我设置这个条件,顺便。原创 2024-01-13 20:47:37 · 413 阅读 · 0 评论 -
利用TreeMap来达成离散化的目的
TreeMap由于会自动对编号(key)排序并且内部使用二分查找(由于其是有序,按照键的大小来排序),所以找寻键和存储键值对会相对较快,但是数据多了可能会爆时间,所以还是小心使用,但这仍是一个新用途。可以考虑离散化,由于编号不连续,我们重新组织编号,也可以考虑TreeMap,利用《编号,数量》来表示。假如有一些奶牛,他们有种类的区别,我们设黑色奶牛的id为1000010000,白色为1,诸如此类以此类推还有红色等各种颜色,接下来给你一群奶牛的颜色id让你统计每种颜色的奶牛有几头。原创 2023-10-22 21:10:13 · 218 阅读 · 0 评论 -
利用TreeMap来解决P3029 [USACO11NOV] Cow Lineup S
0到number-1.核心逻辑是我们保证左边界所对应的编号的奶牛的数量始终为1,一旦大于一就进行递减,操作是舍弃最左边元素,就是说吧左边界往有移动一位,然后看看新的左边界是否对应的编号的奶牛的数量也是1,不是的话接着按上述操作进行。好比是从0开始到number-1,右边边界就从。好了,我们首先要统计奶牛的种类数量n,好与接下来我们记录一个范围内的奶牛的数量作比较,一旦我们统计范围内的奶牛的数量m达到我们刚开始记录的奶牛的数量n我们就开始统计最小距离.当然,首先我们要设计一个奶牛类,记录奶牛的编号和距离。原创 2023-10-22 19:19:32 · 146 阅读 · 0 评论 -
前缀和之最大加权矩形
二位前缀和的思路,我们使用二维前缀和来预处理,只有开四个for循环来枚举矩形的左起点和右下方的点。那么关键有了,怎么预处理压缩,使用到preaa[a][b]=preaa[a-1][b]+preaa[a][b];之后枚举第几列,这样将压缩后的值直接按照最长子段来求即可。我们首先来看一n*1的矩形来求最大加权矩形,不难发现这就是求最大子段之和。这是4*4的矩形,我们从第二行第二列开始取到第四行第四列为止。我们压缩,压缩为一行有11 9 11然后按照一维的矩形来做即可。我们可以将n*n的矩形进行压缩,怎么压缩?原创 2023-10-17 20:52:25 · 194 阅读 · 0 评论