题目网址:http://codeforces.com/contest/1165/problem/E
题目大意:给出2组数a[n]和b[n] ,b[n] 数的位置可以变化,定义 F( l , r ) = ∑ ( ai*bi ),且 l <= i <= r,求 ∑ F( l,r )的最小值,其中 1<=l <=r <=n.
题解:首先看看F函数有什么特性,根据 r>=l,可知 ∑ F( l,r)=F(1,1)+F(1,2)+……F(1,n)+F(2,2)+F(2,3)+……F(2,n)………………
则列举得,a1*b1有n个,a2*b2有2*(n-1)个则 ai*bi有 i * (n-i+1)个,即求 ∑ai*bi*(n-i+1)*i 的最小值,i介于1~n,又ai是不变的,则该式子只取决于bi的大小,所以只需倒序匹配即可
1 #include<bits/stdc++.h> 2 #define ll long long 3 const int maxn=2e5+7; 4 const int mod=998244353; 5 using namespace std; 6 ll a[maxn],b[maxn]; 7 bool cmp(ll x,ll y) 8 { 9 return x>y; 10 } 11 int main() 12 { 13 int n; 14 cin>>n; 15 for(int i=1;i<=n;i++) { 16 scanf("%I64d",&a[i]); 17 a[i]=a[i]*i*(n-i+1); 18 } 19 for(int i=1;i<=n;i++) scanf("%I64d",&b[i]); 20 sort(a+1,a+1+n); 21 sort(b+1,b+1+n,cmp); 22 ll ans=0; 23 for(int i=1;i<=n;i++) { 24 ans+=(a[i]%mod*b[i]%mod)%mod; 25 ans=ans%mod; 26 } 27 cout<<ans%mod<<endl; 28 return 0; 29 }