D - Handstand


Time Limit: 2 sec / Memory Limit: 1024 MB

Score : 400400 points

Problem Statement

NN people are arranged in a row from left to right.

You are given a string SS of length NN consisting of 0 and 1, and a positive integer KK.

The ii-th person from the left is standing on feet if the ii-th character of SS is 0, and standing on hands if that character is 1.

You will give the following direction at most KK times (possibly zero):

Direction: Choose integers ll and rr satisfying 1≤l≤r≤N1≤l≤r≤N, and flip the ll-th, (l+1)(l+1)-th, ......, and rr-th persons. That is, for each i=l,l+1,...,ri=l,l+1,...,r, the ii-th person from the left now stands on hands if he/she was standing on feet, and stands on feet if he/she was standing on hands.

Find the maximum possible number of consecutive people standing on hands after at most KK directions.

Constraints

  • NN is an integer satisfying 1≤N≤1051≤N≤105.
  • KK is an integer satisfying 1≤K≤1051≤K≤105.
  • The length of the string SS is NN.
  • Each character of the string SS is 0 or 1.

Input

Input is given from Standard Input in the following format:

NN KK
SS

Output

Print the maximum possible number of consecutive people standing on hands after at most KK directions.


Sample Input 1 Copy

Copy
5 1
00010

Sample Output 1 Copy

Copy
4

We can have four consecutive people standing on hands, which is the maximum result, by giving the following direction:

  • Give the direction with l=1,r=3l=1,r=3, which flips the first, second and third persons from the left.

Sample Input 2 Copy

Copy
14 2
11101010110011

Sample Output 2 Copy

Copy
8

Sample Input 3 Copy

Copy
1 1
1

Sample Output 3 Copy

Copy
1

No directions are necessary.

题意:

给你一个只含有0和1的字符串,并且给你一个数字K,你可以选择最多K次区间,每一个区间L<=R,然后对这个区间的元素进行取反操作。

即0变成1,1变成0,问你在最聪明的操作之后最大可以获得的连续1的串是多长?

可以看样例解释理解题意。

思路:

我们对字符串的连续1和0串进行计数处理,即把连续的1或者0的个数记录起来,

那么字符串会生成如下的数组

例如字符串是  110000111001101

我们把连续的1和连续0分别放入a和b数组,

那么a的元素是2 3 2 1

b的元素是4 2 1

我们思考可以发现,我们想要最长的连续1串,那么我们处理的区间肯定是连续的0区间,让他们变成1,然后来增长连续1串的长度。

即处理的0区间一定是连续的。

那么我们可以知道如下,例如我们处理两个区间,那么可以的得到的最长的连续1串就是这两个区间的0串长度的sum和以及这两个0串前后和中间的1串的sum和。

那么我们只需要枚举连续的K个的0串即可,

细节见代码:

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <queue>
#include <stack>
#include <map>
#include <set>
#include <vector>
#include <iomanip>
#define ALL(x) (x).begin(), (x).end()
#define rt return
#define dll(x) scanf("%I64d",&x)
#define xll(x) printf("%I64d\n",x)
#define sz(a) int(a.size())
#define all(a) a.begin(), a.end()
#define rep(i,x,n) for(int i=x;i<n;i++)
#define repd(i,x,n) for(int i=x;i<=n;i++)
#define pii pair<int,int>
#define pll pair<long long ,long long>
#define gbtb ios::sync_with_stdio(false),cin.tie(0),cout.tie(0)
#define MS0(X) memset((X), 0, sizeof((X)))
#define MSC0(X) memset((X), '\0', sizeof((X)))
#define pb push_back
#define mp make_pair
#define fi first
#define se second
#define eps 1e-6
#define gg(x) getInt(&x)
#define db(x) cout<<"== [ "<<x<<" ] =="<<endl;
using namespace std;
typedef long long ll;
ll gcd(ll a,ll b){return b?gcd(b,a%b):a;}
ll lcm(ll a,ll b){return a/gcd(a,b)*b;}
ll powmod(ll a,ll b,ll MOD){ll ans=;while(b){if(b%)ans=ans*a%MOD;a=a*a%MOD;b/=;}return ans;}
inline void getInt(int* p);
const int maxn=;
const int inf=0x3f3f3f3f;
/*** TEMPLATE CODE * * STARTS HERE ***/
int n;
int k;
char s[maxn];
std::vector<int> v1,v2;
ll sum1[maxn];
ll sum2[maxn];
int main()
{
//freopen("D:\\common_text\\code_stream\\in.txt","r",stdin);
//freopen("D:\\common_text\\code_stream\\out.txt","w",stdout);
gbtb;
cin>>n>>k;
cin>>s;
int cnt=;
// int i=0;
if(s[]=='')
{
v1.pb();
}
repd(i,,n-)
{
if(s[i]=='')
{
while(s[i]=='')
{
cnt++;
i++;
}
v2.push_back(cnt);
cnt=;
i--;
}
if(s[i]=='')
{
while(s[i]=='')
{
cnt++;
i++;
}
v1.push_back(cnt);
cnt=;
i--;
} }
int num=max(sz(v1),sz(v2));
repd(i,,maxn-)
{
v1.push_back();
v2.push_back();
}
repd(i,,maxn-)
{
sum1[i]+=sum1[i-]+v1[i-];
sum2[i]+=sum2[i-]+v2[i-];
}
int w=;
ll ans=0ll;
repd(i,,n-k+)
{
int l=i;
int r=l+k;
ll temp=sum1[r]-sum1[l-];
temp+=sum2[r-]-sum2[l-];
ans=max(ans,temp);
}
cout<<ans<<endl; return ;
} inline void getInt(int* p) {
char ch;
do {
ch = getchar();
} while (ch == ' ' || ch == '\n');
if (ch == '-') {
*p = -(getchar() - '');
while ((ch = getchar()) >= '' && ch <= '') {
*p = *p * - ch + '';
}
}
else {
*p = ch - '';
while ((ch = getchar()) >= '' && ch <= '') {
*p = *p * + ch - '';
}
}
}

