1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95
|
#include<ctime> #include<cstdio> #include<cstring> #include<cstdlib> #include<map> #include<set> #include<queue> #include<deque> #include<stack> #include<bitset> #include<vector> #include<algorithm> #include<iostream> #include<deque> using namespace std;
namespace mine { typedef long long ll;
const int MAX_N=210000; int n,m1,m2,c1,c2,cost,ned[MAX_N],left[MAX_N]; stack<int> a,b; int (int st) { while(a.size()) a.pop(); while(b.size()) b.pop(); memcpy(left,ned,sizeof ned);
int ans=st*cost; for(int i=1;i<=n;i++) { int now=ned[i]; if(st>0) { if(now<=st) st-=now,now=0; else now-=st,st=0; } if(i-m1>=1) a.push(i-m1); if(i-m2>=1) b.push(i-m2);
while(now and a.size()) { int t=a.top(); if(now<=left[t]) ans+=now*c1,left[t]-=now,now=0; else ans+=left[t]*c1,now-=left[t],left[t]=0; if(left[t]==0) a.pop(); } while(now and b.size()) { int t=b.top(); if(now<=left[t]) ans+=now*c2,left[t]-=now,now=0; else ans+=left[t]*c2,now-=left[t],left[t]=0; if(left[t]==0) b.pop(); } if(now) return -1; } return ans; } void main() { scanf("%d%d%d%d%d%d",&n,&m1,&m2,&c1,&c2,&cost); int l=1,r=0;for(int i=1;i<=n;i++) scanf("%d",&ned[i]),r+=ned[i];
if(c1>c2) swap(m1,m2),swap(c1,c2); while(l<r) { int mid1=l+(r-l+1)/3,mid2=r-(r-l+1)/3; ll t1=check(mid1),t2=check(mid2); if(l+1==r) { if(t1<0) l=r=mid2; else l=r=(t1<t2?mid1:mid2); } else { if(t1<0) l=mid1; else if(t1>t2) l=mid1; else r=mid2; } } printf("%d",check(l)); } }; int main() { srand(time(0)); mine::main(); }
|
近期评论