根据E题题意可知,我们需要在两个数组中设置一个分界线其中分界线前后元素不得少于m个,通过获得分界线前面最小的m个数和分界线后面b数组中最小的m个数的和来获得我们所需的最小的和,可以通过枚举a数组中从第m位置开始的前x个数中最小的m个数,和b数组中从第n-m+1位置开始的前y个数中最小的m个数,然后获得最小的,以下是我的代码,思维有点混乱.

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int main(){
    int n,m;
    cin>>n>>m;
    vector<ll>a(n+10000);
    vector<ll>b(n+10000);
    for(int i=1;i<=n;i++){
        cin>>a[i];
    }
    for(int i=1;i<=n;i++){
        cin>>b[i];
    }
    vector<ll>c(n+10000);
    vector<ll>d(n+10000);
    priority_queue<ll>e;
    priority_queue<ll>f;
    for(int i=1;i<=m;i++){
        e.push(a[i]);
        c[m]+=a[i];
    }
    for(int i=1;i<=n-m;i++){
        if(a[i+m]<e.top()){
            c[i+m]=c[i+m-1]-e.top()+a[i+m];
            e.push(a[i+m]);
            e.pop();
        }
        else c[i+m]=c[i+m-1];
    }
    for(int i=n;i>=n-m+1;i--){
        f.push(b[i]);
        d[n-m+1]+=b[i];
    }
    for(int i=n-m;i>=1;i--){
        if(b[i]<f.top()){
            d[i]=d[i+1]-f.top()+b[i];
            f.push(b[i]);
            f.pop();
        }
        else d[i]=d[i+1];
    }
    ll ans=1e18;
    for(int i=m;i<=n-m;i++){
    	ans=min(ans,c[i]+d[i+1]);
	}
	cout<<ans<<"\n";
}