CF1873F Money Trees
双指针好题,但是我用的队列(
考虑先找出所有极长的、满足任意一个数都能被它后面的那个数整除的连续段。显然这个操作可以在
求出每个极长连续段的答案,取
注意到这个问题可以使用双指针法解决:右端点从左向右扫,每
时间复杂度 std::queue
,和双指针本质相同。
#define int long long
typedef pair<int,int> pii;
const int N=2e5+8,oo=1e18+8;
int n,m,a[N],b[N];
vector<pii> vec;
int work(int ll,int rr){
queue<int> que;
int now=0,res=0,siz=0;
for(int i=ll;i<=rr;i++){
if(now<=m){
now+=a[i];
que.push(a[i]);
siz++;
}
while(now>m&&que.empty()==0){
now-=que.front();
que.pop();
siz--;
}
res=max(res,siz);
}
return res;
}
void solve(){
vec.clear();
for(int i=1;i<=n;i++)
a[i]=b[i]=0;
n=read(),m=read();
for(int i=1;i<=n;i++)
a[i]=read();
for(int i=1;i<=n;i++)
b[i]=read();
b[0]=b[n+1]=oo;
int pos=1;
for(int i=1;i<=n;i++){
if(b[i]%b[i+1]!=0){
vec.push_back({pos,i});
pos=i+1;
}
}
int ans=0;
for(auto cur:vec){
int l=cur.first,r=cur.second;
int tmp=work(l,r);
// write(tmp),putchar(' ');
ans=max(ans,tmp);
}
write(ans),putchar('\n');
}
bool Mend;
signed main(){
// File_Work();
fprintf(stderr,"%.3lf MB\n\n\n",(&Mbegin-&Mend)/1048576.0);
int testnum=read();
while(testnum--)
solve();
fprintf(stderr,"\n\n\n%.0lf ms",1e3*clock()/CLOCKS_PER_SEC);
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
· 如何调用 DeepSeek 的自然语言处理 API 接口并集成到在线客服系统