bzoj 4385: [POI2015]Wilcze doły【单调栈】
2018-09-08 11:28
381 查看
对于每个i,以它为左端点的最优右端点一定是单增的,所以用单调栈维护
具体的,单调栈里放的是和单调的长为d的子段,然后枚举右端点,如果这段的和-当前长为d子段最大的和大于p的话,左端点右移同时注意单调栈里的子段的左端点不能小于当前左端点,需要一起右移
#include<iostream> #include<cstdio> using namespace std; const int N=2000005; int n,d,q ,l=1,r,ans=d,w; long long p,a ,s ,mx; long long read() { long long r=0,f=1; char p=getchar(); while(p>'9'||p<'0') { if(p=='-') f=-1; p=getchar(); } while(p>='0'&&p<='9') { r=r*10+p-48; p=getchar(); } return r*f; } int main() { n=read(),p=read(),d=read(); for(int i=1;i<=n;i++) a[i]=read(),s[i]=s[i-1]+a[i]; for(int i=d;i<=n;i++) { while(l<=r&&s[i]-s[i-d]>s[q[r]]-s[q[r]-d]) r--; q[++r]=i; while(s[i]-s[w]-s[q[l]]+s[q[l]-d]>p) { w++; if(q[l]-d<w) l++; } ans=max(ans,i-w); } printf("%d\n",ans); return 0; }
相关文章推荐
- BZOJ4385: [POI2015]Wilcze doły
- BZOJ4385: [POI2015]Wilcze doły
- bzoj 4385: [POI2015]Wilcze doły 单调队列
- 【bzoj4385】[POI2015]Wilcze doły
- BZOJ 4385: [POI2015]Wilcze doły 单调队列
- BZOJ4385 : [POI2015]Wilcze doły
- BZOJ 4385: [POI2015]Wilcze doły
- BZOJ 4385: [POI2015]Wilcze doły
- 【bzoj4385】 [POI2015]Wilcze doły
- BZOJ4385: [POI2015]Wilcze doły
- 【BZOJ4385】[POI2015]Wilcze doły 单调栈+双指针法
- bzoj 4385: [POI2015]Wilcze doły
- BZOJ4385: [POI2015]Wilcze doły
- bzoj 4385: [POI2015]Wilcze doły
- BZOJ4385 POI2015 Wilcze doły
- 【BZOJ 4385】[POI2015]Wilcze doły 单调队列
- BZOJ4385[POI2015] Wilcze doły
- 【BZOJ4385】[POI2015]Wilcze doły【单调队列】【前缀和】【Two Pointers】
- bzoj4385 [POI2015]Wilcze doły
- [bzoj4385][POI2015]Wilcze doły_单调队列