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;
}

浙公网安备 33010602011771号