传送门:https://ac.nowcoder.com/acm/contest/893/F?tdsourcetag=s_pcqq_aiomsg
二分:要知道二分中的l~r是答案的范围,所以我们是拿着x去询问x是否可行。
二分:要知道二分中的l~r是答案的范围,所以我们是拿着x去询问x是否可行。
#include<bits/stdc++.h> using namespace std; const int N=1e5+100; int t,n,m; char str[N]; int p0[N]={0},p1[N]={0}; bool solve(int x) { for(int i=0;i+x<=n;i++) { if(p1[i+x]-p1[i]<=m) return 1; if(p0[i+x]-p0[i]<=m) return 1; } return 0; } int main(){ scanf("%d",&t); while(t--) { cin>>n>>m; for(int i=1;i<=n;i++) { cin>>str[i]; p1[i]=p1[i-1]; p0[i]=p0[i-1]; if(str[i]=='1') p1[i]++; else p0[i]++; } int l=0,r=n; while(l<=r) { int m=(l+r)/2; if(solve(m)) l=m+1; else r=m-1; } cout<<r<<endl; } return 0; }