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;
}