首页 > 其他分享 >CF1165E Two Arrays and Sum of Functions 题解

CF1165E Two Arrays and Sum of Functions 题解

时间:2024-04-13 19:46:46浏览次数:15  
标签:Functions le limits leq Arrays 题解 sum times int

题目简述

已知两个长度均为 $n$ 的数组 $a$ 和 $b$。

给定一个函数:$f(l, r) = \sum \limits_{l \le i \le r} a_i \cdot b_i$。

你的任务是对数组 $b$ 中的元素以任意的顺序重新排序,使 $\sum \limits_{1 \le l \le r \le n} f(l, r)$ 的值最小。

题目分析

我们首先进行化简,发现题目中要求的实质上就是最小化 $\sum\limits_{l=1}^{n} \sum\limits_{r=l}^{n} \sum\limits_{i=l}^{r} a_i \times b_i$。接下来,我们考虑每一个 $a_i \times b_i$ 的贡献,由上述和式可知,$a_i \times b_i$ 出现的次数等于包含 $i$ 的区间的个数,设包含 $i$ 的区间为 $[l,r]$。显然 $1 \leq l \leq i$ 且 $i \leq r \leq n$。则 $l$ 共有 $i$ 个,$r$ 共有 $n-i+1$ 个,由乘法原理可得,包含 $i$ 的区间共有 $i \times (n-i+1)$ 个。即 $a_i \times b_i$ 共计算了 $i \times (n-i+1)$ 次。

有了上述的推导,题目要最小化的和式便可以化简成 $\sum\limits_{i=1}^{n} i \times (n-i+1) \times a_i \times b_i$,由题目可得 $i \times (n-i+1) \times a_i$ 是不变的,所以我们可以令 $c_i=i \times (n-i+1) \times a_i$,题目便被转化成最小化 $\sum\limits_{i=1}^{n} c_i \times b_i$。

此时,我们引入排序不等式,它的内容如下:

设有两个长度为 $n$ 的数列 $a$ 和 $b$,满足 $a$ 序列和 $b$ 序列单调不减,$c$ 序列是 $b$ 序列的乱序排列,则有:
$$\sum\limits_{i=1}^{n} a_i \times b_{n-i+1} \leq \sum\limits_{i=1}^{n} a_i \times c_i \leq \sum\limits_{i=1}^{n} a_i \times b_i$$

有了排序不等式,解法就呼之欲出了,我们倒序排列序列 $c$,再升序排列序列 $b$,最后求 $\sum\limits_{i=1}^{n} c_i \times b_i$ 即可,由排序不等式可证,此时的答案就是最小的了。

代码

#include<iostream>
#include<algorithm>
using namespace std;
#define int unsigned long long
const int N=2*1e5+10;
const long long mod=998244353;
int n,a[N],b[N],ans;
inline int read()
{
	int x=0,f=1;
	char ch=getchar();
	while(ch<'0'||ch>'9')
	{
	    if(ch=='-')
		{
			f=-1;
		}
		ch=getchar();
	}
	while(ch>='0'&&ch<='9')
	{
	    x=(x<<1)+(x<<3)+ch-48;
	    ch=getchar();
	}
	return x*f;
}
inline void write(int x)
{
    if(x<0)
	{
    	putchar('-');
		x=-x;
	}
    if(x>9) write(x/10);
    putchar(x%10+'0');
}
bool cmp(int x,int y)
{
	return x>y;
}
signed main()
{
	n=read();
	for(int i=1;i<=n;i++)
	{
		a[i]=read();
	}
	for(int i=1;i<=n;i++)
	{
		b[i]=read();
	}
	for(int i=1;i<=n;i++)
	{
		a[i]*=i*(n-i+1);
	}
	sort(a+1,a+1+n,cmp);
	sort(b+1,b+1+n);
	for(int i=1;i<=n;i++)
	{
		a[i]%=mod;
		ans=(ans+a[i]*b[i])%mod;
		ans%=mod;
	}
	cout<<ans;
	return 0;
}

标签:Functions,le,limits,leq,Arrays,题解,sum,times,int
From: https://www.cnblogs.com/zhuluoan/p/18133270

