模拟测试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)$

原文地址:https://www.cnblogs.com/hz-Rockstar/p/11566629.html