首页 > 其他分享 >转载洛谷:23.08.19 普及模拟1 T1

转载洛谷:23.08.19 普及模拟1 T1

时间:2024-02-06 23:44:35浏览次数:29  
标签:p2 p1 23.08 19 sum T1 int 区间 times

Past

题目描述

所有人,都有一段支离破碎的过去。

你有\(n\)段过去的经历,有时顺利,有时不顺,于是你用一个评价值\(a_i\)来描述你的第\(i\)段经历,它们构成了长度为\(n\)的序列\(a\)。你决定对过去进行反思总结,反思深度为\(d\)。如果 \(d\ge 1\),那你就要算出\(a\)的所有子区间的和之和;如果\(d\ge 2\),那你还要算出\(a\)的所有子区间的极差之和;如果\(d\ge 3\),那你也要算出\(a\)的所有子区间的平均值之和。

定义:子区间是指序列中连续的一段;区间和为区间所有数相加的和;区间极差为区间的最大值减去最小值;区间的平均值为区间和除以区间元素个数。

为了输出方便,输出平均值时请乘上\(n!\),所有输出对\(1336363663\)取模。

Input

第一行,两个整数\(n,d\),表示经历的段数、反思的深度。
第二行,\(n\)个整数\(a_i\),表示第\(i\)段经历的评价值。

Output

\(d\)行每行一个整数。第一个(如果有)表示子区间和的和,第二个(如果有)表示子区间极差的
和,第三个(如果有)表示子区间平均值的和乘以\(n!\)。上述均对\(1336363663\)取模。

Examples

past.in

3 3
3 2 5

past.out

32
7
116

共6个子区间,分别为\([3],[2], [5],[3,2],[2,5],[3,2,5]\),区间和分别为\(3,2,5,5,7,10\),和为\(32\);区间
极差分别为\(0,0,0,1,3,3\),和为\(7\);
区间平均值分别为\(3,2,5,\frac{5}{2},\frac{7}{2},\frac{10}{3}\),和为\(\frac{58}{3}\),乘上\(3!=6\)
得到\(116\)。

对于100%的数据

\[1\le n\le 3 \times 10^6,0\le d \le 3,1\le a_i \le 10^9 \]

题解

由于\(n\)较大,\(n^2\)做法都不能过

分情况讨论

当\(d=0\)时 先输入,再直接结束程序即可

当\(d=1\)时 求子区间和

可以统计每个数在所有子区间中出现的次数

每个元素在一个区间内只会出现一次,所以计算\(a_i\)所属的区间个数,以\(3,2,5\)为例,\(2\)所属的区间,左端点一定在2左侧,同理,右端点在2右侧。

我们发现:对于每个\(a_i\)所属区间个数为可能的左右端点数的乘积,即所做贡献为\(i\times (n-i+1)\times a_i\)

当\(d=2\)时 求极差和

对于每个区间,其贡献为\(max-min\)

参考第一种情况,我们可以想到:

每个元素的贡献就是\(a_i\)作为区间最大值的贡献减去作为区间最小值的贡献,只需求出作为最大和最小的区间个数即可

那么怎么求?

依旧采用d1的做法,找出左右端点,区间个数\(s_i=(i-l+1)\times (r-i+1)\)

以\(a_i\)最大值左端点为例,若存在一个\(a_j\)使\(j<i\)且\(a_j>a_i\),\(l_{max,i}=j+1\)否则\(l_{max,i}=1\)

要维护它的单调性,可以使用单调栈

同理,可以用此方法求右端点

注意

如果左区间取数范围是大于等于\(a_i\),那么右区间范围一定是大于\(a_i\),因为数据可能出现相等的\(a_i\)取值错误可能会导致重复或遗漏

样例

2 1 2

当\(d=3\)时 求平均值和

首先,区间长度相同的区间平均值可以合并,考虑枚举长度\(len\)

以\(n=7\)为例,统计每个元素贡献次数

\[n=1 \quad [1,1,1,1,1,1,1] \]

\[n=2 \quad [1,2,2,2,2,2,1] \]

\[n=3 \quad [1,2,3,3,3,2,1] \]

\[n=4 \quad [1,2,3,4,3,2,1] \]

\[n=5 \quad [1,2,3,3,3,2,1] \]

