Educational Codeforces Round 11 C. Hard Process(双指针)

题意:
给你一个有 n 个元素的数组 a 。 a 中的每个元素要么是 0 要么是 1 。
我们把 a 中连续元素的最长子段(仅由数字 1 组成)的长度记为 f(a) 。为了使 f(a) 最大,你可以将不超过 k 个 0 改为 1。

思路:双指针。

#include 

using namespace std;
const int N = 2e6 + 5;
typedef long long ll;
typedef pair<ll, ll> pll;
typedef array<ll, 3> p3;
int mod = 998244353;
const int maxv = 4e6 + 5;
// #define endl "\n"

void solve()
{	
	int n,k;
	cin>>n>>k;
	vector<int> a(n+5);
	for(int i=1;i<=n;i++) cin>>a[i];
	int cnt=0;
	int la=0,ra=0;
	int res=0;
    for (int l=1,r=1;r<=n;r++){
        cnt+=!a[r];
        if (cnt>k){
            cnt-=!a[l];
            l++;
        }
        if (r-l+1>res)res=r-l+1,la=l,ra=r;
    }
	for(int i=la;i<=ra;i++) a[i]=1;
	cout<<res<<endl;
	for(int i=1;i<=n;i++) cout<<a[i]<<" ";
	cout<<endl;

}

int main()
{
    ios::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);
	int t;
	t=1;
	//cin>>t;
	while(t--){
		solve();
	}
    system("pause");
    return 0;
}

你可能感兴趣的:(补题记录,#,双指针,算法,数据结构)