ALL:6
AC:4
补题:1
题解:Codeforces Round #800 (Div. 2) A - D
B. Paranoid String
题意:对一个字符串,有以下两种操作:
-
将子串 01 替换为 1
-
将子串 10 替换为 0
t t t 组数据,每组给定一个长度为 n n n 的 01 串 S S S 。求 S S S 的子串个数,满足经过若干次操作,可将该子串长度变为 1 1 1 。
1 ≤ t ≤ 1000 , 1 ≤ n ≤ 2 × 1 0 5 , ∑ n ≤ 2 × 1 0 5 1\le t\le 1000,1\le n\le 2\times 10^5,\sum n\le 2\times 10^5 1≤t≤1000,1≤n≤2×105,∑n≤2×105
思路:关键是要找到性质。
AC代码:https://codeforces.com/contest/1694/submission/163125036
C. Directional Increase
题意:
对于一个初始全部元素为 0 0 0 的序列,放置一个指针在第一位,定义如下两种操作:
- (当指针不在最后一位时)指针指向的当前元素加一,指针右移一位。
- (当指针不在第一位时)指针指向的当前元素减少一,指针左移一位。
需要保证操作结束时指针回到第一位。如下面例子:
⟨
0
‾
,
0
,
0
,
0
⟩
→
⟨
1
,
0
‾
,
0
,
0
⟩
→
⟨
1
‾
,
−
1
,
0
,
0
⟩
→
⟨
2
,
−
1
‾
,
0
,
0
⟩
→
⟨
2
,
0
,
0
‾
,
0
⟩
→
⟨
2
,
0
‾
,
−
1
,
0
⟩
→
⟨
2
‾
,
−
1
,
−
1
,
0
⟩
\langle\underline{0}, 0,0,0\rangle \rightarrow\langle 1, \underline{0}, 0,0\rangle \rightarrow\langle \underline{1},-1,0,0\rangle \rightarrow\langle 2, \underline{-1}, 0,0\rangle \rightarrow\langle 2,0, \underline{0}, 0\rangle \rightarrow\langle 2, \underline{0},-1,0\rangle \rightarrow\langle\underline{2},-1,-1,0\rangle
⟨0,0,0,0⟩→⟨1,0,0,0⟩→⟨1,−1,0,0⟩→⟨2,−1,0,0⟩→⟨2,0,0,0⟩→⟨2,0,−1,0⟩→⟨2,−1,−1,0⟩
则最后得到的 ⟨ 2 ‾ , − 1 , − 1 , 0 ⟩ \langle\underline{2},-1,-1,0\rangle ⟨2,−1,−1,0⟩ 就是合法的,每次给定一个序列,问给定序列是否合法。
思路:找性质。排除后导零后,考察每一个后缀 [ i , n ] [i,n] [i,n] 后缀和 s i s_i si,有效情况为 s i < 0 s_i<0 si<0 。因为,只考虑从 i i i 跳到 i + 1 i+1 i+1 和从 i + 1 i+1 i+1 跳到 i i i ,分数是刚好抵消为 0 的,对后缀和影响为 0 。考虑 [ i + 1 , n ] [i+1,n] [i+1,n] 内的跳跃,对后缀和也是影响为 0 。但从 i i i 跳到 i − 1 i-1 i−1 (必然有这样的跳跃,因为要回到原点)时,后缀和就会减 1 。这样后缀和必须满足 s i < 0 ( i > 1 ) s_i < 0(i>1) si<0(i>1) 。特殊的, s 1 = 0 s_1=0 s1=0 。
AC代码:https://codeforces.com/contest/1694/submission/163125833
D. Fake Plastic Trees
题意: t t t 组数据,每组给定一个 n n n 个结点的树, 根为 1 1 1 ,给定 2 , 3 , … , n 2,3,\ldots ,n 2,3,…,n 的父结点 p 2 , p 3 , … , p n p_2,p_3,\ldots ,p_n p2,p3,…,pn 。再给出每个点权值 a i a_i ai 的范围 [ l i , r i ] [l_i,r_i] [li,ri] 。
初始每个点的权值均为 0 0 0 。每次操作可以选择从 1 1 1 开始的树上路径 b 1 , b 2 , … , b k b_1,b_2,\ldots,b_k b1,b2,…,bk (不一定要在叶子处结束),将 a b i a_{b_i} abi 加上 c i c_i ci ,其中 { c i } \{c_i\} {ci} 是一个 非负单调非减 的 整数 数列。
问至少多少次操作,可以令所有点点权均在 [ l i , r i ] [l_i,r_i] [li,ri] 范围内。
1 ≤ t ≤ 1000 , 2 ≤ n ≤ 2 × 1 0 5 , ∑ n ≤ 2 × 1 0 5 , 1 ≤ p i < i , 1 ≤ l i ≤ r i ≤ 1 0 9 1\le t\le 1000,2\le n\le 2\times 10^5,\sum n\le 2\times 10^5,1\le p_i<i,1\le l_i\le r_i\le 10^9 1≤t≤1000,2≤n≤2×105,∑n≤2×105,1≤pi<i,1≤li≤ri≤109
思路:首先,叶子节点必须加 1 次。然后,贪心的想,对每个结点,其子树中的每个点的权值都要尽量接近上界 l l l ,让祖先节点都有更多的操作空间。对每个点,累加子树的贡献上界,如果小于当前节点下界,那么在当前节点必须加一次,且最多的加到上界。另外如果大于上界,要和上界取最小值。
AC代码:https://codeforces.com/contest/1694/submission/163126559
E. Keshi in Search of AmShZ
题意:给定一个 n n n 个点, m m m 条边的有向图,边权为 1 1 1。有一个人初始在点 1 1 1 上,想去点 n n n 。每次你可以执行以下操作中的一个。
1)删除一条边
2)告诉那个人可以走了,那个人会随机的选择一条边走。
现在需要你找到最少的操作 d d d ,使得最多经过 d d d 次操作,这个人可以到达点 n n n 。
题解:Codeforces Round #800 (Div. 2) D(dp) E(最短路)
思路:问题转化一下,就是:我们删了 x x x 个边后,从 1 到 n 的最长路为 y y y ,人会走最长路,则操作数为 x + y x+y x+y 。求 x + y x+y x+y 的最小值。
定义 d i s u dis_u disu 为 u u u 到 n n n 的最短路,然后倒着推。详细的看题解即可。
不是很懂为什么倒着求,感觉正着求也可以,但是没思路。倒着求的原因可能是,当人位于某一点时,会走最长路,也就是在当前点的决策与后继点有关,所以要倒着推。
AC代码:https://codeforces.com/contest/1694/submission/163169533