解法参考评论区大佬,虽然用例全能pass,但有个小疑问,l++使num减少,r++使num增大,这样一来一回的过程会不会让num错过k值?
#include <iostream>
#include <cmath>
using namespace std;
typedef long long ll;
int main() {
ll n, k;
cin >> n >> k;
string s;
cin >> s;
ll l = 0, r = 0; //滑动窗口的左右边界
ll zero = 0, one = 0; //用来记录区间里面0和1的数量
ll num = 0; //01子序列的个数
(s[0] == '0') ? ++zero: ++one; //初始化
while(l < n && r < n) {
if(num == k) {
cout << l+1 << " " << r+1 << endl;
return 0;
} else if(num < k) { //01对太少了则将窗口右边界增大
++r;
if(s[r] == '0') ++zero;
else { //为'1'
num += zero;
++one;
}
} else { //太多了则将窗口左边界增大
if(s[l] == '1') --one;
else {
num -= one;
--zero;
}
++l;
}
}
cout << -1 << endl;
return 0;
}



京公网安备 11010502036488号