abc229g
分享一个 麻烦的 另一个角度的二分做法。
在某个地方看到这题有数据结构的标签,昨晚发现并不用数据结构,前缀和就可以。所以为什么有数据结构标签呢?
首先还是转换这个问题。将
样例1 里的
可以枚举最终变得相同的数
然后二分出能够在
对于一个 lower_bound 出
如果需要操作的次数
但是!! 还有可能碰到这样的情况:
具体地说,如果通过二分得到的
#include<bits/stdc++.h>
#define FOR(i,a,b) for(int i=(a);i<=(b);i++)
#define ROF(i,a,b) for(int i=(a);i>=(b);i--)
#define endl "\n"
#define int long long
#define pii pair<int,int>
#define mem(a,b) memset(a,(b),sizeof(a))
using namespace std;
const int N=2e5+5;
int n,k,ans,mx;
char s[N];
int a[N],t[N];
int dis(int l,int r,int op){
if(op==1) return t[r]-t[l-1]-(r-l+1)*a[l];
return (r-l+1)*a[r]-(t[r]-t[l-1]);
}
bool check(int x,int p){
int L=lower_bound(a+1,a+n+1,max(0ll,a[x]-p))-a,R=upper_bound(a+1,a+n+1,a[x]+p)-a-1;
if(dis(L,x,-1)+dis(x,R,1)>k) return 0;
return 1;
}
signed main(){
ios::sync_with_stdio(0);
cin.tie(0); cout.tie(0);
cin>>s+1;
cin>>k;
int len=strlen(s+1);
FOR(i,1,len){
if(s[i]=='Y') a[++n]=i-n,mx=max(mx,a[n]);
}
FOR(i,1,n) t[i]=t[i-1]+a[i];
FOR(i,1,n){
int l=0,r=max(a[i],mx-a[i]);
while(l<r){
int mid=(l+r+1)>>1;
if(check(i,mid)) l=mid;
else r=mid-1;
}
int L=lower_bound(a+1,a+n+1,max(0ll,a[i]-r))-a,R=upper_bound(a+1,a+n+1,a[i]+r)-a-1;
ans=max(ans,R-L+1);
int qwq=dis(L,i,-1)+dis(i,R,1);
if(k==qwq) continue;
int res=0;
if(L!=1&&L!=0) ans=max(ans,res=max(res,R-L+1+(k-qwq)/abs(a[i]-a[L-1])));
if(R!=n-1&&R!=n) ans=max(ans,res=max(res,R-L+1+(k-qwq)/abs(a[i]-a[R+1])));
}
cout<<ans<<endl;
return (0-0);
}