CF1165E

洛谷题目链接

Codeforces题目链接

分析

如果只算区间 1 1 1 n n n 的话那么将 a a a 升序 b b b 降序排序即可。

我们发现 a i a_i ai 一共要乘 i × ( n − i + 1 ) i\times(n-i+1) i×(ni+1) 次,所以可以直接将 a i a_i ai i × ( n − i + 1 ) i\times(n-i+1) i×(ni+1),在按上述贪心方法计算即可,注意取模。

代码

#include 
#define int long long

using namespace std;

const int N = 2 * 1e5 + 5, mod = 998244353;
int n, a[N], b[N];

signed main(){
	cin >> n;
	for(int i = 1; i <= n; i ++){
		cin >> a[i];
		a[i] *= i * (n - i + 1);
	}
	for(int i = 1; i <= n; i ++){
		cin >> b[i];
	}
	sort(a + 1, a + n + 1);
	sort(b + 1, b + n + 1, greater <int>());
	int ans = 0;
	for(int i = 1; i <= n; i ++){
		ans = (ans + a[i] % mod * b[i] % mod) % mod;
	}
	cout << ans;
	return 0;
}

你可能感兴趣的:(算法)