首页 > 其他分享 >OJ周赛第三场——最大和数列

OJ周赛第三场——最大和数列

时间:2022-11-07 15:45:13浏览次数:64  
标签:周赛 cnt OJ 最大值 元素 例子 数组 序列 第三场

最大和数列  

问题描述 

给定一个长为 m的序列b

你需要构造出一个序列A满足:对于所有 1≤i≤m,i 在 A 中出现了bi次

定义f(A) 的值如下:

image.png

求满足条件的 f(A)的最大值,及在取最大值时有多少种序列 A

 

输入 

输入第一行包含一个整数m(1≤m≤5⋅10^5)--数组b的大小。

第二行包含m个整数b1,b2,...,bm(1≤ci≤106)--数组b。 

输出

打印两个整数--f(A)的最大可能值和有此值的数组A的数量。

由于两个答案都可能太大,所以打印它们的模数对10^9+7取模;

 

输入例子 1 

6
1 1 1 1 1 1

输出例子 1

0 720

输入例子 2 

1
1000000

输出例子 2

499833345 1

输入例子 3 

7
123 451 234 512 345 123 451

输出例子 3

339854850 882811119

 

提示

在第一个例子中,所有可能的数组A都是[1, 2, 3, 4, 5, 6]的排列组合。

最大值f(A)=0,有6!=720个这样的数组。

 

先考虑单个元素k,它有x个,它在A中的位置位{p1​,…,px​}。

具体地,我们可以举一个实例:设该元素出现的位置是 {2,3,5,8,9}

于是该元素对f(A) 的贡献是 (3-2)+(5-2)+(8-2)+(9-2)+(5-3)+(8-3)+(9-3)+(8-5)+(9-5)+(9-8)(3−2)+(5−2)+(8−2)+(9−2)+(5−3)+(8−3)+(9−3)+(8−5)+(9−5)+(9−8)。

化简可以得到,2被减了 4 次,3 被减了 2 次,5 被抵消,8 被加了 2 次,9 被加了 4 次。

更进一步推广,我们可以得到该元素对 f(A) 的贡献就是 p1(1-x)+p2(3-x)+……+p_x(x-1)

发现系数是一个公差为2首相为1-x的等差数列。大。

 

那么现在考虑n个元素。我们发现是n个等差为2的等差数列。然后你需要合理分配这些数 到pi上,使得答案最大。

 

事实上,我们并不需要把这个序列生成出来。我们可以使用一个差分数组,存储每个元素在序列中出现的次数。。

那么能求出最大值后。求个数

因为在 A 中的不同元素中,有 cnt个元素为系数数组贡献了 p,所以可行的方案数就是这 cnt 个元素的排列数 cnt!。根据乘法原理,总方案数就是 cnt_1!cnt_2!......cnt_k!

 

答案

#include<bits/stdc++.h>
#define ll long long
using namespace std;
const ll mod=1e9+7;
const int N=1e6+10;
int m,x;
ll fact[N],d[N<<1],ans,cnt=1,now;
ll ask(ll l,ll r){return ((r-l+1)*(l+r)/2)%mod;}  //求l..r的和
int main() 
{
    fact[0]=1;
    for (int i=1;i<N;i++)fact[i]=fact[i-1]*i%mod;
    scanf("%d",&m);
    for(int i=1;i<=m;i++){scanf("%d",&x);d[1000002-x]++,d[1000002+x]--;} //将d偏移
    for(int i=2;i<N<<1;i++) {
        d[i]+=d[i-2];
        ans=(ans+ask(now+1,now+d[i])*(i-1000001))%mod;
        now+=d[i],cnt=(cnt*fact[d[i]])%mod;
    }
    printf("%lld %lld",ans,cnt);
}

 

标签:周赛,cnt,OJ,最大值,元素,例子,数组,序列,第三场
From: https://www.cnblogs.com/hihopkc/p/16866155.html

相关文章

  • OJ周赛第二场——简单问题
    简单问题 问题描述 给定一个正整数n,你需要找出最小的整数k,使得对于大小为k的集合{1,2,⋯,n}的任何子集T,存在两个不同的整数u,v∈T,u是v的一个因子。 输入 ......
  • OJ周赛第二场——逆序对
    逆序对 问题描述 给你一个长度为n的排列的置换p(长度为n的排列的置换的定义为:对于排列1,2,3....n,你可以多次交换两个数后的序列。比如(1,5,4,2,3)是一个排列的置换,(3,2......
  • lc 第318场周赛
    第一次参加我激动的心颤抖的手勉勉强强提交了第一题磕磕绊绊到达并最终倒在了第二题>-<[6229.对数组执行操作]classSolution{public:vector<int>applyO......
  • pat春季模拟考试+acwing第76周赛+AT276
    pat:模考58分,相较夏季赛差了不少1.模拟给定一个字符串,要求按照得分点和失分点进行模拟,求最后得分即可模拟比较难写参考小柳学渣大神的代码,大神码风和思路都很好1#i......
  • LeeCode 318周赛复盘
    T1:对数组执行操作思路:模拟publicint[]applyOperations(int[]nums){intn=nums.length;for(inti=0;i<n-1;++i){if(nums[i]==nums[i+1......
  • 视频播放-videojs
    视频播放-video-js组件安装yarnaddvideo.js--savenpminstallvideo.js--save代码importReact,{useEffect,useRef}from'react';importVideoJsfr......
  • Acwing76场周赛
    题目链接这次还是只做出来两道题,前两题都挺简单的,注意第二题需要开longlong不开会wa,代码粘上来,以后可能会看吧第一题#include<iostream>#include<string>usingnam......
  • How to create projrect in git
    第一步,在本机选择一个地方,创建一个空目录,如learngit,并进入这个添加的目录:$mkdirlearngit$cdlearngit第二步,通过gitinit命令把这个目录变成Git可以管理的仓库:$git......
  • Project facet Java version 13 is not supported.
    问题导入的文件运行时出现报错:ProjectfacetJavaversion13isnotsupported.大概就是版本不支持,看了下自己的Java版本是1.8的,修改下版本即可运行解决右击文件目录......
  • 6步解决 win7下使用TileStache生成geojson格式的Tiles
      有人说:一个人从1岁活到80岁很平凡,但如果从80岁倒着活,那么一半以上的人都可能不凡。生活没有捷径,我们踩过的坑都成为了生活的经验,这些经验越早知道,你要走的弯路就会越少......