AtCoder Beginner Contest 124 D - Handstand(思维+前缀和)的更多相关文章

  1. AtCoder Beginner Contest 249 E - RLE // 动态规划 + 前缀和优化

    传送门:E - RLE (atcoder.jp) 题意: 求满足原长为N且转换后长度严格小于N条件的小写字母组成的字符串的数量,输出时对P取模. 其中,转换规则为,将连续相同的字串替换为"字 ...

  2. Atcoder Beginner Contest 124 解题报告

    心态爆炸.本来能全做出来的.但是由于双开了Comet oj一个比赛,写了ABC就去搞那个的B题 还被搞死了. 回来写了一会D就过了.可惜比赛已经结束了.真的是作死. A - Buttons #incl ...

  3. AtCoder Beginner Contest 188 F - +1-1x2 思维题

    题目描述 给你两个数 \(x\),\(y\) 可以对 \(x\) 进行 \(+1,-1\) 或 \(\times 2\) 的操作 问最少操作多少次后变为 \(y\) \(x,y \leq 10^{18 ...

  4. AtCoder Beginner Contest 176 E - Bomber (思维)

    题意:有一张\(H\)x\(W\)的图,给你\(M\)个目标的位置,你可以在图中放置一枚炸弹,炸弹可以摧毁所在的那一行和一列,问最多可以摧毁多少目标. 题解:首先我们记录某一行和某一列目标最多的数目, ...

  5. AtCoder Beginner Contest 154 题解

    人生第一场 AtCoder,纪念一下 话说年后的 AtCoder 比赛怎么这么少啊(大雾 AtCoder Beginner Contest 154 题解 A - Remaining Balls We ...

  6. AtCoder Beginner Contest 177 题解

    AtCoder Beginner Contest 177 题解 目录 AtCoder Beginner Contest 177 题解 A - Don't be late B - Substring C ...

  7. KYOCERA Programming Contest 2021(AtCoder Beginner Contest 200) 题解

    KYOCERA Programming Contest 2021(AtCoder Beginner Contest 200) 题解 哦淦我已经菜到被ABC吊打了. A - Century 首先把当前年 ...

  8. AtCoder Beginner Contest 100 2018/06/16

    A - Happy Birthday! Time limit : 2sec / Memory limit : 1000MB Score: 100 points Problem Statement E8 ...

  9. AtCoder Beginner Contest 052

    没看到Beginner,然后就做啊做,发现A,B太简单了...然后想想做完算了..没想到C卡了一下,然后还是做出来了.D的话瞎想了一下,然后感觉也没问题.假装all kill.2333 AtCoder ...

随机推荐

  1. Oracle游标的使用示例

    此文是使用Oracle游标的几种方式,for...in会自动打开游标,fetch...into需要手动打开游标,游标类似于一个只会往前移动的指针,每次指向数据集中的一行数据,通过游标可以打开数据集,也 ...

  2. C#添加PDF页眉——添加文本、图片到页眉

    页眉常用于显示文档的附加信息,我们可以在页眉中插入文本或者图形,例如,页码.日期.公司徽标.文档标题.文件名或作者名等等.那么我们如何以编程的方式添加页眉呢?今天,这篇文章向大家分享如何使用了免费组件 ...

  3. C# ArcEngine二次开发之动态图层

    ArcEngine搭载C#进行GIS的二次开发,关于目标显示的问题,由于考虑到设置定时器刷新目标位置和方向,因此在显示图层上采用的是动态图层DynamicLayer,主要用到的dll文件是ESRI.A ...

  4. iOS----------拨打电话的3种方式

    iOS实现拨打电话的方式:   方法一.requestWithURL,此方法拨打前弹出提示 NSMutableString * string = [[NSMutableString alloc] in ...

  5. ios------app跳转到appStore评分

    跳转到AppStore评分,有两种方法: 一种是跳出应用,跳转到AppStore,进行评分: 另一种是在应用内,内置AppStore进行评分. PS:appID在https://itunesconne ...

  6. RN开发中的报错以及告警

    报错一: Attempted to transition from state `RESPONDER_INACTIVE_PRESS_IN` to `RESPONDER_ACTIVE_LONG_PRES ...

  7. 随意下载:afinal jar

    刚才用到afinal,下载jar包到处要积分啥的,我花钱下载了,现在免费给兄弟们 链接: https://pan.baidu.com/s/1BmB-06ui1D2BfooUCi6xKg 提取码: m3 ...

  8. Android 图片加载框架 Glide4.x

    概述 Glide是一个图片加载框架,使得我们可以轻松的加载和展示图片 Glide4.x新增apply()来进行设置,apply可以调用多次,但是如果两次apply存在冲突的设置,会以最后一次为准 新增 ...

  9. springboot 学习之路 8 (整合websocket(1))

    目录:[持续更新.....] spring 部分常用注解 spring boot 学习之路1(简单入门) spring boot 学习之路2(注解介绍) spring boot 学习之路3( 集成my ...

  10. 使用 Nexus Repository Manager 搭建 npm 私服

    目录 环境 下载与安装 添加npm仓库 配置与验证npm仓库 发布自己的包 Nexus开启启动 脚注 环境 windows10(1803) Nexus Repository Manager OSS 3 ...