题意:现在有一个n*m的矩阵A,在A中找一个H*H的正方形,使得其面积最大且该正方形元素的和不大于 limit。分析:开始以为是DP或者二维RMQ,其实用二分就可以做出来; 在输入时构造元素和矩阵dp[][](即dp[i][j]为从(1,1)到(i,j)的矩形范围元素和);再在(0,min(m...
分类:
其他好文 时间:
2015-05-16 01:27:53
阅读次数:
140
Description
Xuanxuan has n sticks of different length. One day, she puts all her sticks in a line, represented by S1, S2, S3, …Sn. After measuring the length of each stick Sk (1 <= k <= n), she finds...
分类:
其他好文 时间:
2015-05-15 21:31:42
阅读次数:
480
思路:全都已经介绍了。连步骤它都告诉你了。差的只是实现了。两种实现方法:(1)用链表做树(2)用顺序表做树。顺序表的速度更快,因为不用管链的问题。空间谁更省?树是接近平衡的,也就是叶子节点在最下两层,但是如果树深一点,用顺序表就会浪费很多空间,这底层可能比之前存的都要多,但是链表却每个点都要消耗。总...
分类:
其他好文 时间:
2015-05-15 21:21:40
阅读次数:
230
G++77ms0MB思路:这题用暴力是最快的,甚至比线段树还佳。 按全部都是查询的来算,是O(n*q)。 1 #include 2 using namespace std; 3 const int N=10010; 4 int w[N], n, q, L, R, tmp; 5 6 int mai.....
分类:
其他好文 时间:
2015-05-15 19:36:47
阅读次数:
144
ACG++826ms146MB思路: 按照提示一的方法进行实现。使用二进制的思想,只需要找到从第i个开始的2^j个数中的最小。i=(1,n)而因为n上限为100万,100万的二进制(1111 01000010 01000000),那么j 最大不超过20。按最坏情况算,只需要计算n*20个结果就行了....
分类:
编程语言 时间:
2015-05-15 19:17:57
阅读次数:
194
RMQ——区间最小查询,实际情况往往不是查询最小值,而是查询区间特定信息。一般要求在logn的级别实现查询or修改。RMQ三种实现1.BITBIT给我的感觉就是神迹一般数学的巧合,关于它的原理就不作解释了。BIT的实现十分简单,但是要支持高级的功能的话,思考的复杂度会很高。2.线段树思考比较直观,顶...
分类:
其他好文 时间:
2015-05-14 20:07:01
阅读次数:
134
问题描述 依然是RMQ问题。过程需要修改某些点的数据。 使用线段树解决。 单点修改的复杂度是O(logn),即树深,只需要修改这个点的祖先节点。 区间查询的复杂度也是O(logn),因为除了第一步可能一分为二外,其他查询若有分解则分解后必然有一个区间是不需要再分解的。#include #includ...
分类:
其他好文 时间:
2015-05-14 15:56:32
阅读次数:
96
问题描述 询问区间最小值,过程中会对某些位置的值进行修改。 这题数据量很小,使用O(NQ)的方法做。 后续会有其他高效的解法。#include int data[10005]; int main(){ int n, q; scanf("%d", &n); for (int i = 1; i <= n...
分类:
其他好文 时间:
2015-05-14 14:03:30
阅读次数:
183
题目描述 这次是使用在线算法解决这个问题。 两个节点的最近公共祖先就是这两个节点的通路上深度最浅的那个节点。 可以通过一遍深搜把树转成数组:每次经过一个节点(无论是从父节点进入还是从子节点返回)时,把它放入数组。同时要记录每个节点在数组中最后一次出现的位置。 使用RMQ-ST算法预先计算2^k长度区...
分类:
其他好文 时间:
2015-05-09 23:18:38
阅读次数:
162
问题描述 问题就是询问区间内的最小值。 数据量n, 查询量q。 朴素的算法复杂度O(nq)。 为减少冗余计算,预先计算出每个位置起 2^k 长度范围内的最小值。 data[i][j]表示从 i 起的 2^k 个元素的最小值。 递推式 data[i][j] = min{data[i][j – 1], ...
分类:
编程语言 时间:
2015-05-08 23:33:49
阅读次数:
157