相关文章

  • CF107A Dorm Water Supply 题解
    题目简述给出一个$n$个点,$m$条边的有向图,边带权。保证每个点的出度和入度最多为$1$。对于每一个入度为$0$,出度为$1$的点,我们在该点建一个水箱。对于每一个入度为$1$,出度为$0$的点,我们在该点建一个水龙头。可以发现,每一个水箱对应一个唯一的水龙头,我们将每对对应......
  • CF1942B Bessie and MEX 题解
    题目简述给定一个长度为$n$的数组$a$,让你构造一个等长的排列$p$,其中从$0$到$n-1$的每个整数恰好出现一次。满足对于每一个位置$a_i=\texttt{MEX}(p_1,p_2,\ldots,p_i)-p_i$,其中数组的$\texttt{MEX}$是不在该数组中出现的最小非负整数。题目分析我们发现正着做并......
  • CF244B Undoubtedly Lucky Numbers 题解
    题目简述给定一个$n$,问有多少个小于等于$n$的数只由两个不同的数字$x$和$y$组成。题目分析直接枚举肯定不行,我们考虑枚举$x$和$y$,再利用深搜,生成所有不大于$n$且只由$x$和$y$组成的数字,利用map去重,统计答案即可。代码#include<iostream>#include<map>usi......
  • 2023CCPC题解
    2023年第五届河南省CCPC大学生程序设计竞赛ProblemA.小水獭游河南#include<bits/stdc++.h>usingnamespacestd;intmain(){intt;cin>>t;while(t--){stringa;cin>>a;intst[27],ji=0;memset(st,0,sizeof(......
  • CF1946B Maximum Sum 题解
    题目简述你有一个由$n$个整数组成的数组$a$。你要对它进行$k$次操作。在一次操作中,你选择了数组$a$的任意连续子数组(可能为空),并在数组的任意位置插入了该子数组的和。你的任务是找出经过$k$次操作后数组的最大和。题目分析这道题显然是一道贪心题。对于第$1$次操......
  • 集合计数——题解
    题目这篇题解的背景。。。(可以跳过,与题目无关)说实话,有点恼,也觉得自己有点唐,在以为自己已经理解了变量意义的情况下(实际上并没有)去推了半天错式子,甚至我推出了他不对时还给自己否定了,昨天晚三还拉着\(9G\)与我一块推。。。,结果上午发觉好像意义理解错了。。。抽象,就当是一种......
  • CF416E 题解
    前置知识:floyd题意给定一个\(n\)个点\(m\)条边的无向简单图,对于每对\((s,t),1\les<t\len\),求出有多少条边被至少一个\(s\tot\)的路径经过。\(n\le500,m\le\frac{n(n-1)}{2}\)题解首先一个很一眼的做法先floyd一遍求出\(dis(i,j)\),接着枚举\((s,......
  • [CF1954] Educational Codeforces Round 164 (Rated for Div. 2) 题解
    [CF1954]EducationalCodeforcesRound164(RatedforDiv.2)题解A.PaintingtheRibbon最优策略是染\(\lceil\dfrac{n}{m}\rceil\)个颜色,然后Bob会把剩下的都染成这个颜色voidwork(){intn,m,k,c;cin>>n>>m>>k;c=(n+m-1)/m;......
  • CF1618G Trader Problem 题解
    CF1618GTraderProblem题解题目链接:CF|洛谷提供一个在线做法。分析1我们不妨把\(a\)和\(b\)合并为一个序列,称合并后的序列为\(c\),并将其不降序排序。把玩样例后不难发现:对于一个物品序列\(c_1,c_2,\cdots,c_l\),满足\(\foralli<l,c_{i+1}-c_i\lek\)(即任意......
  • [CF1942] CodeTON Round 8 (Div. 1 + Div. 2, Rated, Prizes! A~E 题解
    [CF1942]CodeTONRound8(Div.1+Div.2,Rated,Prizes!A~E题解A.FarmerJohn'sChallenge只有两种情况,一种是单调递增,这时\(k=1\),另一种是所有数都相同,这时\(k=n\)。B.BessieandMEX首位可以确定,然后从前往后增量构造\(p\)即可。voidwork(){cin>>......