codeforcs1165E. Two Arrays and Sum of Functions 贪心

题目链接 琪亚娜世界第一可爱

给出两个数组,对数组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];
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值