zoukankan      html  css  js  c++  java
  • 信奥题库8月提高组线上模拟赛题解

    (A)

    (10pts)

    暴力即可。

    (50pts)

    发现这就是一条链的情况,也就相当于本题搬到了序列上。

    根据后缀最大值的定义,不难发现序列上的后缀最大值的权值是递减的,而且后缀最大值的位置是递增的,这启发我们用单调栈维护所有后缀最大值。

    具体的,单调栈内按权值递减的维护元素,当加进当前位置的元素时,所有权值小于它的栈内元素都不再是后缀最大值,将他们全部从栈内弹出。

    最后单调栈内剩下的权值都是后缀最大值,时间复杂度(O(n))

    (100pts)

    树可以看做一些链并在一起,所以我们只需要对树进行(Dfs),即可将树上问题变成序列上的问题。

    然而树上(Dfs)就要求我们每次将一个元素加进单调栈,还要支持在(Dfs)回退的时候对单调栈上一次的操作进行撤销。

    这样每次将一个元素加进单调栈的时候,我们二分出应该将它加进的位置。将该位置上的元素放到栈最后的缓冲区,将栈顶标记为当前位置。

    同时再开一个新的栈,维护每次操作之前的栈顶位置,这样撤销的时候,只需要把缓冲区最上面的元素放到这个位置,再把栈顶设置为记录的位置即可。

    时间复杂度(O(nlogn)),二分的常数极小,可以通过本题。

    (B)

    (30pts)

    (n^2)枚举所有区间算出最大值和最小值则可以通过本部分分。

    (60pts)

    每次找区间的(max)算包含它的区间的贡献,然后递归两边。

    考虑(max)一定时,(min)的值也是一定的。

    这样枚举区间右端点,维护从(max)的位置到右端点的最小值。

    如果最小值小于需要的值则无解。

    如果最小值等于需要的值,那左端点到(max)的位置的最小值要大于等于需要的值。

    如果最小值大于需要的值,那左端点到(max)的位置的最小值要等于需要的值。

    这就相当于建立了一颗笛卡尔树,复杂度在随机数据下是(O(nlog_2{n}))

    (100pts)

    将题目所给式子变形,有

    [max + min = k ]

    [max = k - min ]

    [max = k + max_{l <= i <= r}(-a_i) ]

    [max = max_{l <= i <= r}(k - a_i) ]

    所以现在只要找出(max)(max(k - a_i))相等的区间即可。

    考虑维护单调栈,每次将(a_i)(k - a_i)分别加入栈中,颜色分别为(1)(2),权值为(w),位置为(pos)

    那么如果有权值相等且颜色相等的元素前面一个肯定不如后面一个有用,直接把前面的弹出。

    如果有权值相同颜色不同的相邻元素,以靠近栈顶的(pos)作为区间的右端点,这样的区间有远离栈顶的元素的(pos)减去他下面的元素的(pos)个。

    因为维护的单调栈里的元素的(w)是递减的,所以要维护栈内所有元素贡献总和,每次加入元素就相当于
    区间右端点右移一位,答案加上栈内所有元素贡献。

    删去元素的时候消去该元素产生的贡献即可。

    (C)

    (30pts)

    直接暴力按照题意计算答案即可。

    (90pts)

    考虑每个询问对答案的贡献。

    设块大小为(B).

    如果(l/B=r/B)那么就给(B)的答案加上(r-l+1)

    否则答案加上(r / B - l / B - 1 + (r mod B) + 1 + B - (l mod B))

    那这样就可以对每个询问枚举块大小(B),根据整除分块本质不同的贡献有(sqrt n)种,这样就能做到(q sqrt n)

    (100pts)

    考虑如果不进行分块进行暴力计算,没有一个([l, r])的询问,会进行(r - l + 1)次遍历。

    如果分了块则会减少((B - 1) imes)覆盖的块数次遍历。

    那么只要对每个询问算出覆盖了多少个块就行。

    如何算一个块被多少询问覆盖?我们只需要将所有询问加进树状数组,用块左端点左边的询问左端点减去块右端点左边的询问右端点即可。

    注意到如果有一个询问被一个块包含会出(bug),所以我们从大到小枚举块大小,每次只把左右端点不在同一个块里的询问加进树状数组即可。

    如果一个大的块不能完全包含一个询问,那么一个更小的肯定也不能。

    枚举完块大小之后要枚举块的左右端点,每次是(n / B)的复杂度,总共是(sum_{B = 1}^n n / B)的,由数学知识可知这是个调和级数,复杂度是(O(n log n))

    这样复杂度是(O(n log^2 n))

  • 相关阅读:
    spring cloud项目搭建
    获取iframe的window对象
    数学杂谈 #7
    [AGC023D] Go Home
    JOISC 2021 部分题解
    [NOI2017]泳池
    [NOI2016] 循环之美
    [NOI2016] 优秀的拆分
    [LG P3676]小清新数据结构题
    [ARC113F]Social Distance
  • 原文地址:https://www.cnblogs.com/Tian-Xing-Sakura/p/13604277.html
Copyright © 2011-2022 走看看