首页 > 其他分享 > [题解]AT_arc116_b [ARC116B] Products of Min-Max

[题解]AT_arc116_b [ARC116B] Products of Min-Max

时间:2023-09-12 17:26:25浏览次数:50  
标签:ARC116B arc116 Min int 题解 sum times

思路

我们容易可以得到一个朴素的做法,首先对 \(a\) 数组排序,然后枚举最大值和最小值 \(a_i,a_j\),那么对于中间的元素都有选与不选两种情况,得到答案:

\[\sum_{i = 1}^{n}(a_i \times a_i + (\sum_{j = i + 1}^{n}a_i \times a_j \times 2^{j - i - 1})) \]

然后对这个式子做一个化简:

\[\sum_{i = 1}^{n}(a_i \times a_i + a_i \times (\sum_{j = i + 1}^{n}a_j \times 2^{j - i - 1})) \]

发现对于每一个 \(i\),\(a_j \times 2^{j - i - 1}\) 都是类似的,所以考虑预处理。

定义 \(m_i = \sum_{j = 1}^{i}(a_j \times 2^j)\),那么发现:

\[m_n - m_i = \sum_{j = i + 1}^{n}{a_j}\times 2^j \]

然后,发现对于每一项 \(j\) 对于原式都多乘了一个 \(2^{i + 1}\),直接除掉即可。得答案为:

\[\sum_{i = 1}^n{(a_i \times a_i + \frac{m_n - m_i}{2^{i + 1}} \times a_i)} \]

时间复杂度 \(\Theta(n \log n)\)。

code

#include <bits/stdc++.h>
#define int long long
#define re register

using namespace std;

const int N = 2e5 + 10,mod = 998244353;
int n,ans;
int arr[N],pot[N],mul[N],inv[N];

inline int read(){
	int r = 0,w = 1;
	char c = getchar();
	while (c < '0' || c > '9'){
		if (c == '-') w = -1;
		c = getchar();
	}
	while (c >= '0' && c <= '9'){
		r = (r << 3) + (r << 1) + (c ^ 48);
		c = getchar();
	}
	return r * w;
}

inline int Add(int a,int b){
	return (a + b) % mod;
}

inline int Sub(int a,int b){
	return ((a - b) % mod + mod) % mod;
}

inline int Mul(int a,int b){
	return a * b % mod;
}

inline void exgcd(int a,int b,int &x,int &y){
	if (!b){
		x = 1;
		y = 0;
		return;
	}
	exgcd(b,a % b,y,x);
	y = y - a / b * x;
}

inline int get_inv(int a,int p){
	int x,y;
	exgcd(a,p,x,y);
	return (x % mod + mod) % mod;
}

inline void init(){
	pot[0] = 1;
	for (re int i = 1;i <= n + 1;i++){
		pot[i] = Mul(pot[i - 1],2);
		mul[i] = Add(mul[i - 1],Mul(arr[i],pot[i]));
		inv[i] = get_inv(pot[i],mod);
	}
}

signed main(){
	n = read();
	for (re int i = 1;i <= n;i++) arr[i] = read();
	sort(arr + 1,arr + n + 1);
	init();
	for (re int i = 1;i <= n;i++){
		ans = Add(ans,Mul(Mul(Sub(mul[n],mul[i]),inv[i + 1]),arr[i]));
		ans = Add(ans,Mul(arr[i],arr[i]));
	}
	printf("%lld",ans);
	return 0;
}

标签:ARC116B,arc116,Min,int,题解,sum,times
From: https://www.cnblogs.com/WaterSun/p/AT_arc116_b.html

