【6.16】Codeforces Round #800 (Div. 2)

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 1t1000,1n2×105,n2×105

题解:CF1694B Paranoid String 题解

思路:关键是要找到性质

AC代码:https://codeforces.com/contest/1694/submission/163125036


C. Directional Increase

题意:

对于一个初始全部元素为 0 0 0 的序列,放置一个指针在第一位,定义如下两种操作:

  1. (当指针不在最后一位时)指针指向的当前元素加一,指针右移一位。
  2. (当指针不在第一位时)指针指向的当前元素减少一,指针左移一位。

需要保证操作结束时指针回到第一位。如下面例子:
⟨ 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,01,0,0,01,1,0,02,1,0,02,0,0,02,0,1,02,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 i1 (必然有这样的跳跃,因为要回到原点)时,后缀和就会减 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 1t1000,2n2×105,n2×105,1pi<i,1liri109

思路:首先,叶子节点必须加 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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值