考虑先全部选 s s s,再改一些成 e e e
考虑
(
i
,
i
+
1
,
k
−
m
s
−
m
e
,
0
)
(i,i+1,k-ms-me,0)
(i,i+1,k−ms−me,0)代表不改成
e
e
e
(
i
,
i
+
k
,
1
,
e
i
−
s
i
)
(i,i+k,1,e_i-s_i)
(i,i+k,1,ei−si)代表改成
e
e
e
建一个虚点
x
x
x像
1
−
k
1-k
1−k连
(
i
n
f
,
0
)
(inf,0)
(inf,0)
(
s
t
r
,
x
,
k
−
m
s
,
0
)
(str,x,k-ms,0)
(str,x,k−ms,0)
然后跑最大费用最大流即可
#include<bits/stdc++.h>
using namespace std;
#define cs const
#define re register
#define pb push_back
#define pii pair<int,int>
#define ll long long
#define fi first
#define se second
#define bg begin
cs int RLEN=1<<20|1;
inline char gc(){
static char ibuf[RLEN],*ib,*ob;
(ib==ob)&&(ob=(ib=ibuf)+fread(ibuf,1,RLEN,stdin));
return (ib==ob)?EOF:*ib++;
}
inline int read(){
char ch=gc();
int res=0;bool f=1;
while(!isdigit(ch))f^=ch=='-',ch=gc();
while(isdigit(ch))res=(res+(res<<2)<<1)+(ch^48),ch=gc();
return f?res:-res;
}
template<class tp>inline void chemx(tp &a,tp b){a<b?a=b:0;}
template<class tp>inline void chemn(tp &a,tp b){a>b?a=b:0;}
cs int N=1505;
int tot,str,des;
int n,k,ms,me,E[N],s[N];
ll res;
namespace flow{
struct edge{
int v,cap,val,r;
edge(int a=0,int b=0,int c=0,int d=0):v(a),cap(b),val(c),r(d){}
};
vector<edge> e[N];
typedef vector<edge>::iterator It;
inline void addedge(int u,int v,int w,int cap){
e[u].pb(edge(v,cap,w,e[v].size()));
e[v].pb(edge(u,0,-w,e[u].size()-1));
}
It tp[N];
int vis[N],q[N*N],hd,tl;
ll dis[N];
bool spfa(){
memset(dis,128,sizeof(ll)*(tot+1));
memset(vis,0,sizeof(int)*(tot+1));
q[hd=tl=1]=str,vis[str]=1,dis[str]=0;
while(hd<=tl){
int u=q[hd++];
vis[u]=0;
for(edge &x:e[u])if(dis[x.v]<dis[u]+x.val&&x.cap>0){
dis[x.v]=dis[u]+x.val;
if(!vis[x.v]){
vis[x.v]=1,q[++tl]=x.v;
if(dis[q[hd]]>dis[q[tl]])swap(q[hd],q[tl]);
}
}
}
return dis[des]!=dis[0];
}
int mxflow;ll mncost;
int dfs(int u,int flow){
if(u==des)return flow;
int res=0;vis[u]=1;
for(It &it=tp[u];it!=e[u].end();it++){
if(!vis[it->v]&&dis[it->v]==dis[u]+it->val&&it->cap>0){
int now=dfs(it->v,min(flow-res,it->cap));
it->cap-=now,res+=now,e[it->v][it->r].cap+=now,mncost+=it->val*now;
if(res==flow)break;
}
}
return res;
}
inline ll mcmf(){
while(spfa()){
for(int i=1;i<=tot;i++)tp[i]=e[i].bg();
mxflow+=dfs(str,1e9);
}
return mncost;
}
inline void write(){
for(int i=1;i<=n;i++){
if(i+k<=n){
for(edge &x:e[i])if(x.val==E[i]-s[i]&&x.v==i+k&&x.cap+e[x.v][x.r].cap==1){
if(x.cap==0)putchar('E');
else putchar('S');
}
}
else{
for(edge &x:e[i])if(x.val==E[i]-s[i]&&x.v==des&&x.cap+e[x.v][x.r].cap==1){
if(x.cap==0)putchar('E');
else putchar('S');
}
}
}
}
}
int main(){
#ifdef Stargazer
freopen("lx.in","r",stdin);
#endif
tot=n=read(),k=read(),ms=read(),me=read();
for(int i=1;i<=n;i++)s[i]=read(),res+=s[i];
for(int i=1;i<=n;i++)E[i]=read();
str=++tot,des=++tot,tot++;
flow::addedge(str,tot,0,k-ms);
for(int i=1;i<=k;i++)flow::addedge(tot,i,0,1e9);
for(int i=1;i<n;i++)flow::addedge(i,i+1,0,k-me-ms);
flow::addedge(n,des,0,k-me-ms);
for(int i=1;i<=n;i++){
if(i+k<=n)flow::addedge(i,i+k,E[i]-s[i],1);
else flow::addedge(i,des,E[i]-s[i],1);
}
cout<<res+flow::mcmf()<<'\n';
flow::write();
return 0;
}