E
根据题意,分别利用前缀和,后缀和,然后遍历一遍取最大值即可
using namespace std;
#define int long long
#define vi vector<int>
void solve(){
int n,m;cin>>n>>m;
vi a(n),b(n);
vi ans1(n+1),ans2(n+1);
for(int i=0;i<n;i++) cin>>a[i];
for(int i=0;i<n;i++) cin>>b[i];
priority_queue<int>s1,s2;
int sum=0;
for(int i=0;i<n;i++){//前缀和
if((int)s1.size()==m){
if(a[i]<s1.top()){
sum-=s1.top();
s1.pop();
s1.push(a[i]);
sum+=a[i];
}
}else{
s1.push(a[i]);
sum+=a[i];
}
ans1[i+1]=sum;
}
sum=0;
for(int i=n-1;i>=0;i--){//后缀和
if((int)s2.size()==m){
if(b[i]<s2.top()){
sum-=s2.top();
s2.pop();
s2.push(b[i]);
sum+=b[i];
}
}else{
s2.push(b[i]);
sum+=b[i];
}
ans2[i+1]=sum;
}
int ans=10000010;
for(int i=m;i<=n-m;i++){//滑动窗口
ans=min(ans,ans1[i]+ans2[i+1]);
}
cout<<ans;
}
signed main()
{
solve();
return 0;
}