\[n=6 \quad [1,2,2,2,2,2,1] \]

\[n=7 \quad [1,1,1,1,1,1,1] \]

因此,我们可以得到:

\(i<=n-i+1\)时 区间\([i,n-i+1]\)贡献次数加一

否则 区间\([n-i+1,i]\)贡献次数减一

利用前缀和,求区间和,再除以长度\(len\)就是平均值
最后再乘\(n!\),现在遇到了精度问题

观察下面式子

\[(\sum_{i=1}^{n}\frac{sum}{i})\times n! \]

我们发现利用乘法分配律,式子可变形为

\[\sum_{i=1}^{n}\frac{sum\times n!}{i} \]

也就等于

\[\sum_{i=1}^{n}(sum\times (i-1)!\times (\prod_{j=i+1}^{n}j)) \]

用两个数组记录阶乘即可

另外,注意取模,非常重要

以上做法时间复杂度都是\(O(n)\)

码风难看,仅供参考

Code

#include<bits/stdc++.h>
using namespace std;
const int N=5e6;
#define int long long
#define inf 1336363663
int n,d,a[N],sum[N],p[N],q[N],p1,p2,la[N],ra[N],li[N],ri[N],hangry[N],cufeo4[N];

signed main()
{
	freopen("pst.in","r",stdin);
	freopen("pst.out","w",stdout);
	scanf("%lld%lld",&n,&d);
	for(int i=1;i<=n;i++){
		scanf("%lld",&a[i]);
		sum[i]=sum[i-1]+a[i];
		sum[i]%=inf;
	}
	if(d>=1){
		int ans=0;
		for(int i=1;i<=n;i++){
			ans+=(i*a[i])%inf*(n-i+1)%inf;
			ans%=inf;
		}
		printf("%lld\n",ans);
	}
	if(d>=2){
		int ans=0;
		p1=0;p2=0;
		for(int i=1;i<=n;i++){
			while(p1&&a[p[p1]]<a[i])p1--;
			if(a[i]>a[p[1]]||i==1)la[i]=1;
			else la[i]=p[p1]+1;
			p[++p1]=i;
			while(p2&&a[q[p2]]>a[i])p2--;
			if(a[i]<a[q[1]]||i==1)li[i]=1;
			else li[i]=q[p2]+1;
			q[++p2]=i;
		}
		memset(p,0,sizeof(p));
		memset(q,0,sizeof(q));
		p1=0;p2=0;
		for(int i=n;i>=1;i--){
			while(p1&&a[p[p1]]<=a[i])p1--;
			if(a[i]>=a[p[1]]||i==n)ra[i]=n;
			else ra[i]=p[p1]-1;
			p[++p1]=i;
			while(p2&&a[q[p2]]>=a[i])p2--;
			if(a[i]<=a[q[1]]||i==n)ri[i]=n;
			else ri[i]=q[p2]-1;
			q[++p2]=i;
		}
		for(int i=1;i<=n;i++){
			ans+=((i-la[i]+1)*(ra[i]-i+1)-(i-li[i]+1)*(ri[i]-i+1)+inf)%inf*a[i]%inf;
			ans%=inf;
		}
		printf("%lld\n",ans);
	}
	if(d>=3){
		hangry[0]=1;
		cufeo4[n+1]=1;
		for(int i=1;i<=n;i++)
			hangry[i]=(hangry[i-1]*i)%inf;
		for(int i=n;i>=1;i--)
			cufeo4[i]=(cufeo4[i+1]*i)%inf;
		int k=0,ans=0,t=0,kk;
		for(int i=0;i<n;i++){
			int l,r;
			l=i+1;
			r=n-i;
			k+=(sum[r]-sum[l-1])%inf;
			k=(k+inf)%inf;
			ans+=(k*hangry[i])%inf*cufeo4[i+2]%inf;
			ans%=inf;
		}
		printf("%lld\n",ans);
	}
}

标签:p2,p1,23.08,19,sum,T1,int,区间,times
From: https://www.cnblogs.com/abnormal123/p/18010481

