qduoj 79 翻转游戏(开关问题)

来源:互联网 发布:java replace的原理 编辑:程序博客网 时间:2024/06/06 16:34

题目地址:点击打开链接


思路:

普通的方法从左到右枚举翻转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;}


0 0