CF1349F 【Slime and Sequences】part1
由于本文过长,\(\LaTeX\) 炸了,分两篇,part2
题目描述
定义一个正整数序列为好序列,当且仅当如果某个数 \(k\) 出现过,那么一定有 \(k-1\) 在最后一个 \(k\) 的前面出现过。
对于所有 \(i\in[1,n]\),求出 \(i\) 在所有好序列中出现次数的和
Easy Version:\(n\leq 5000\)
Hard Version:\(n\leq 10^5\)
题解
领略到了国际计数顶尖水平。。
问题转化
有重复元素的正整数序列不好统计,我们试图将它映射到排列上
我们构建一个排列 \(p\),在相邻两个数字之间填入不等号,设 \(p_{1\dots i}\) 中共有 \(num_i\) 个小于号,我们将它映射到 \(a\) 序列:\(a_{p_i}=num_i+1\),则 \(a\) 是一个好序列
证明如下:设 \(i\) 为一个小于号右边的位置,则 \(num_{i-1}+1=num_i\),即 \(a_{p_{i-1}}+1=a_{p_i}\),而由于是小于号,所以 \(p_{i-1}<p_i\),容易发现这正是题目中要求的限制
而对于一个好序列,我们从小到大枚举数值,对于每一个数值,我们将它所在的所有下标从大到小放到数列的后面(初始数列为空),这样我们就完成了从好序列到排列的映射
则容易发现,这是一个双射关系
排列组合推导
这里引入欧拉数:\(\left<\begin{matrix}n\\k\end{matrix}\right>\) 表示长度为 \(n\) 的排列中,相邻数字之间的小于号数目为 \(k\) 的方案数
设 \(ans_k\) 为数字 \(k+1\) 的答案
则 \(ans_k=\sum\limits_{i=\max(k,1)}^n\left<\begin{matrix}i\\k\end{matrix}\right>\dbinom ni(n-i)!\)
什么意思呢?我们枚举产生好序列中 \(k+1\) 这个数字的位置,则前 \(i\) 个数中需要有 \(k\) 个小于号,我们再给前 \(i\) 个数分配标号,剩下的 \(n-i\) 个数随意排列
可是这个算的是排列方案数,而且还算重了
我们考虑证明算重的次数就等于该方案中 \(k+1\) 的出现次数:对于一个排列,它被计算当且仅当 \(i\) 在第 \(k\) 个小于号和第 \(k+1\) 个小于号之间,而这恰好就是 \(k+1\) 的出现次数
\(O(n^2)\) 递推欧拉数即可通过 Easy Version
补一个欧拉数的递推公式:
考虑在长度为 \(n-1\) 的排列中插入一个 \(n\) 得到长度为 \(n\) 的排列
- 在排列的左端插入一个 \(n\),这样不会增加小于号的数量,所以这种情况从 \(\left<\begin{matrix}n-1\\k\end{matrix}\right>\) 转移来
- 在排列的右端插入一个 nn,这样会增加一个小于号,所以这种情况由 \(\left<\begin{matrix}n-1\\k-1\end{matrix}\right>\) 转移来
- 在某一个位置 \(i\) 和 \(i+1\) 中间插入 \(n\),其中 \(P_i<P_{i+1}\),这里会增加一个小于号,同时会破坏原来的一个小于号,所以总的小于号数量是不变的。所以它由 \(\left<\begin{matrix}n-1\\k\end{matrix}\right>\) 转移来,情况数即原排列中小于号的数量为 \(k\) 种
- 在某一个位置 \(i\) 和 \(i+1\) 中间插入 \(n\),其中 $P_i>P_{i+1}$,那么这里会增加一个小于号,从 \(\left<\begin{matrix}n-1\\k-1\end{matrix}\right>\),情况数即大于号的数量即 \((n-2)-(k-1)\),其中 \(n-2\) 表示长度为 \(n-1\) 的排列共有 \(n-2\) 个间隙
所以综上所述,\(\left<\begin{matrix}n\\k\end{matrix}\right>=(k+1)\left<\begin{matrix}n-1\\k\end{matrix}\right>+(n-k)\left<\begin{matrix}n-1\\k-1\end{matrix}\right>\)
下接 part2
CF1349F 【Slime and Sequences】part1的更多相关文章
- CF1349F 【Slime and Sequences】part2
由于本文过长,\(\LaTeX\) 炸了,分两篇,part1 优化 我们假装不会欧拉数的通项式(其实是因为它的通项式不容易继续优化?),使用容斥代替掉欧拉数 设 \(\begin{vmatrix}n\ ...
- 【K8S学习笔记】Part1:使用端口转发访问集群内的应用
本文介绍如何使用kubectl port-forward命令连接K8S集群中运行的Redis服务.这种连接方式有助于数据库的调试工作. 注意:本文针对K8S的版本号为v1.9,其他版本可能会有少许不同 ...
- Part1.2 、RabbitMQ -- Publish/Subscribe 【发布和订阅】
python 目录 (一).交换 (Exchanges) -- 1.1 武sir 经典 Exchanges 案例展示. (二).临时队列( Temporary queues ) (三).绑定(Bind ...
- 【字符串算法3】浅谈KMP算法
[字符串算法1] 字符串Hash(优雅的暴力) [字符串算法2]Manacher算法 [字符串算法3]KMP算法 这里将讲述 [字符串算法3]KMP算法 Part1 理解KMP的精髓和思想 其实KM ...
- 【leetcode 字符串处理】Compare Version Numbers
[leetcode 字符串处理]Compare Version Numbers @author:wepon @blog:http://blog.csdn.net/u012162613 1.题目 Com ...
- 【九度OJ】题目1442:A sequence of numbers 解题报告
[九度OJ]题目1442:A sequence of numbers 解题报告 标签(空格分隔): 九度OJ 原题地址:http://ac.jobdu.com/problem.php?pid=1442 ...
- 【开源】简单4步搞定QQ登录,无需什么代码功底【无语言界限】
说17号发超简单的教程就17号,qq核审通过后就封装了这个,现在放出来~~ 这个是我封装的一个开源项目:https://github.com/dunitian/LoTQQLogin ————————— ...
- 【夯实PHP基础】PHP数组,字符串,对象等基础面面观
本文地址 分享提纲 1.数组篇 2.字符创篇 3.函数篇 4.面向对象篇 5.其他篇 /*************************** 一.数组篇 Begin***************** ...
- 【Java学习系列】第3课--Java 高级教程
本文地址 可以拜读: 从零开始学 Java 分享提纲: 1. Java数据结构 2. Java 集合框架 3. Java泛型 4. Java序列化 5. Java网络编程 6. Java发送Email ...
随机推荐
- Scala 基础(十三):Scala 模式匹配(一)
1 match 应用案例 Scala的模式匹配 案例代码完整: package com.atguigu.base object MatchDemo { def main(args: Array[Str ...
- 数据可视化之powerBI技巧(一)PowerBI可视化技巧:KPI指标动态展示之TOPN及其他
本文来自星友Beau的分享,在进行数据指标的展现时,对关键的少数单独展示,而对剩余的大多数折叠为其他项,是一个很常用的做法.Beau同学通过一个日常的办公场景,详细介绍了PowerBI实现的步骤,值 ...
- Python之爬虫(二十二) Scrapy分布式原理
关于Scrapy工作流程回顾 Scrapy单机架构 上图的架构其实就是一种单机架构,只在本机维护一个爬取队列,Scheduler进行调度,而要实现多态服务器共同爬取数据关键就是共享爬取队列. 分布式架 ...
- 开源|如何开发一个高性能的redis cluster proxy?
文|曹佳俊 网易智慧企业资深服务端开发工程师 背 景 redis cluster简介 Redis cluster是redis官方提供集群方案,设计上采用非中心化的架构,节点之间通过gossip协 ...
- Qt-线程的使用
1 简介 参考视频:https://www.bilibili.com/video/BV1XW411x7NU?p=74 使用多线程的好处:提高应用程序响应速度.使多CPU更加高效.改善程序结构. 在Q ...
- webpack源码-依赖收集
webpack源码-依赖收集 version:3.12.0 程序主要流程: 触发make钩子 Compilation.js 执行EntryOptionPlugin 中注册的make钩子 执行compi ...
- 修改虚拟机中的centos系统分辨率
使用vmware虚拟机安装centos系统,默认分辨都很低,可使用以下方法修改虚拟机中centos系统的分辨率 1,# vi /boot/grub/grub.conf 2,找到 kernel 的那一行 ...
- python 批量重命名文件名字
import os print(os.path) img_name = os.listdir('./img') for index, temp_name in enumerate(img_name): ...
- flask中的endpoint是什么
app.view_functions 是一个字典,里面是存储的是 endpoint 与 视图函数的键值对,如果没指名函数视图的endpoint,默认是函数名,而 url_map 是一个列表,里面是ur ...
- 第九章 Lambda&方法引用
9.1.Lambda表达式 9.1.1.标准格式 (形式参数) -> {代码块} 9.1.2.使用前提 有一个接口并且接口中有且仅有一个抽象方法 9.1.3.常见应用 9.1.3.1.无参无返回 ...