#include #include using namespace std; using namespace atcoder; using mint = modint1000000007; #define int long long int H,W; signed main(){ //ステップ1. 入力の受け取り cin>>H>>W; vector A(H+1); vector B(W+1); for(int i = 1; i <= H; i++) cin>>A[i]; for(int i = 1; i <= W; i++) cin>>B[i]; //ステップ2. 入力の加工 vector rui(H+1); sort(A.begin(),A.end()); for(int i = 1; i <= H; i++) rui[i] = rui[i-1] + A[i]; //ステップ3. 答えを求める mint min_ans = 0; mint max_ans = 0; //ステップ3-1 min_ans vector C; unordered_map mp1; unordered_map mp2; for(int i = 1; i <= H; i++){ mp1[A[i]]++; C.push_back(A[i]); } for(int i = 1; i <= W; i++){ mp2[B[i]]++; C.push_back(B[i]); } sort(C.begin(),C.end()); C.erase(unique(C.begin(),C.end()),C.end()); for(int i:C) min_ans += max(mp1[i],mp2[i]) * i; //ステップ3-2 max_ans for(int i = 1; i <= W; i++){ int it = prev(upper_bound(A.begin(),A.end(),B[i])) - A.begin(); max_ans += rui[it] + B[i] * (H - it); } //ステップ4. 答えの出力 cout << min_ans.val() << "\n"; cout << max_ans.val() << "\n"; }