F. Money Trees

发布时间 2023-09-22 10:50:01作者: 不o凡

双指针
创建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;
}