E. Two Arrays and Sum of Functions
题意:
有数组a和数组b,可以给b排序
解析:
求区间覆盖次数,类似焦作的一道贪心
每个a[i]覆盖次数: count(i)= (i)*(n-i+1) 次(注意要给i加long long,否则会超int)
c[i]=a[i]*(i)*(n-i+1);逆序排序,b[i]正序排序
相乘取模输出
ac:
#include<bits/stdc++.h>
#define pb push_back
#define ll long long
#define MAXN 200005
#define mod 998244353
using namespace std;
ll a[MAXN],b[MAXN],c[MAXN],d[MAXN];
int main()
{
int n;
scanf("%d",&n);
for(int i=1;i<=n;i++)
scanf("%lld",&a[i]);
for(int i=1;i<=n;i++)
scanf("%lld",&b[i]);
for(int i=1;i<=n;i++)
{
ll dd=((ll)i)*(n-i+1);//里面加ll,或者所以数组全取ll最稳
c[i]=(dd*a[i]);
}
ll ans=0;
sort(b+1,b+n+1);
sort(c+1,c+n+1,greater<ll>());
for(int i=1;i<=n;i++)
{
ll tt=((c[i]%mod)*b[i])%mod;
ans=(ans+tt)%mod;
}
printf("%lld\n",ans%mod);
return 0;
}