Codeforces Round #560 (Div. 3) E题

题目网址: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 }
View Code

猜你喜欢

转载自www.cnblogs.com/duxing201806/p/10886176.html