转载洛谷:23.08.19 普及模拟1 T1
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%的数据
\]
题解
由于\(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\)为例,统计每个元素贡献次数
\]
\]
\]
\]
\]
\]
\]
因此,我们可以得到:
\(i<=n-i+1\)时 区间\([i,n-i+1]\)贡献次数加一
否则 区间\([n-i+1,i]\)贡献次数减一
利用前缀和,求区间和,再除以长度\(len\)就是平均值
最后再乘\(n!\),现在遇到了精度问题
观察下面式子
\]
我们发现利用乘法分配律,式子可变形为
\]
也就等于
\]
用两个数组记录阶乘即可
另外,注意取模,非常重要
以上做法时间复杂度都是\(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);
}
}
转载洛谷:23.08.19 普及模拟1 T1的更多相关文章
- 洛谷 P5594 【XR-4】模拟赛
洛谷 P5594 [XR-4]模拟赛 洛谷传送门 题目描述 X 校正在进行 CSP 前的校内集训. 一共有 nn 名 OIer 参与这次集训,教练为他们精心准备了 mm 套模拟赛题. 然而,每名 OI ...
- 洛谷P3434 [POI2006]KRA-The Disks [模拟]
题目传送门 KRA 题目描述 For his birthday present little Johnny has received from his parents a new plaything ...
- 【题解】洛谷P3952 [NOIP2017TG] 时间复杂度(模拟)
题目来源:洛谷P3952 思路 纯模拟没啥可说的了 果然好复杂 参考了你谷一个40行代码 代码 #include<iostream> #include<cstdio> #inc ...
- 洛谷P3957 跳房子(Noip2017普及组 T4)
今天我们的考试就考到了这道题,在考场上就压根没有思路,我知道它是一道dp的题,但因为太弱还是写不出来. 下来评讲的时候知道了一些思路,是dp加上二分查找的方式,还能够用单调队列优化. 但看了网上的许多 ...
- 洛谷P1086 花生采摘【模拟】
题目描述 鲁宾逊先生有一只宠物猴,名叫多多.这天,他们两个正沿着乡间小路散步,突然发现路边的告示牌上贴着一张小小的纸条:“欢迎免费品尝我种的花生!――熊字”. 鲁宾逊先生和多多都很开心,因为花生正是他 ...
- 洛谷P1056——排座椅(模拟,贪心,排序)
https://www.luogu.org/problem/show?pid=1056 题目描述 上课的时候总会有一些同学和前后左右的人交头接耳,这是令小学班主任十分头疼的一件事情.不过,班主任小雪发 ...
- 洛谷P1039 侦探推理(模拟)
侦探推理 题目描述 明明同学最近迷上了侦探漫画<柯南>并沉醉于推理游戏之中,于是他召集了一群同学玩推理游戏.游戏的内容是这样的,明明的同学们先商量好由其中的一个人充当罪犯(在明明不知情的情 ...
- 2018.08.19 NOIP模拟 change(简单模拟)
Change 题目背景 SOURCE:NOIP2015-SHY-10 题目描述 Alice 和 Bob 又聚在一起了!他们已经厌倦了取石子游戏,现在他们热衷于切题.于是,Alice 找到了一道题让 B ...
- 2018.08.19 NOIP模拟 number(类数位dp)
Number 题目背景 SOURCE:NOIP2015-SHY-10 题目描述 如果一个数能够表示成两两不同的 3 的幂次的和,就说这个数是好的. 比如 13 是好的,因为 13 = 9 + 3 + ...
- 洛谷P4623 [COCI2012-2013#6] BUREK [模拟]
题目传送门 BUREK 格式难调,题面就不放了. 分析: 一道比较有思维难度的模拟题. 首先我们可以想到,对于一个三角形,可以画出一个最小矩形使得这个三角形被完全包围,并且这个矩形的边平行于坐标轴(图 ...
随机推荐
- C#约瑟夫环问题算法
/// <summary> /// 约瑟夫环问题算法 /// </summary> /// <param name="total">总人数< ...
- 安装MicroStation软件、Terrasolid插件的方法
本文介绍在Win10电脑中,安装MicroStation软件与Terrasolid插件合集的详细方法. 首先,我们需要有MicroStation软件与Terrasolid插件合集的安装包:这些 ...
- 3. Oracle数据库异常关闭,导致错误3. Oracle数据库异常关闭,导致错误ERROR: ORA-01034: ORACLE ngt available; ORA-27101: shared memory realm does not exist
之前由于电脑没电,强制关机,导致Oracle数据库异常关闭,再次启动电脑登陆数据库时,发生以下错误: 当我尝试重新启动数据库时,发生错误: 经过查阅资料后得知:缺少INITXE.ORA文件,需要从下图 ...
- 查看正在运行容器的环境变量-寻找容器运行mysql的root密码
查看正在运行容器的环境变量-寻找容器运行mysql的root密码 背景 有一个服务器上面运行着一个长达两年的mysql数据库实例. 因为当时root密码是通过环境变量注入进去的. 现在我想重新连接一下 ...
- [转帖]深入了解 gRPC:协议
https://cn.pingcap.com/blog/grpc 经过很长一段时间的开发,TiDB 终于发了 RC3.RC3 版本对于 TiKV 来说最重要的功能就是支持了 gRPC,也就意味着后面大 ...
- [转帖]MioIO读/写性能测试
https://www.jianshu.com/p/a0a84f91b16f image.png COSBench是Intel团队基于java开发,是一个测试云对象存储系统的分布式基准测试工具,全 ...
- [转帖]Linux内核线程kthread简介【最好的一篇!】
https://zhuanlan.zhihu.com/p/581587583 Linux内核可以看作一个服务进程(管理软硬件资源,响应用户进程的种种合理以及不合理的请求).内核需要多个执行流并行,为了 ...
- 【转帖】Linux中如何取消ln链接?(linuxln取消)
https://www.dbs724.com/163754.html Linux系统使用ln命令可以快速创建链接,ln链接是指把文件和目录链接起来,当改变源时可以快速地改变整个目录下的文件和目录.有时 ...
- [转帖]Prometheus监控系统存储容量优化攻略,让你的数据安心保存!
云原生监控领域不可撼动,Prometheus 是不是就没缺点?显然不是. 一个软件如果什么问题都想解决,就会导致什么问题都解决不好.所以Prometheus 也存在不足,广受诟病的问题就是 单机存储不 ...
- [转帖]一本正经的八卦一下CPU的自主可控
https://zhuanlan.zhihu.com/p/36391482 (2018年的4月16日,美国商务部发布对中兴通讯出口权限禁令,禁止美国企业向其出售零部件,史称"中兴禁运事件&q ...