相关文章

  • 【Flink系列十八】HDFS_DELEGATION_TOKEN过期的问题解决汇总
    问题类别Spark框架自身的问题Hadoop全家桶的问题开发者通过Hive,HDFS,HBASE访问HDFS的问题排查已知Hadoop-common-2.6.0的UGI存在bug,代码为HADOOP-10786,该问题在CDH发行版中已经修复,但Apache版本存在问题。已知HDFS也存在一个HDFS_DELEGATION_TOKEN过期的bug,代码为HDFS-9......
  • xilinx赛灵思下载器jtag-hs3兼容alinx仿真fpga烧录digilent高速常见问题解答
    1.概述  XJTAG-HS3是XILINX的USB转JTAG的高速仿真器,可以下载、烧录和仿真Xilinx FPGA和CPLD芯片,以及配置PROM、FLASH. XJTAG-HS3比PlatformCableUSBII下载器快10倍速度。 可以在30Mbit/秒下驱动JTAG/SPI总线,并且能实现对XilinxZYNQ平台处理器核的重置。可以支持ZYN......
  • P3616 富金森林公园 题解
    P3616富金森林公园题解题意给你\(n\)个点,有\(m\)次操作,每次操作可以改变一个数的值,也可以查询有多少连续的块,满足这个块内的所有数的值都大于查询的值。分析还是比较容易想到用数据结构或分块的,毕竟有同时存在修改和查询操作。但是维护什么?怎么维护?既然我们无法直接维......
  • 关于sql server 2008 r2 安装闪退问题解决办法
    打开sqlserverr2安装包文件目录找到SQL2008R2_64\2052_chs_lp\x64\setup\sqlsupport_msi目录下sqlsupport.msi,运行安装 a、在安装盘中搜索sqlsupport,找到对应的sqlsupport.msi文件并安装,一般路径如下:Windows64位系统需要安装:..\sql2008r2.iso\2052_chs_lp\x64\setup\sqls......
  • 【ABC105D】题解
    题解题意简述给定\(n\)个数,求这\(n\)个数中有多少个二元组\((x,y)\)满足其中每一个数都是\(m\)的倍数。思路前缀和,\((x,y)\)内每一个数\(\bmod\m=0\),可以用\((sum_y-sum_{x-1})\bmod\m=0\)表示。但是这题数据太大,所以要使用map。如果\(x=1\),......
  • ABC319 A-E 题解
    A用map<string,int>将名字对应的值存下来即可。赛时代码B按照题意暴力模拟,注意细节。赛时代码C答辩题,卡了我半个小时。枚举\(1\sim9\)的全排列,然后按照顺序计算即可,但代码实现比较答辩。赛时代码D显然具有可二分性,直接二分并判定可行性即可,注意不合法条件。赛......
  • 题解 Gym 104531D【Coffee】
    2022SYSUSchoolContest题目不想翻译了,自己看能看懂。problamThegirlsofHTTlikedrinkingtea.Butoneday,theywantedachangeanddecidedtotrycoffeeinthenext\(n\)days.NowMugi,whoalwaysprovidesfoodanddrinksforHTT,willgototheshopto......
  • pycharm 远程debug卡住问题解决
     解决方案:1、先注释掉连接debugserversocket代码,启动 2、启动debugserver3、去除注释,热部署自动重启,则能重连 ......
  • 230909 NOIP 模拟赛 T1 cake 题解
    原题题意有一块\(n\timesm\)\((1\len,m\le14)\)的蛋糕,每个位置上有一个权值\(a_{i,j}\)\((1\lea_{i,j}\le1000)\),现在你要把它切开。每次你可以平行与某一边界把蛋糕切开,所以共有\(n-1\)个可以竖着切的位置,以及\(m-1\)个可以横着切的位置。对于每一组\(i,j\)\(......
  • 【题解】Educational Codeforces Round 142(CF1792)
    没有手速,再加上被E卡了,废掉了。A.GamingForces题目描述:Monocarp正在玩电脑游戏。他打算杀死\(n\)个怪兽,第\(i\)个的血量为\(h_i\)。Monocarp的角色有两个魔法咒语如下,都可以以任意顺序用任意次(可以不用),每次使用相当于一次操作。选择两个怪兽并各扣一滴血。选择......