2015暑假集训第一周题目总结
HDU 5288 OO’s Sequence
题意
一个长度为n的数组,定义f(l,r)为[l,r]之间,没有[l,r]之间的其它数能将其整除的数的个数。求
思路
对于下标为i的某一个数,下标为left的数是在从i向左最后一个不是i的因数的数,下标为right的数是在从i向右最后一个不是i的因数的数,则该数对答案的贡献为
由于每个数字0< ai <=10000范围较小,可以用10000个数组保存每个数的位置,通过二分来查找最近的数。
时间复杂度
O(nlogna√)
空间复杂度
O(n)
HDU 5289 Assignment
题意
一个n个元素的数组中,问有多少个连续的子序列,其最大值减最小值小于k
思路
用一个队列,每次入队一个元素,如果队列元素中的最大值减最小值不小于k则将最先进队的元素出队,直到队列中所有元素符合要求,此时队列中元素的数量就是加入该元素所能新增的符合条件的子序列的数量,累加如答案中。
比赛时用set来维护最大最小值,用单调队列可以得到更低的时间复杂度。
时间复杂度
用set维护:
O(nlogn)
用单调队列维护:
O(n)
空间复杂度
O(n)
HDU 5301 Buildings
题意
把一个长m,宽n的矩形,分割成一些小矩形,要求每个小矩形至少有一条边是原来大矩形的边的一部分。除了一个特殊的1×1格子(x,y)不能被包含在分割后的矩形里,其它部分都必须被分割。求分割出来的矩形的中,面积最大的那个的面积的最小值。
思路
不考虑不能被包含的格子,答案
ans=⌊min(m,n)+12⌋
将整个矩形翻转和旋转,使其水平方向的边长大于等于竖直方向
(m>=n)
、不能被包含的格子的位置靠左上方(
x≤n−x−1
y≤m−y+1
),则不能被包含的格子正下方的哪一个格子受其影响最大,它所在小矩形的最小面积应该是
min(y,n−x)
,故答案为
max(ans,min(y,n−x))
。
但是这样忽略了一种情况,那就是如果大矩形是个正方形,边长为奇数,并且不能分割的块在正中间,此时的答案就是
ans−1
了。
时间复杂度
O(1)
空间复杂度
O(1)
HDU 5303 Delicious Apples
题意
长度为l米的环形道路有n棵苹果树,每棵树坐标 xi 有 ai 个苹果,用容量为K的篮子全部搬回位置为0的储藏室,最少要走多少米?
思路
以苹果为对象进行考虑。把苹果以储藏室为中点分为在其左边和在其右边两堆,如果不考虑走整个环形路径的话,左右边的苹果分别从左右去取就行了。
而环形路径最多只需要走一次,我们可以枚举这次拿了哪些苹果。
时间复杂度
O(na)
空间复杂度
O(na)
HDU 5305 Friends
题意
n个人m对朋友关系,朋友关系分为线上和线下两种,每个人的线上朋友和线下朋友的数目相等,问有多少种分法。 (1≤n≤8)
思路
因为n比较小,可以直接暴力。首先,某个人的朋友数是单数的话则是无解额,然后对于每一个人,枚举他的每个朋友的种类。并时刻检查是否满足条件。
时间复杂度
O(2m−n+1)
空间复杂度
O(2m−n+1)
HDU 5308 I Wanna Become A 24-Point Master
题意
n个n用加减乘除括号算24。 (1≤n≤105)
思路
用12个n可以用如下的方法算24:
跟n的值无关,所以只要不小于12的偶数都可以用此方法,先用前12个算出24,然后+n - n 就行了
同理,13个n可以用如下的方法算24,这样可以解决不小于13的奇数:
这样12及以后的就都搞定了,12之前的手算一下就可以打表了。
时间复杂度
O(n)
空间复杂度
O(1)
POJ 2823 Sliding Window
题意
长度为n的一个数组,问每一个长度为k的连续的子序列中元素的最大值和最小值
思路
单调队列的模板题,用两个单调队列分别保存最大值和最小值
单调队列可以进行如下操作:
入队:将元素入队,保持队列的单调性,单调队列中所有比x劣的值都会被去掉。由于被发现与将入队元素相比更劣的元素都会被去掉,这样限制了比较的次数,而且每个元素只会出队一次,将n个元素全部入队一次的复杂度为
O(n)
;
出队:将最老的元素出队,复杂度
O(1)
查询:查询队首元素,即所维护的最值,复杂度
O(1)
因此可以以
O(n)
的时间复杂度解决这个问题
时间复杂度
O(n)
空间复杂度
O(n)