首页 > 学院 > 开发设计 > 正文

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

2019-11-06 06:06:44
字体:
来源:转载
供稿:网友

题目地址:点击打开链接

思路:

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


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表