首页 > 其他分享 >CF1204D2 Kirk and a Binary String (hard version) 题解

CF1204D2 Kirk and a Binary String (hard version) 题解

时间:2023-10-14 22:55:06浏览次数:45  
标签:Binary String 题解 后面 下降 ans 序列 最长

CF1204D2 Kirk and a Binary String (hard version) 题解

分析

先来分析 \(01\) 串的最长不下降子序列。全是 \(0\) 显然是不下降的,如果中间出现一个 \(1\),为了维护不下降的性质,后面就只能全是 \(1\)。一句话概括一下,\(0\) 后面能跟 \(0,1\),\(1\) 后面只能跟 \(1\)。

现在来分析这道题。显然有一种 \(\mathcal O(n^2)\) 的做法。从后往前遍历,如果这一位是 \(1\),就先改成 \(0\),然后用线性 dp 来求他们最长不下降子序列,看有没有改变。具体实现可以用 \(dp[i]\) 表示以 \(i\) 结尾的最长不下降子序列的长度,代码就不放了。

考虑 \(\mathcal O(n)\) 做法。还是得从后往前遍历,但是我们发现,把一位从 \(1\) 改成 \(0\) 会影响最长不下降子序列长度时,当且仅当这以为后面的 \(0\) 的个数比 \(1\) 的个数大。因为当你把一个 \(1\) 改成 \(0\) 时,这个 \(0\) 就可以和它后面的 \(0,1\) 都构成不下降子序列,而原来的 \(1\) 仅仅只能和后面的 \(1\) 来构成。只有后面的 \(1\) 的个数大于等于 \(0\) 的个数时,才不会对最长不下降子序列的长度造成影响。

\(\mathcal O(n)\) 代码

#include <bits/stdc++.h>
using namespace std;
namespace Raiden
{
    signed work()
    {
        string s;
        cin>>s;
        int n=s.size();
        int ans=0;
        for(int i=n-1;i>=0;i--)
        {
            if(s[i]=='0')
            {
                ans++;
            }
            else if(s[i]=='1'&&ans==0)
            {
                s[i]='0';
            }
            else
            {
                ans--;
            }
        }
        cout<<s<<endl;
        return 0;
    }
}
signed main()
{
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    return Raiden::work();
}

标签:Binary,String,题解,后面,下降,ans,序列,最长
From: https://www.cnblogs.com/Ghostwalker/p/17764924.html

相关文章

  • 题解 [ABC258G] Triangle
    题目链接\(\rmO(n^3)\)枚举\(i,j,k\)的算法是显然的。考虑优化掉一个\(n\),如果枚举\(i,j\),那么显然需要找出有多少个\(k\)同时满足\(a_{i,k}=a_{j,k}=1\),我们可以将\(a_i\)和\(a_j\)看作两个二进制数,那么同时等于\(1\)的位置就是并起来等于\(1\)的位置,\(bitset......
  • 观光奶牛 详细题解
    #T3#SPFA判断正/负环#二分查找为啥现在突然发出来:翻自个笔记发现这篇写的挺好hhh361.观光奶牛-AcWing题库给定一张\(L\)个点、\(P\)条边的有向图,每个点都有一个权值\(f[i]\),每条边都有一个权值\(t[i]\)。求图中的一个环,使“环上各点的权值之和”除以“环上各边的......
  • [题解]AT_abc153_f [ABC153F] Silver Fox vs Monster
    模拟赛最后\(15\)分钟想到的做法。思路首先有一个显然的贪心策略:我们放炸弹的地方要尽可能的使这个炸弹能影响到更多的怪上。那么我们可以将对于一个怪\(i\)能够影响到它的区间表示出来\([\max(1,l_i-d),a_i+r]\)。然后将这些区间排个序,可以粗略画出这样的图:根据上......
  • P1084疫情控制 题解
    P1084疫情控制前言:这题思路不难,实现稍微有点难。总体来说,不算特别难的那种紫题,建议评蓝。题目描述给定一些点,用这些点来切断根节点到所有叶子节点的路径,可以移动这些点,不同的点可以同时移动,求时间最少。思考过程不同的点可以同时移动:看到这里,我们可以转化一下题目:给定......
  • [AGC033C] Removing Coins题解
    思路可以看出,每次对一个点\(u\)操作一次,就相当于删除以\(u\)为根的所有叶节点。当然我们还是没有什么思路,我们可以想简单一点:在一条链上的情况。如果\(u\)是链的端点:以\(u\)为根节点的叶节点只有一个,所以链的长度减一。如果\(u\)不是链的端点:以\(u\)为根节点......
  • P1612 [yLOI2018] 树上的链 题解
    思路看到条件\(2\),我们得知:这个节点对应的最长链,一定在这个节点到根节点的简单路径上。所以我们记录\(1\)到\(i\)之间的权值和,记为\(sum_i\)。因为权值是正整数,所以满足单调性,可以二分。如何二分路径上的点呢?我们维护一个与当前dfs同步的栈,记录从根节点到当前节点的简......
  • [ARC116C] Multiple Sequences题解
    思路我们可以很好的想到一种\(O(nm)\)的dp:状态:\(dp_{i,j}\)为搜到第\(i\)个,最后一个数是\(j\)的方案数。转移:\(dp_{i,j}=\displaystyle\sum_{k|j,k\not=j}dp_{i-1,k}\)当然这是会超时的。我们换一种思路,我们先枚举最后一个数,再计算方案数。这有个好处,我们缩小......
  • Binary Tree Postorder Traversal
    SourceGivenabinarytree,returnthepostordertraversalofitsnodes'values.ExampleGivenbinarytree{1,#,2,3},1\2/3return[3,2,1].ChallengeCanyoudoitwithoutrecursion?题解1-递归首先使用递归便于理解。C++-Tra......
  • G. Anya and the Mysterious String
    G.AnyaandtheMysteriousStringAnyareceivedastring$s$oflength$n$broughtfromRome.Thestring$s$consistsoflowercaseLatinlettersandatfirstglancedoesnotraiseanysuspicions.Aninstructionwasattachedtothestring.Startoftheins......
  • 苏格拉底问答、实践过程截图、遇到问题解决问题截图,代码链接
    defineVOLUME_NAME"EXT2FS"//卷名#defineBLOCK_SIZE512//块大小#defineDISK_SIZE4612//磁盘总块数defineDISK_START0//磁盘开始地址#defineSB_SIZE32//超级块大小是32BdefineGD_SIZE32//块组描述符大小是32B#defineGDT_START(0+512)//块组描述......