20200223(ABC)题解 by刘少瑞 杨熠辰

 A:
给定一个图,图中有且仅有一个环,输出每个节点到环的距离。
第一遍DFS,标记所有访问点并记录深度,若访问到已标记的点,则该点和它的父节点为环上的点,分别记为u,v
第二遍DFS,从v触发,逆深度一直访问到u,这条路径上所有点即为环
第三遍BFS,将环上所有点距离标为0,并挨个作为起始点进行BFS,求出来到其他点的距离
 
 B:
不难发现,满足下列条件只一时皇后i可以吃掉皇后j
r[i] = r[j]
c[i] = c[j]
r[i] + c[i] = r[j] + c[j]
r[i] - c[i] + n = r[j] - c[j] + n (这里 +n 是为了避免出现负数)
记录一下每 行/列/与对角线平行的直线 上的最左边与最右边的皇后位置,对于每个皇后,判断能否吃掉当前所在 行/列/与对角线平行的直线 两端的皇后即可,统计个数。
即记录所有 r[i]/r[i] + c[i]/r[i] - c[i] + n 相同的皇后中 c[i] 的最 大/小 值,记录所有c[i]相同的皇后中 r[i] 的最 大/小 值。
时间复杂度O(n)

C:
类似于求最大子矩阵的做法。
首先求一个前缀和,用 sum1[i][j] 表示第 j 列的星星数量的前缀和,即
sum1[i][j] = sum1[i - 1][j] + star[i][j]
其中star[i][j]表示第 i 行第 j 列是否存在星星
枚举上下边界 u/d 的同时枚举右边界 i,寻找能使区域内星星数量大于 K 个的左边界数目。
具体做法为枚举 u/d 的同时再维护一个前缀和 sum2,用 sum2[i] 表示从 (u, 1) 到 (d, i) 范围内的星星数目,由于,那么我们只要是找到 sum2 中小于等于 sum2[i] - k 的数的个数就行了。
由于前缀和递增,可以二分查找。
时间复杂度 O(n^3logn)
posted @ 2020-02-24 21:39  浪在ACM  阅读(90)  评论(0编辑  收藏  举报