相关文章

  • 题解 AT_exawizards2019_e【Black or White】
    设\(P_b(k),P_w(k)\)表示已经吃了\(k\)块巧克力,把所有黑/白巧克力都吃光了的概率。枚举最后一块黑/白巧克力被吃的时间,容易得到:\[\begin{aligned}P_b(k)&=\sum_{i=1}^k\frac{\binom{i-1}{b-1}}{2^i}\\P_w(k)&=\sum_{i=1}^k\frac{\binom{i-1}{w-1}}{2^i}\\\end{aligned}\]......
  • 1219:马走日
    马在中国象棋以日字形规则移动。请编写一段程序,给定n×m大小的棋盘,以及马的初始位置(x,y),要求不能重复经过棋盘上的同一个点,计算马可以有多少途径遍历棋盘上的所有点。马能走的方向不是4个(上下左右),而是8个。有多组数据!!!x,y下标均从0开始#include<bits/stdc++.h>usingname......
  • JOISC 2019 记录
    Day1T1Examination三维数点板子题,直接cdq分治+树状数组,时间复杂度\(O(n\log^2n)\)。Day1T2Meetings对于一个大小为\(n\)的树,我们可以在\(n-2\)的询问中得到某一条我们选定的链\((x,y)\)上的所有节点的集合\(S_0\),以及在断掉这条链之后,得到的若干连通块集合\(S_1,......
  • Oracle Version 19.3.0.0.0 On Windows Hyper-V Server 2019 Try In_Memory
    SQL*Plus:Release19.0.0.0.0-ProductiononTueFeb608:31:432024Version19.3.0.0.0Copyright(c)1982,2019,Oracle. Allrightsreserved.Enteruser-name:/assysdbaConnectedto:OracleDatabase19cStandardEdition2Release19.0.0.0.0-Produc......
  • Windows Server 2019 搭建用户自助修改密码
    一、安装Web服务器(iis)和远程桌面服务1.运行添加角色和功能向导2.选择服务器角色,Web服务器(IIS)和远程桌面服务3.后续全部默认下一步4.勾选“远程桌面Web访问”点击下一步5、点击安装,等待安装完毕6.打开IIS管理页面7.修改‘PasswordChangeEnabled’的值为“trus”8.返回“Pages”主页,......
  • Oracle-创建用户不带C##(19c)
    由于oracle从12c开始引入了容器(PDB和CDB)、租户的概念。直接连接sysdba用户创建新用户时,会默认在CDB中创建公有用户,用户名需要以“C##”或“c##”开头。如果用户名开头不想使用“C##”或“c##”,则需要做如下操作。 (1)使用sysdba管理员用户登录sqlplus/assysdba (2)查看数据......
  • P3219 [HNOI2012] 三角形覆盖问题&P1222 三角形 题解
    严格单$\log$做法,附实现细节和代码。考虑从左往右扫描线,发现每次操作是线段上端点$-1$,插入线段,删除退化成点的线段。如果某时刻一条线段被另一条完全覆盖,那么这条线段显然不会产生贡献,可以删去。最后得到的线段一定是左端点单调递增时,右端点也单调递增,可以用set维护。当两......
  • 文心一言 VS 讯飞星火 VS chatgpt (195)-- 算法导论14.3 3题
    三、用go语言,请给出一个有效的算法,对一个给定的区间i,返回一个与i重叠且具有最小低端点的区间;或者当这样的区间不存在时返回T.nil。文心一言,去掉math,代码正常运行:在Go语言中,你可以使用结构体来表示区间,并使用切片来存储区间集合。然后,你可以遍历区间集合,找到与给定区间重叠且具......
  • [GUET-CTF2019]虚假的压缩包
    [GUET-CTF2019]虚假的压缩包附件里面有两个压缩包虚假的压缩包是伪加密,修改加密位后即可打开里面是一个txt文件,给了一道题目根据给出的提示,判断是普通的RSA,通过脚本解出为5importgmpy2p=gmpy2.mpz(3)q=gmpy2.mpz(11)e=gmpy2.mpz(3)l=(p-1)*(q-1)d=gmpy2.invert(e,l......
  • 在我的VS2019中重新配置2017项目生成的google test 项目
    原来的项目是其他版本的VS配置的,自己下载下来时候,本机也没有装GoogleTest所以用不起。如果重建项目在一个个引入工程代码太麻烦(文件多),所以我就想着有没有什么办法快捷配置,不用重建工程以下是我的一个配置方法,供大家交流学习:1.首先你本机要安装上GoogleTest,安装方法自查;2.如......