T1
首先枚举正方形左上角的坐标 (i,j)(i,j)(i,j),求出右下角坐标 (i+m−1,j+m−1)(i+m-1,j+m-1)(i+m−1,j+m−1),判断错误的像素点是否在这里面即可。
要注意,右下角坐标不能超出大正方形。
时间复杂度:O(n2)O(n^2)O(n2)
Code:
T2
注意:要么全文单面打印,要么全文双面打印,不能混合!
单面打印的价格是很显然的:a×m+c×(n−m)a \times m + c \times (n-m)a×m+c×(n−m).
考虑双面打印的价格。
显然,双面打印一定是这样打印的:(1,2),(3,4),...(1,2),(3,4),...(1,2),(3,4),...,其中,我们只需要在 1,3,5,...1,3,5,...1,3,5,... 这些位置花钱就好了。
所以使用 unordered_set\texttt{unordered\_set}unordered_set 记录需要花钱的位置。
思考如何求解价格。
令 unordered_set\texttt{unordered\_set}unordered_set 的大小为 SSS,我们需要双面打印 TTT 次,可以得到:T=⌊n+12⌋T=\lfloor \cfrac{n+1}{2} \rfloorT=⌊2n+1 ⌋.
需要彩色打印的只有 SSS 个位置,而其他 T−ST-ST−S 个位置都可以使用黑白打印。
取最小值即可。
时间复杂度:O(m)O(m)O(m)
Code:
T3
暴力就不说了。
注意到每一次移动,只会在横坐标与纵坐标之间的一个修改,而且障碍的坐标不变。所以考虑统计每一个 xxx 坐标所对应的 yyy 坐标们,以及 yyy 坐标所对应的 xxx 坐标们。
由于值域巨大,使用 map\texttt{map}map 存储。
现在我们进行操作。如果我们碰不到障碍,直接修改坐标就好了;如果碰到障碍了,那么我们一定是碰到了第一个在路上的障碍。明显的二分。
随便调一下,然后就过了。
时间复杂度:O(nlog2n+mlog2n)O(n \log^2n+m \log^2n)O(nlog2n+mlog2n)
Code:
T4
暴力是很显然的。直接去掉边再跑搜索。
发现操作只有删除,想到逆序操作就变成了增加。
很显然的并查集,在上面多维护一个集合大小就好了。
注意维护一下合并的顺序,无关删除的直接合并,有关的按照输入的逆序处理,最后答案倒过来输出。
别忘了并查集维护的是集合大小,所以用 nnn 减去集合大小才是答案。
此时还并没有做完。
容易发现,暴力枚举每一个群内的两人关系再合并的时间复杂度过大,所以我们创建 mmm 个虚点编号为 n+1n+1n+1 到 n+mn+mn+m 表示群聊。
这样我们的复杂度就很低了。
注意,虚点的集合父亲为本身,大小初始化为 000。这是因为我们只关心人,而不关心群聊。
时间复杂度:O(qlog(n+m))O(q \log (n+m))O(qlog(n+m))
Code:
T5
明显的 DP。
设 dpi,jdp_{i,j}dpi,j 表示到达 iii 层,目前位于房间 jjj 的最大收获。
状态转移实在太显然了:
dpi,j=max(max1≤k<jdpi−1,k,maxj<k≤mdpi−1,k)+ai,jdp_{i,j}=\max(\max_{1 \leq k < j}{dp_{i-1,k}},\max_{j < k \leq m}{dp_{i-1,k}})+a_{i,j} dpi,j =max(1≤k<jmax dpi−1,k ,j<k≤mmax dpi−1,k )+ai,j
发现可以边跑边记录上一层的最大值,这样转移复杂度就降为 O(1)O(1)O(1) 了。
但是如果上一层的最大值的位置刚好等于 jjj 的话,jjj 房间开不了门。所以我们还要维护一个次大值。
这就很简单了。
时间复杂度:O(nm)O(nm)O(nm)
Code:
T6
大模拟。
首先需要确定 444 个数的运算顺序。可以使用 next_permutation\texttt{next\_permutation}next_permutation 枚举全排列。
三个运算符直接使用三重循环来枚举:000 代表 +++,111 代表 −-−,222 代表 ×\times×,333 代表 ÷\div÷.
设 F(a,i,b)F(a,i,b)F(a,i,b) 表示 a,ba,ba,b 进行 iii 运算符所代表的操作。
运算无非这 555 种:
1. F(F(F(a[0],i,a[1]),j,a[2]),k,a[3])
2. F(F(a[0],i,a[1]),j,F(a[2],k,a[3]))
3. F(F(a[0],i,F(a[1],j,a[2])),k,a[3])
4. F(a[0],i,F(F(a[1],j,a[2]),k,a[3]))
5. F(a[0],i,F(a[1],j,F(a[2],k,a[3])))
字符串输出按照这个写就好。
时间复杂度:O(Kn)O(Kn)O(Kn),其中 KKK 是常数,不超过 800080008000.
Code: