2021 省选B卷

\(D1T1\)
给定长度为 \(n\) 的序列,询问有多少数对 \((i,j)\) 满足 \(a_i \%\ a_j=0\)\(n \leq 1e5 , a_i \leq 5e5\)
一个考察调和级数的题。
开一个桶将所有数装进去,选择枚举一个 \(i\) ,在对于每个 \(i\) 枚举 \(a_i\) 的倍数,计算数对即可。
复杂度为 \(O(\frac{n}{1} +\frac{n}{2}+\frac{n}{3}+···+\frac{n}{n})\) 这是个调和级数,可以证明是严格 \(nlogn\) 级别的。

\(D1T2\)
\(n\) 张卡牌,第 \(i\) 张卡牌存在正面权值 \(a_i\) 和背面权值 \(b_i\),初始所有卡牌正面向上。你可以选择翻转至多 \(m\) 张牌,使得此时 \(n\) 张牌的向上一面的权值的极差(最大值与最小值的差)最小。
有个显然的结论:翻面时一定是翻一个前缀和一个后缀,不可能去翻中间的牌,那样只会使答案变大。所以考场我想了一个枚举前缀多长和后缀多长的 \(O(m^2)\) 算法,很蠢。
正解之一:将所有 \(a,b\) 混在一起排序。答案一定是删掉了一个前缀和一个后缀之后,最后一个数和第一个数的差。删掉的要求是:
1.删去的总数不能超过 \(m\)
2.不能同时删去同一张牌的 \(a,b\)
发现可以用双指针搞一下。时间空间双 \(O(n)\)

正解之二:可以发现答案具有单调性,考虑 \(check\) 一个答案 \(x\)
如果我们选定了值域区间的左端点,那么右端点就可以很简单的确定
在这个基础上, \(a_i\) 在选定范围内的卡牌就不用翻了
所以其他的卡牌就需要进行翻面,并且对应的 bb 值必须在选定的范围内,否则跳过
所以现在变成了查询 \(b_i\) 的前后缀 \(RMQ\)
总复杂度是 \(O(nlogn)\)

\(D1T3\) 图函数
一道神仙题,我还不会。

\(D2T1\)
给定长度为 \(n\) 的序列,请找出一个数对 \((i,j,k)\) 使得 \(ans=(a_i+a_j)\%a_k\) 最大,输出 \(ans\)
枚举 \(k\),将原数组分为 \(\leq\frac{n}{2}\)\(\ge \frac{n}{2}\) 两部分,答案很显然有三种情况
1.小于部分中最大值和次大值之和
2.大于部分中最大值和次大值之和\(-a_k\)
3.对于大于部分中的每个 \(a_i\%\ k\),在小于部分中找到最大的加和不大于 \(a_k\)\(a_j\) ,两个加和
优化:按照 \(a_i\) 从大到小枚举 \(k\) 。记录当前答案,如果答案大于等于当前 \(a_k\) ,直接输出。
优化之后复杂度能变为 \(O(nlognlogV)\) (\(V\)->值域) 我不会证,具体请看这里

\(D2T2\)
我不是很会,口胡
按照 \(p\) 进行重编号,原题变为求 \(x\)\(y\) 路径上的最长的 \(1,2,3,···,\) 的序列的长度。
可以对每个点预处理出向上的序列, \(x\)\(lca\) 二分查询即可。 \(lca\)\(y\) 我暂时还不会
具体想法还是看这里qwq

\(D2T3\)
看数据范围就是状压,考试时候搞了个 \(O(n!\times n)\) 得了60分
可以双向搜索搞掉,没必要。状压还不会呢qwq

posted @ 2021-05-06 20:29  Van-Helsing  阅读(84)  评论(0)    收藏  举报