调了两整天了/ll
#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<algorithm>
#include<cmath>
#include<map>
#include<unordered_map>
#include<vector>
#include<queue>
#include<set>
#define x1 xx1
#define y1 yy1
#define IOS ios::sync_with_stdio(false)
#define int long long
using namespace std;
inline int R(){
int x=0,f=1;char ch=getchar();
while(!isdigit(ch)){if(ch=='-')f=-1;ch=getchar();}
while(isdigit(ch)){x=x*10+ch-48;ch=getchar();}return x*f;
}
inline void write(int x){
if(x<0){x=-x;putchar('-');}
int y=0;char z[70];
while(x||!y){z[y++]=x%10+48;x/=10;}
while(y--)putchar(z[y]);
}
inline void writesp(int x){
if(x<0){x=-x;putchar('-');}
int y=0;char z[70];
while(x||!y){z[y++]=x%10+48;x/=10;}
while(y--)putchar(z[y]);putchar(32);
}
inline void writeln(int x){
if(x<0){x=-x;putchar('-');}
int y=0;char z[70];
while(x||!y){z[y++]=x%10+48;x/=10;}
while(y--)putchar(z[y]);putchar(10);
}
const int N=2e5+5,V=0x3f3f3f3f3f3f3f3f;
int n,r[N],p,m,f,nn,s;
namespace MCMF{
int S,T;
struct edge{
int to,nxt,w,cost;
}a[N];
int head[N],cnt=1;
int ans;
int dis[N];
bool vis[N];
void add(int x,int y,int z,int c){
cnt++;
a[cnt].nxt=head[x];
a[cnt].to=y;
a[cnt].w=z;
a[cnt].cost=c;
head[x]=cnt;
}
void new_add(int x,int y,int z,int c){
add(x,y,z,c);
add(y,x,0,-c);
}
int spfa(){
for(int i=1;i<=2*n+2;i++) dis[i]=V;
queue<int>q;
vis[S]=1;
q.push(S);
dis[S]=0;
while(!q.empty()){
int now=q.front();
q.pop();
vis[now]=0;
for(int i=head[now];i;i=a[i].nxt){
int u=a[i].to;
if(a[i].w&&dis[u]>dis[now]+a[i].cost){
dis[u]=dis[now]+a[i].cost;
if(!vis[u]){
vis[u]=1;
q.push(u);
}
}
}
}
return dis[T];
}
int dinic(int x,int flow){
if(x==T) return flow;
int res=0,tmp;
vis[x]=1;
for(int i=head[x];i;i=a[i].nxt){
int u=a[i].to;
if(!vis[u]&&a[i].w&&dis[u]==dis[x]+a[i].cost){
tmp=dinic(u,min(a[i].w,flow));
if(tmp){
ans+=tmp*a[i].cost;
a[i].w-=tmp,a[i^1].w+=tmp;
res+=tmp,flow-=tmp;
}
if(!flow) break;
}
}
vis[x]=0;
return res;
}
int mcmf(){
int res=0,flow;
while(spfa()!=V)
while(flow=dinic(S,V))
res+=flow;
return res;
}
}
using namespace MCMF;
signed main(){
n=R();
for(int i=1;i<=n;i++) r[i]=R();
p=R(),m=R(),f=R(),nn=R(),s=R();
S=2*n+1,T=2*n+2;
for(int i=1;i<=n-m;i++){//送到快洗部
new_add(i+n,i+m,V,f);
}
for(int i=1;i<=n-nn;i++){//送到慢洗部
new_add(i+n,i+nn,V,s);
}
for(int i=1;i<n;i++){//暂时储存
new_add(i+n,i+n+1,V,0);
}
for(int i=1;i<=n;i++){//新买餐巾
new_add(S,i,V,p);
}
for(int i=1;i<=n;i++){
new_add(S,i+n,r[i],0);
new_add(i,T,r[i],0);
}
// puts("zgcakioi");
mcmf();
write(ans);
}