• 模拟测试49


    T1:

      题意:

        求区间取模后的最大值。

      题解:

        我的思路有些清奇。

        标算分块,预处理出每个块对于所有K取模后的最大值,然后分块暴力找即可。

        时间复杂度$O(Nsqrt{Nln N})$

        我的思路是对于K分情况。

        当K<=50时,用st表暴力找,开50是因为内存实在不够了

        对于其他情况,暴力搜索所有形如$[aK,(a+1)K)$的区间,主席树上dfs找出区间最大值,需要剪枝

        如果复(shu)杂(ju)度(hen)优(shui)秀的话,就可以AC了。

        时间复杂度$O(Nlog_2Nsqrt{N})$

    T2:

      题意:

        坐标系内有N个点,求满足以下条件的折线数,对1e9+7取模。

        对于折线经过的点(x1,y1),(x2,y2)......(xk,yk)。

        $forall j in (1,k]   y_j < y_{j-1}$

        $forall j in (2,k]   x_{j-2} < x_j < x_{j-1}    or   x_{j-1} < x_j < x_{j-2}$

      题解:
        考虑对于x进行DP,现将所有点按照x排序。

        设dp[i][0/1]为目前在第i个点,下次折线向左/右延伸的方案数。

        从左到右枚举所有点,然后倒序枚举之前的点。

        当前节点可以和之前所有纵坐标大于它的点连边。

          $dp[j][1]+=dp[i][0] (y_j > y_i)$

        之前所有纵坐标小于当前节点的点可以和它连边连边。

          $dp[i][0]+=dp[j][1] (y_j < y_i)$

        因为自下而上横坐标跨度不断增大,所以要倒序枚举第二维保证正确性。

        时间复杂度$O(N^2)$

    T3:

      题意:

        给一个0/1矩阵,初始时有有一个全0矩阵,每次可以将任意个四连通的0/1连通块染色,求最少多少次操作后能得到目标矩阵。

      题解:

        首先,染色的过程是可逆的,所以我们可以回溯染色过程。

        然后考虑如何染色最优。

        我们设从一点到所有点所经过的0/1边界数的最大值为层数。

        所以每次染色只有消除一层才是最优的,所以要使染色的联通块最大化。

        每次染完一次,该点的层数减一,继续染色,直到层数为0为止,这时矩阵一定为全0的。

        不同点的层数可能是不同的,所以我们求出最小的层数,就是答案。

        枚举每个点,从该点开始进行双端队列BFS,若经过0/1边界,则距离为1,从队尾入队,反之从队头入队。

        到每个点的距离的最大值即为层数。

        注意:因为初始状态是全0,而不是全1,所以在BFS后对所有到1点的距离加1,在取最大值。

        不同点的层数取最小值即为答案。

        时间复杂度$O(n^4)$

  • 相关阅读:
    Java中NIO和IO区别和适用场景
    JDK和CGLIB动态代理原理
    java中的Serializable接口的作用
    redis采用序列化方案存对象
    在时间复杂度为O(n)且空间复杂度为O(1)的情况下翻转链表
    给定一个排好序的数组,然后求出丢失的数字
    求字符串里超过字符长度一半的元素
    求你给定两字符串包含的字母数是否完全一致
    动态规划,求数组不相邻数字的最大子串值
    JWT 工具
  • 原文地址:https://www.cnblogs.com/hz-Rockstar/p/11566629.html
Copyright © 2020-2023  润新知