依旧云斗集训
Day 1
T1
给定长度为
n 的两个数列\{a_n\},\{b_n\} ,你可以花费1 的代价从两个数列中取出一个数,该操作可以做任意多次。假设最终你一共取了
k 个数,其中从\{a_n\} 中取的数的和为A ,从\{b_n\} 中取的数的和为B ,求:\max\{\min\{A,B\}-k\} 一只老哥。
把
枚举
T2
给定一个初始值域为
[0,n) 的可重集S ,可以进行如下操作若干次:
- 选择一个(可以为空的)子集
T\subseteq S ,T 中元素不可重。- 从
S 中删掉T (重复元素只删一个)。- 把
\operatorname{mex}(T) 放进S 。求最少进行多少次能使
n\in S 。给定
S 的方式是对于i\in [0,n) ,每个i 在S 中有f_i 个。
正序递推是
倒着找到最后一个
于是我们继续向前,设
T3
数轴上有
n 个点,有m 次加点操作,每个点的移动速度是1 单位长度每秒。每次加点操作后,输出所有点间距
\ge D 的最小时间。一只老哥。
考虑任意两点之间的最优走法一定是相向而行,并且最终的相对位置关系一定与初始时无异,所以对于答案
移项得:
用线段树维护
可以标记永久化,也可以直接区间加 tag,一只老哥。
T4
待补。
Day 2
T1
给定长为
n 的数列\{a_n\} ,找长度最小的区间[l,r] ,满足在i\in [0,l)\cup(r,n] 中a_i 没有重复的数。
显然可以双指针,找到最大的
T2
给定长为
n 的数列\{a_n\} ,选择一个区间[l,r] 区间加上d\in[-x,x] ,求\{a_n\} 的最长上升子序列。一只老哥。
假设
则我们算前缀的 LIS,后缀的 LIS,枚举一下分界点在哪里就好了,一只老哥。
T3
这我怎么形式化题意??
你有
1\times 1\times1 和2\times1\times1 的乐高积木若干,你需要搭一个w\times h\times 1 的一堵墙,有多少种情况是这堵墙是锁死的。w\cdot h\le 2\times10^5
O(w^2) sol
显然锁不死的情况是这堵墙能够被纵向分割,所以记
其实这个东西可以直接上多项式科技就做完了。
O(wh^2) sol
考虑锁死的充要条件,显然是每一条接缝处都得有长为
正解
平衡复杂度即可做到
T4
待补。
Day 3
T1
给定长度为
n 的数列\{a_n\} ,以及一个折扣系数q 。把
\{a_n\} 中的元素分成若干组,用集合T_1,T_2,T_3,\cdots 表示。
- 若
|T_i|\ge 3 ,则令T_i 中最小的元素变为0 。- 若
|T_i|<3 ,则令T_i 中元素变为原来的1-q 倍。你需要最小化分组后所有组内元素和。
如果你想要免费那一档,那分的组的大小显然不可能超过
然后注意到免费那一档一定是选值域上连续的三个数,微扰即证。
所以排个序后 dp 即可,状态转移方程为:
一只老哥,瓶颈在于排序。
T2
Lottery
T3
给定平面内
n 个点,问有多少个点对(a,b),(c,d) 满足:a<c\\b<d\\\not\exist(e,f),e\in(a,c),f\in(b,d) 两只老哥。
考虑 cdq,把所有的点的第二维从
主定理分析时间复杂度两只老哥。
T4
待补。
Day 4
T1
给定长为
n 的排列\{p_n\} ,定义二元函数w(i,j) 的定义域满足i<j ,则:w(i,j)=|p_i-p_j|\cdot|i-j| 取
w(i,j) 前k 小的和。k<n
因为
若
所以原排列直接向前扫
用 nth_element 是
T2
有
m 个形如\oplus_{i=l}^ra_i=x 的限制,判断是否存在一个满足条件的数列。
转成前缀异或,然后二进制拆分。
用扩展域并查集维护相对关系即可,两只老哥。
T3
给定一个长为
n 的环,第i 个位置上有数a_i 。有多少种分割方案,满足分割出来的每一段的按位与都不为
0 。一只老哥。
考虑破环为链,直接计算怎么做。
对于单次 dp,可以做到
如何不重不漏的计算所有情况?可以考虑每次算完之后,直接
这时你注意到整个 dp 实际上仅关心
最后你考虑每次 dp 的时候都求一遍 st 表是没有必要的,因为我们仅会改变
T4
是个好题。
Day 5
T1
给定
L,D ,有长为m 的数列\{a_m\} ,与长为n 的数列\{b_n\} 。从
\{a_m\} 中取出尽可能多的没有交的递增子序列,满足相邻两项差值\le D ,且最小值\le D ,且最大值\ge L+1-D 。记上述问题答案为
t ,则从\{b_n\} 中取出n-t 个数最小是多少。
首先是一些观察,取出来的
然后考虑怎么做,我们二分答案
于是二分答案是没有必要的,直接把 set 中维护然后暴力删点即可,一只老哥。
T2
给定长为
n 的数列\{a_n\} ,求该数列的极长区间[l,r] ,满足存在x,y 且x\ge2 ,i\in[l,r] 内的所有a_i\bmod x=y 。输出最长长度。
鉴定为典完了。
直接差分取绝对值,然后从差分数组中找到最长的
T3
好题。
给定长为
n 的01 数列,你最多可交换k 对位置,要求最后相邻两个1 的间隔不能>m ,特别的,我们把位置0 与位置n+1 钦定为1 。n\le2\times10^5,k\le200
暴力配对是不可做题,考虑怎么转化题意。
显然你不会交换
- 选择
B 个位置从0\to 1 ; - 选择
B 个位置从1\to 0 。
这个东西看起来就很可以 dp 的样子,所以我们开始设状态。设
优化啊优化,dp 有一个非常经典的优化就是把可行性 dp 转化成最优化 dp,即把 dp 的某一维状态丢进答案中进行转移。
由于我们想要的时间复杂度应该是
预处理出每个位置
最后对于每个状态判断一下是不是满足条件就做完了,转移
T4
待补。
Day 10
T1
给定集合
S ,你可以进行如下操作若干次:
- 选择
x,y\in S ,把x\operatorname{bitand} y 放进S 中;- 选择
x,y\in S ,把x\operatorname{bitor} y 放进S 中。保证
S 中初始时的元素<2^k ,你需要对于[0,2^k) 中的每个数判断最终其是否可以通过若干次操作使其进入S 中。
挺好的题。
考虑
那么我们可以先跑出仅通过
对于前者,我们考虑高位前缀和的过程,显然把一个子集内的所有数都或起来一定是不劣的,所以我们记
把
T2
不可做题
T3
给定一棵
n 个节点的树,根节点为1 ,每个点有点权,每次询问给定c ,需要从该节点走向一个点权大于等于c 且最小的儿子,你需要输出最终在哪里不能走了。可以对点权进行修改。
两只老哥。
这真是何意味题目。
考虑这是一条链怎么做,显然二分一下,限一下下界与上界就能知道最远跳到哪里了。
那,直接剖,就是
何意味?
T4
定义一个数列是好的当且仅当:
- 相邻两个数的差的绝对值等于
1 。- 中间的数大于等于相邻两个数的算数平均数。
给定长为
n 的数列a 和v ,每次你可选择a 的一段好的字串,假设其为[l,r] ,将其删掉,你得到v_{r-l+1} 的价值。你可进行若干次这样的操作,不要求最终把数列删干净,最大化你能得到的价值。
这为什么放 T4?
考虑区间 dp,设状态
你考虑什么是个好的串,显然是一个单峰,且相邻两个相差
除了
时间复杂度