地址:http://codeforces.com/contest/660/problem/C
题目:
You are given an array a with n elements. Each element of a is either 0 or 1.
Let's denote the length of the longest subsegment of consecutive elements in a, consisting of only numbers one, as f(a). You can change no more than k zeroes to ones to maximize f(a).
The first line contains two integers n and k (1 ≤ n ≤ 3·105, 0 ≤ k ≤ n) — the number of elements in a and the parameter k.
The second line contains n integers ai (0 ≤ ai ≤ 1) — the elements of a.
On the first line print a non-negative integer z — the maximal value of f(a) after no more than k changes of zeroes to ones.
On the second line print n integers aj — the elements of the array a after the changes.
If there are multiple answers, you can print any one of them.
7 1
1 0 0 1 1 0 1
4
1 0 0 1 1 1 1
10 2
1 0 0 1 0 1 0 1 0 1
5
1 0 0 1 1 1 1 1 0 1
思路:一开始我用的是n^2的算法,一直tle,后来才知道有种算法叫尺取法:就是动态维护一个长度为x的区间,并同时记录起始位置和终点位置。
对这题而言,就是维护含0数为k的0,1区间,记录长度最大值,和起始位置和终点位置;


1 #include <iostream> 2 #include <algorithm> 3 #include <cstdio> 4 #include <cmath> 5 #include <cstring> 6 #include <queue> 7 #include <stack> 8 #include <map> 9 #include <vector> 10 11 #define PI acos((double)-1) 12 #define E exp(double(1)) 13 using namespace std; 14 int a[1000000]; 15 int main (void) 16 { 17 int n,k,s=0,e=0,sum=0,len=0; 18 cin>>n>>k; 19 for(int i = 1; i<=n; i++) 20 { 21 scanf("%d",&a[i]); 22 sum += (a[i] == 0); 23 while(sum > k) 24 { 25 sum -= (a[++s] == 0); 26 } 27 if(len < i - s) 28 { 29 e = i; 30 len = i - s; 31 } 32 } 33 cout<<len<<endl; 34 for(int i = 1; i<=n; i++) 35 if(e>= i && i> e - len ) 36 { 37 printf("1 "); 38 } 39 else 40 { 41 printf("%d ",a[i]); 42 } 43 return 0; 44 }