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)$