Two Arrays and Sum of Functions (Codeforces 1165E)
Tags: Greedy, sortings

You are given two arrays $$$a$$$ and $$$b$$$, both of length $$$n$$$.Let's define a function $$$f(l, r) = \sum\limits_{l \le i \le r} a_i \cdot b_i$$$.Your task is to reorder the elements (choose an arbitrary order of elements) of the array $$$b$$$ to minimize the value of $$$\sum\limits_{1 \le l \le r \le n} f(l, r)$$$. Since the answer can be very large, you have to print it modulo $$$998244353$$$. Note that you should minimize the answer but not its remainder.

Input: The first line of the input contains one integer $$$n$$$ ($$$1 \le n \le 2 \cdot 10^5$$$) — the number of elements in $$$a$$$ and $$$b$$$.The second line of the input contains $$$n$$$ integers $$$a_1, a_2, \dots, a_n$$$ ($$$1 \le a_i \le 10^6$$$), where $$$a_i$$$ is the $$$i$$$-th element of $$$a$$$.The third line of the input contains $$$n$$$ integers $$$b_1, b_2, \dots, b_n$$$ ($$$1 \le b_j \le 10^6$$$), where $$$b_j$$$ is the $$$j$$$-th element of $$$b$$$.

Output: Print one integer — the minimum possible value of $$$\sum\limits_{1 \le l \le r \le n} f(l, r)$$$ after rearranging elements of $$$b$$$, taken modulo $$$998244353$$$. Note that you should minimize the answer but not its remainder.


Sample Inputs:
5
1 8 7 2 4
9 7 2 9 3

1
1000000
1000000

2
1 3
4 2

Sample Outputs:
646

757402647

20

Solution (Python):
import math, collections, sys, math, bisect, inspect, os, io, random
if os.path.exists('/home/debug.h'):

    def dbg(x):
        frame = inspect.currentframe()
        frame = inspect.getouterframes(frame)[1]
        string = inspect.getframeinfo(frame[0]).code_context[0].strip()
        args = string[string.find('(') + 1:-1].split(',')
        names = []
        for i in args:
            if i.find('=') != -1:
                names.append(i.split('=')[1].strip())
            else:
                names.append(i)
        print(names, ' : ', x, file=sys.stderr)
else:

    def dbg(x):
        pass
mod = 998244353

def brute():
    return

def solve(n, a, b):
    for i in range(n):
        a[i] *= (i + 1) * (n - i)
    a.sort()
    b.sort(reverse=True)
    ans = 0
    for i in range(n):
        ans += a[i] * b[i]
        ans %= mod
    return ans

def get():
    n = int(input())
    a = list(map(int, input().split()))
    b = list(map(int, input().split()))
    print(solve(n, a, b))
    return
for _ in range(1):
    get()

Solution (Python):
import sys
N = int(input())
a = list(map(int, input().split()))
for i in range(0, len(a)):
    a[i] = a[i] * (i + 1) * (N - i)
a.sort()
b = sorted(map(int, input().split()), reverse=True)
print(sum([a[i] * b[i] for i in range(N)]) % 998244353)

Solution (Python):
n = int(input())
MOD = 998244353
a = list(map(int, input().split()))
b = list(map(int, input().split()))
for i in range(n):
    a[i] = (i + 1) * a[i] * (n - i)
res = 0
a.sort()
b.sort(reverse=True)
for i in range(n):
    a[i] %= MOD
    res = (res + a[i] * b[i]) % MOD
print(res)