F(数据结构:点更新、查询最值线段树)
给定N个正整数,N<=400000,数字会重复,但每个数都小于等于N,求字典序最小的A、B满足:该数列中含有A、B、A、B子序列(不一定连续)
题解:第一眼能猜到是个数据结构题,但不会推(
思路1:A、B、A、B,是一个交错结构,可以先想查询ABA子序列,则只需要知道下一个A的位置(预处理中能得到),在两个位置之间查询最小值即为B,可在NlogN内完成,如果替换成ABAB的情况,则我们需要保证查询到的最小值B,其在两个A的间隔之后,仍存在一个B,很麻烦。
故转化思路,在遍历到时,将其看作B,查询BAB中的A,而A是遍历到之前插入线段树的,故在两个B之前必定存在一个A
1 |
|
思路2:题目要求字典序最小,故我们找出满足题目条件的A,在A之间再找B,略复杂
G(数学、排列组合计数问题)
题意:给定RxC的方格,给定整数K(1<=K<=R*C),在方格上找到N个矩形,满足所有矩形的共有区域的格数大于等于K,求矩形有多少种摆放方式(注意:矩形的顺序也有影响)
题解:预处理出共有区域大小刚好为i的摆放方式,最后枚举i从K到MAX的和
问题:如何预处理以至于不漏、不重复?可以看出共有区域必定是个矩形,故我们从矩形的row和column两方面考虑,若i块矩形,其row的位置有m种可能,column的位置有n种可能,则一共有m*n种摆放方式。故我们只需处理出共有区域的row的长度为1~R时,其所对应的可能数,column的长度从1~C,其所对应的可能数,最后汇总答案即可。
1 |
|
D(环型贪心、二倍环展开)
题意:给定N个数组成的圆环,求将圆环上的数分割成K组后,每组的OR值的AND值最大
题解:位运算很容易想到从高到低位考虑,当第i位为1的数不足k个,或将其分为k组的分法与更高位的分法相悖时,第i位对答案没有贡献。
我们就考虑1位时,很明显若当前位出现1时,将其划分到一组,最后看能划分出的组数大于等于k,即存在答案
而若考虑2位时,先将最高位按上述处理,若最高位对答案有贡献,则当前位和最高位都为1时,才将其划分到一组,最后也是看划分出的组数是否大于等于k
环问题,则将其转化成2n的序列,则划分出的组数要大于等于2k-1(将环变成二倍环,展开后最多减少1个组数,即2k-1满足条件—如果不扩展成二倍环,无法区分最后组数是否收到展开的影响而-1)
1 |
|