Codeforces Round #801 (Div. 2) and EPIC Institute of Technology
ALL:6
AC:3
补题:2
C. Zero Path
题意:给你一个 n × m n \times m n×m ( 1 ≤ n , m ≤ 1000 1 \le n, m \le 1000 1≤n,m≤1000) 的格点图,每个格子的值要么是 − 1 -1 −1,要么是 1 1 1,现在问你,是否有一条从 ( 1 , 1 ) (1, 1) (1,1) 到 ( n , m ) (n, m) (n,m) 的路径,使得路径上经过的格点的值的和为 0 0 0。在路径中,只能向右或是向下走。
思路:首先,如果起点终点曼哈顿距离为奇数,无解。否则,维护起点到每个点的路径权值的上界和下界,如果最终点的值域包含 0 的话,有解。因为我们可以尝试微调路径,使得路径的变化量为 2 。那么值域内的与下界相差为偶数的都能达到。
AC代码:https://codeforces.com/contest/1695/submission/161088615
D1. Tree Queries (Easy Version)
D2. Tree Queries (Hard Version)
题意:给定一棵无根树,有 n ( n ≤ 2 × 1 0 5 ) n(n\leq 2\times 10^5) n(n≤2×105) 个顶点。在这棵树上有一个顶点 x x x ,你希望找到它。
要找到 x x x ,你可以进行 k k k 次查询 v 1 , v 2 , … , v k v_1 , v_2 ,\ldots , v_k v1,v2,…,vk (其中 v i v_i vi 是树中的各个顶点)。当你进行完所有查询后,你会得到 k k k 个数字 d 1 , d 2 , … , d k d_1 , d_2 ,\ldots , d_k d1,d2,…,dk ,( d i d_i di 是 v i v_i vi 和 x x x 之间的最短路径上的边数)。注意,您知道哪个距离对应于哪个查询。
请你求出最小的 k k k ,使存在这样的一些查询 v 1 , v 2 , … , v k v_1 , v_2 ,\ldots , v_k v1,v2,…,vk ,让你总能找到唯一的一个节点 x x x (无论 x x x 是什么)。
注意,你不需要输出这些查询。
题解:(Codeforces801Div2)D2.Tree Queries(Hard Version)(思维+贪心)
Codeforces Round #801 (Div. 2) and EPIC Institute of Technology Round A - D
思路:由题解可知必然存在最优解:查询的点全部都是叶子节点。(不知道为啥,很迷)。而且必须满足,以某个点为根时,最多只有一颗子树内没有查询点。所以我们有两解:
- 从每个叶子节点 dfs ,搜到分叉节点(即度大于 2)停止,如分叉节点之前未搜过,则标记为搜过;否则,答案加一。这样可以保证 n n n 棵子树有 n − 1 n-1 n−1 棵有查询点。
- 随便钦定某度数大于 2 的点为根 dfs 跑树形 DP,公式为 f ( u ) = max ( x − 1 , 0 ) , x = ∑ [ f ( v ) = = 0 ] f(u)=\max(x-1,0),x=\sum[f(v)==0] f(u)=max(x−1,0),x=∑[f(v)==0]
AC代码:https://codeforces.com/contest/1695/submission/163181085