双指针
创建l,r指针,r满足向右走sum+=a[r],r++,不满足l向右走sum-=a[l],l--;
当l==r使,r向右走
当高度不满足时,重新累计sum=0,l指针直接转向r,r++;
然后取r-l最大的区间
点击查看代码
#include<bits/stdc++.h>
using namespace std;
const int N=2e5+10;
int a[N],b[N];
void solve(){
int n,k;
cin>>n>>k;
for(int i=1;i<=n;i++) cin>>a[i];
for(int i=1;i<=n;i++) cin>>b[i];
int l=1,r=1,sum=0,mx=0;
while(l<=n&&r<=n){
if(l==r) sum+=a[l],r++;
else if(b[r-1]%b[r]==0) sum+=a[r],r++;
else l=r,sum=0;
while(sum>k) sum-=a[l],l++;
mx=max(mx,r-l);
}
cout<<mx<<'\n';
}
int main(){
ios::sync_with_stdio(0),cin.tie(0);
int t;
cin>>t;
while(t--){
solve();
}
return 0;
}