题目地址:点击打开链接
思路:
普通的方法从左到右枚举翻转n^2复杂度会超时。
用白书上的维护记录区间的翻转次数,可以达到nlogn复杂度。
代码:
#include<iostream>#include<cstdio>#include<cstring>using namespace std;const int maxn = 1e5+5;char str[maxn];int k, m, a[maxn], f[maxn];bool solve(){ memset(f, 0, sizeof(f)); int res = 0, sum = 0, len = strlen(str); for(int i = 0; i < len; i++) a[i] = str[i]-'0'; for(int i = 0; i+k-1 < len; i++) { if((a[i]+sum)%2) { res++; f[i] = 1; sum++; } if(i-k+1 >= 0) sum -= f[i-k+1]; } for(int i = len-k+1; i < len; i++) { if((a[i]+sum)%2) return 0; if(i-k+1 >= 0) sum -= f[i-k+1]; } return res <= m;}int main(void){ int t; cin >> t; while(t--) { scanf("%d%d", &k, &m); scanf(" %s", str); puts(solve() ? "YES" : "NO"); } return 0;}
新闻热点
疑难解答