题目链接 琪亚娜世界第一可爱
给出两个数组,对数组B重新排序,记数组C[i]=A[i]*B[i],求C所有子区间的和的最小值。
给定区间长度,C中元素对答案的贡献只与位置有关,也就是对于位置i来说,在后续的计算中,这个元素出现的次数只与位置有关。
所以可以提前计算出现的次数num[i],并记C[i]=A[i]*num[i],找C中最大的元素和B中最小的元素相乘就是答案。
由于计算最小的值,而不是最小的余数,所以在计算C[i]的过程中不能求余,只能在计算ans是求余。
而我错的就比较厉害了,cmp参数列表都是int。。。
#pragma GCC diagnostic error "-std=c++11"
#include <bits/stdc++.h>
#define INF 0x3f3f3f3f
#define ll long long
#define Pair pair<int,int>
#define re return
#define getLen(name,index) name[index].size()
#define mem(a,b) memset(a,b,sizeof(a))
#define Make(a,b) make_pair(a,b)
#define Push(num) push_back(num)
#define rep(index,star,finish) for(register int index=star;index<finish;index++)
#define drep(index,finish,star) for(register int index=finish;index>=star;index--)
using namespace std;
const int maxn=2e5+5;
const int mod=998244353;
inline bool cmp(const ll &a,const ll &b){
re a>b;
}
int N;
ll A[maxn],B[maxn],C[maxn];
ll num[maxn];
void ini();
int main(){
ios::sync_with_stdio(false);
cin.tie(NULL);
ini();
int cou=N;
rep(i,1,N+1){
num[i]+=num[i-1]+cou-i+1;
C[i]=num[i]*A[i];
cou--;
}
sort(C+1,C+1+N,cmp);
sort(B+1,B+1+N);
ll ans=0;
rep(i,1,N+1){
C[i]%=mod;
ans=(ans+C[i]*B[i]%mod)%mod;
}
cout<<ans<<endl;
re 0;
}
void ini(){
cin>>N;
rep(i,1,N+1)
cin>>A[i];
rep(i,1,N+1)
cin>>B[i];
}