社区讨论
61求调 双指针+单调队
P3594[POI 2015 R3] 狼坑 Trous de loup参与者 1已保存回复 1
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 1 条
- 当前快照
- 1 份
- 快照标识符
- @mhj32mww
- 此快照首次捕获于
- 2025/11/03 19:55 4 个月前
- 此快照最后确认于
- 2025/11/03 19:55 4 个月前
CPP
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=4e6+5;
int n,p,d,w[N],l=1,r=1,s[N],t[N],ans;
deque<int> q;
signed main(){
cin>>n>>p>>d;
for(int i=1;i<=n;i++){
cin>>w[i];
s[i]=s[i-1]+w[i];
if(s[i]<=p) r=i;
}
ans=r;
for(int i=1;i<=n-d+1;i++) t[i]=s[i+d-1]-s[i-1];
for(int i=1;i<=r-d+1;i++){
while(!q.empty()&&t[i]>t[q.back()]) q.pop_back();
q.push_back(i);
}
for(int i=r;i<=n;i++){
if(i-l+1<d){
if(s[i]-s[l-1]>p) l++;
else ans=max(ans,i-l+1);
continue;
}
while(!q.empty()&&t[i-d+1]>t[q.back()]) q.pop_back();
q.push_back(i-d+1);
while(!q.empty()&&q.front()<l||q.front()+d-1>i) q.pop_front();
if(s[i]-s[l-1]-t[q.front()]<=p) ans=max(ans,i-l+1);
else l++;
}
cout<<ans;
return 0;
}
回复
共 1 条回复,欢迎继续交流。
正在加载回复...