思路:
如果s[0][i] == '1', 那么过(0,i)画一条斜率为-1的线,在线下方的字符全为'1',故从右往左遍历,用last变量存当前遍历过的最左的1的位置
代码:
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int maxn = 3e5 + 5;
int a[maxn];
string s;
void solve(){
int n, k;
cin >> n >> k;
cin >> s;
int res = 0;
k++;
s = ' ' + s;
int last = n + 1;
for(int i = n; i >= 1; i--){
if(s[i] == '1'){
res += min(n - i + 1, k);
last = i;
}
else{
if(last == n + 1) continue;
int pos = 1 + last - i;
res += max(0LL, min(k, n - i + 1) - pos + 1);
}
}
cout << res << '\n';
}
signed main(){
int T;
cin >> T;
while(T--){
solve();
}
return 0;
}
这篇文章描述了一段C++代码,解决了一个问题:给定一个字符串s,当遇到字符1时,在其下方画一条斜率为-1的线,然后计算在k次操作后,线下方1字符的数量。代码通过遍历和计算得到结果。

被折叠的 条评论
为什么被折叠?



