CF2039E - Shohag Loves Inversions

news/2024/11/28 12:43:01/文章来源:https://www.cnblogs.com/YipChipqwq/p/-/CF2039E

CF2039E - Shohag Loves Inversions

题面

有一个整数数组 \(a = [0, 1]\),可以重复执行以下操作任意多次:

  • 假设 \(k\) 是当前数组 \(a\) 中的逆序对的个数。
  • \(k\) 插入 \(a\) 中的任意位置,包括开头或结尾。

例如,如果是 \(a = [4, 6, 2, 4]\),那么逆序对数就是 \(k = 3\)。因此,可以在运算后得到以下数组:\([\textbf{3}, 4, 6, 2, 4]\)\([4, \textbf{3}, 6, 2, 4]\)\([4, 6, \textbf{3}, 2, 4]\)\([4, 6, 2, \textbf{3}, 4]\)\([4, 6, 2, 4, \textbf{3}]\)

给定整数 \(n\),请计算在进行运算后可以得到的长度为 \(n\) 的不同数组的个数,对 \(998\\,244\\,353\) 取模。

题解

又是一个经典组合数学问题。

观察发现,一个数组的逆序对数单调不减,因此我们可以按逆序对数对不同序列分类,接下来我们证明任意两个不同数组不可能得到相同数组。

证明

\(p(a)\) 为数组 \(a\) 的逆序对数,每次插入 \(p(a)\) 后,数组逆序对数单调不减,不妨构建一棵决策树,决策树上的边相同的导向下一个数组,不同的导向不同的数组,因为从根开始边的值是单调的,因此导向的数组也两两不同。

所以我们对不同数组插入一个数得到的一定是不同的数组

对于 \(a = [0, 1]\) 暂且不论,不妨考虑 \(a = [-2, -1]\) 的情况。

每次插入一个数,他的值一定大于等于当前数组中最大的数,这个比较显然,留给读者证明。

因此,当大于的时候,插入前 \(i\) 个空位一定会导致数组的逆序对变化,插入最后一个空位(向数组后加入一个数)一定不会使逆序对数变化。

我们不妨设 \(f(i)\) 表示长度为 \(i\)逆序对数不等于数组最大值的不同数组数,\(g(i)\) 表示长度为 \(i\) 的不同数组,记录一个 \(sum(i)\),表示 \(f(i)\) 里的数组可以插入的位置的个数

容易发现,\(f(2) = g(2) = 1\)\(sum(2) = 2\),是起始条件。

对于 \(f(i)\) 的转移可以等价于:

\[f(i) = sum(i) \]

对于 \(sum\) 的转移很显然:

\[sum(i) = sum(i - 1) + f(i - 1) \times i \]

对于 \(g(i)\),由于往最后一个位置直接添加数或者向最大值与逆序对数相同的数组的最大值位置加入一个数不改变逆序对数,所以这一部分的值恰好为上一个状态的不同数组个数,即 \(g(i)\) 的值,其余部分等价于 \(f(i+1)\)

\[g(i) = g(i - 1) + f(i) \]

于是接下来,我们考虑 \(a = [0, 1]\),容易发现,对于上述的转移仅仅只改变了一个部分,也就是 \(f(i)\) 的转移,因为第一次出现了逆序对数小于数组最大值的部分,但是这没有关系。

对于 \(sum(i)\) 而言,我们没有改变 \(sum(i)\) 的递推值,仅仅在 \(f(i)\) 的转移上改变了一部分,即删掉最大值小于逆序对数的数组个数

容易发现这样的数组只有长度为 \(n - 1\) 的数组 \([0, 0, \ldots, 0, 1]\) 向前 \(n - 2\) 个位置插入 \(0\) 得到新的长度为 \(n\) 的数组,这是好计算的,递推式等价于:

\[f(i) = sum(i) - (i - 2) \]

\(g(i)\) 定义修正为:往一个位*直接添加一个不改变逆序对数的数或者向最大值与逆序对数相同的数组的最大值位置加入一个数不改变逆序对数,可以发现前者的条件是唯一的,最大值较小的填写在最列,最大值较大的填写在最位置,这对我们的转移仍然是相同的。

因此可以完成此题,参考代码如下。

