cf1204 D2. Kirk and a Binary String (hard version)(思维)

题意:

给定01串s,尽量把1改成0,要求所有子区间的LIS长度与原串相等。

思路:

若一个子区间 \([l,r]\) 的LIS是一个全1串,那么把 \(s_l\) 从1改成0无影响。若LIS是全0串或者先0后1,则把 \(s_l\) 从1改成0会让LIS长度+1。

从后往前遍历,只有当以 \(i\) 开始的所有区间的LIS均是全1串,即区间中1的个数严格大于0的个数时,才能把 \(s_i\) 从1改成0

#include <bits/stdc++.h>
using namespace std;

signed main()
{
    string s; cin >> s;

    int cnt = 0;
    for(int i = s.size() - 1; i >= 0; i--)
    {
        if(s[i] == '0') cnt++;
        else if(cnt) cnt--;
        else s[i] = '0';
    }

    cout << s;

    return 0;
}

posted @ 2022-01-15 18:32  Bellala  阅读(39)  评论(0)    收藏  举报