感谢 @AAA混泥土批发ppl哥 让我喜提干儿子 @dream_陆军展览 和 @AAA水泥批发BaiRX哥(
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
T1
个人难度:红上
设 n=m×10k(1≤m≤10n=m\times 10^k(1\le m\le 10n=m×10k(1≤m≤10,m,km,km,k 均为正整数))),
则 n=m×2k×5kn=m\times 2^k\times 5^kn=m×2k×5k,kkk 为 nnn 的位数 −1-1−1。
所以我们只需要看 mmm,即 nnn 的首位,能被 222 的几次方整除即可。
我们可以用 __builtin_ctz 来实现。这个函数可以统计一个数转换成 222 进制后末尾 000 的数量。
时间复杂度:O(∣n∣+logw)O(|n|+\log w)O(∣n∣+logw),其中 w=32w=32w=32。
T2
个人难度:橙下
先放代码。
诶,这时就有酮穴要问了,这个代码怎么不会 TLE 啊?
我们分析一下时间复杂度,发现瓶颈在遍历边判断是否相同的操作。
显然,一个点遍历的次数就是它的度数。而我们又知道无向图所有点的度数之和是边的数量的 222 倍,所以不会 T。
时间复杂度:O(n)O(n)O(n)。
T3
个人难度:橙中
01 背包板子,不作解释。注意 dp 数组大小。
挑战赛已经水成这样了吗
时间复杂度:O(nm)O(nm)O(nm)。
T4
个人难度:橙上/黄下
依旧 01 串。依旧修改左 0 右 1。依旧 10610^6106。
由于连续相同的数对最小值没有影响,所以为了简化,将字符串压缩。如 11000111100101,就压缩成 1010101。
我们先统计一下每个 1 的贡献:
* 在一个中间部分的 1,会贡献两个那啥。
* 在边上的 1,会贡献一个。
而一次操作可以将两个中间的 1 合并,使那啥 −2-2−2,所以当操作数没那么充足时,答案为初始的那啥 −2m-2m−2m。
而当 mmm 足够大可以使 01 串只有一个中间的 1 (类似 10101)时,我们还可以额外进行操作:
1. 将中间的 1 与左边的进行合并,当最左边有 1 时,那啥 −2-2−2,否则那啥 −1-1−1。
2. 将左边的 1 与右边的进行合并,那啥 −1-1−1。
代码如下:
时间复杂度:O(n)O(n)O(n)。
T5
个人难度:黄中/上
不是哥们,为啥大家的难度都比我低啊
这个题目可以如下转化:
给定一个数列 AAA,初始值为 −∞-\infty−∞,
给定 nnn 个区间,你要对 AAA 进行 nnn 次操作,每次将 Aj(Li≤j≤Ri)A_j(L_i\le j\le R_i)Aj (Li ≤j≤Ri ) 赋值为 min{Aj,Xi}\min\{A_j,X_i\}min{Aj ,Xi },
接下来询问每个区间的左端点的值。
由于 Li,Ri≤109L_i,R_i\le 10^9Li ,Ri ≤109,过于巨大,所以考虑离散化,使 Li,Ri≤2nL_i,R_i\le 2nLi ,Ri ≤2n,然后将区间按 LiL_iLi 排序。
接下来枚举每个 AjA_jAj ,用个小根堆记录当前区间 XiX_iXi 的最小值,如果有区间的 LiL_iLi 就加入堆,如果堆顶的区间不包含 jjj 了,直接删除。
但是现在,就有销货般要问了:那这样也没有把离开的区间删干净啊!
你先别急,仔细思考什么时候区间才会对 AjA_jAj 发挥贡献:一定是 XiX_iXi 最小的时候!所以 XiX_iXi 不是当前在堆中最小的时,可以暂时不用管他。
这就是 "Lazy Delete" 思想!
代码如下。
时间复杂度:O(nlogn)O(n\log n)O(nlogn)。
题外话:受ppl邀请打了一下这个OJ的CSPS模拟赛,T1 我就是用的这种方法,结果题解是:
T6
个人难度:橙上
很版的差分,最水的一集。
由于是整体偏移,所以考虑操作 111 直接在原字符串上偏移后进行操作。例如字符串长度 777,当前修改区间 [1,5][1,5][1,5],偏移量 333,则在原字符串修改的区间为 [6,7][6,7][6,7] 和 [1,3][1,3][1,3]。
注意最后输出时也得偏移。
时间复杂度:O(n+q)O(n+q)O(n+q)。