#include<bits/stdc++.h>
using namespace std;
const int N = 1e6 + 3, mod = 998244353;
int n, f[N], g[N];void init()
{int sum = 2;f[2] = g[2] = 1;for (int i = 3; i < N; i ++ ){f[i] = (sum - (i - 2) + mod) % mod;(sum += 1ll * f[i] * i % mod) %= mod;g[i] = (g[i - 1] + f[i]) % mod;}
}void solve()
{cin >> n;cout << g[n] << "\n";
}int main()
{ios::sync_with_stdio(false);cin.tie(0), cout.tie(0);init();int T = 1;cin >> T;while (T -- ) solve();return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/842808.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

精准医学 | Scipher Medicine开发的MSRC预测TNFi疗效不佳

#文献速递 #精准医学 #类风湿关节炎++++++++++++++++++1. Scipher Medicine在ACR2024的一篇投稿, 证实了一些人关于"TNFi处方量下降"的担心. 但是可以推测, 相关药监/各种医疗保险可能会高兴. 这也可能会激发我们的好奇心, 即有没有可能开发融合蛋白型TNFi的专用疗效…

VScode配置C语言环境

第一步下载VScode:Visual Studio Code - Code Editing. Redefined 第二步搜索下载VScode插件: ​ C/C++Chinese上面两个插件安装完成后会提示重启VScode完成中文语言设置 第三步配置C语言编译器:https://wwgn.lanzoul.com/iB4US2gj0ayh 密码:8y95 下载完成后解压,这里我选…

Free5GC源码研究(10) - SMF研究(上)

本文研究Session Management Function (SMF)的功能SMF的概念 对于free5gc各NF的研究来到了最终阶段,只剩SMF和AMF两个功能,是时候回顾一下TS23.501中的这几张网络架构图。首先是这一张经典的非漫游情境下各NF的交互架构:这张图里,核心网所有的NF通过SBI总线相连,本质上就…

jquery计数器动画特效

这是一款jquery计数器动画特效。该jquery计数器动画特效使用bootstrap网格系统进行布局,然后通过jQuery animate方法来制作炫酷的计数器动画特效。在线演示 下载使用方法 在页面中引入jquery,bootstrap.min.css和font-awsome.min.css文件。< link href="dist/boots…

小诚因为金铲铲D不到牌破产啦

小诚因为金铲铲D不到牌破产啦 Description 小诚和他身边的朋友最近好像出了点经济问题…… 已知小诚的人际关际网中包含 n* 个人(小诚也在其中),每个人手上现在有ai元,他们可以彼此之间互相借钱,他们只希望在最后手上恰好有 bi 元 众所周知,欠钱容易借钱难,没借到之前是…

代码精简之路-责任链模式

前言 常说c#、java是面向对象的语言,但我们平时都是在用面向过程的思维写代码,实现业务逻辑像记流水账一样,大篇if else的判断;对业务没有抽象提炼、代码没有分层。随着需求变化、功能逐步拓展、业务逻辑逐渐复杂;代码越来越长、if else嵌套越来越多,代码会变成程序员都厌…

vxe-table 使用表格多选数据、复选框多选

在 vxe-table 启用列多选功能,通过参数 column.type = checkbox 设置类型为多选类型就可以了。 官网:https://vxetable.cn<template><div><vxe-grid v-bind="gridOptions"></vxe-grid></div> </template><script> expor…

【QT】使用Qxlsx读取Excel单元格中函数表达式的结果值

【QT】使用Qxlsx读取Excel单元格中函数表达式的结果值 零、起因 是这样的,目前朋友托我写一款模板生成软件,任务是先把他写的程序文件复制一份出来,然后再根据Excel中对应位置的单元格的值,修改程序文件副本中的某些文件。对于读Excel的需求,经过测试,最终选择Qxlsx这款开…

智慧防汛平台在城市生命线安全建设中的应用

随着城市化进程的加快,城市基础设施的复杂性和互联性不断增强,城市生命线的安全管理面临前所未有的挑战。智慧防汛平台作为城市生命线安全建设的重要组成部分,通过现代信息技术提升城市防汛应急管理的智能化水平,保障城市安全。智慧防汛平台的核心功能智慧防汛平台通常集成…

初探RocketMQ架构

目录一、概述二、概览2.1、部署架构图1.生产者(Producer)2.消费者(Consumer)3.代理服务器(Broker Server)4.名字服务(Name Server)2.2 名词解释1.主题(Topic)2.标签(Tag)3.消息(Message)4.拉取式消费(Pull Consumer)5.推动式消费(Push Consumer)6.生产者组(…

库存系统:应用层、领域层、对接层的架构设计

大家好,我是汤师爷~ 大厂对候选人的要求较高,即使是20k薪资的岗位,也期望应聘者能够独立承担工作职责。 对于30-40k薪资的岗位,需要具备独立系统设计和小型架构设计的能力。 技术专家和架构师岗位(30-50k以上)要求应聘者具有带领团队、负责大型系统架构的经验,并且在架构…

分布式锁的实现原理

介绍分布式锁的实现原理。作者:来自 vivo 互联网服务器团队- Xu Yaoming介绍分布式锁的实现原理。 一、分布式锁概述 分布式锁,顾名思义,就是在分布式环境下使用的锁。众所周知,在并发编程中,我们经常需要借助并发控制工具,如 mutex、synchronized 等,来保障线程安全。但…