ABC267G Increasing K Times 题解

做这道题,很有感悟,发篇文。

先给数列从小到大排个序。

接下来设 f i , j f_{i,j} fi,j 表示前 i i i 个数的排列形成 j j j 个上坡的方案数。

接下来考虑转移,分为插入第 i i i 个数后增加上坡和不增加上坡两种情况。

对于不增加的情况,有三种可能:

  • i i i 个数插入在了数列的最前端,有 1 1 1 种方案。
  • i i i 个数插入在了一个上坡的中间,因为上坡中较小的那个数字必定小于第 i i i 个数,形成一个上坡,较大的那个数字必定小于等于第 i i i 个数,不形成上坡,而我们拆散了一个上坡,故没有增加,有 j j j 种方案。
  • i i i 个数插入在了数值相同的数后面,这个记为 s a m e i same_i samei,有 s a m e i same_i samei 种方案。

对于增加的情况,就是减去这三种情况了,不过增加了,就说明原来只有 j − 1 j-1 j1 个上坡,这里和上面不太一样。

整理式子,得:

f i , j = f i − 1 , j − 1 × ( i − j − s a m e i ) + f i − 1 , j × ( 1 + j + s a m e i ) f_{i,j} = f_{i-1,j-1} \times (i - j - same_i) + f_{i-1,j} \times (1 + j + same_i) fi,j=fi1,j1×(ijsamei)+fi1,j×(1+j+samei)

这样就可以 O ( n 2 ) O(n^2) O(n2) 求得了,可以用滚动数组。

#include <bits/stdc++.h>
using namespace std;
long long n, k, a[5005], f[5005], same[5005], sum;
int main() {cin >> n >> k;for (int i = 1; i <= n; i++) {cin >> a[i];}sort(a + 1, a + n + 1);for (int i = 1; i <= n; i++) {if (a[i] == a[i - 1])same[i] = same[i - 1] + 1;}f[0] = 1;for (int i = 1; i <= n; i++) {for (int j = i - same[i]; j >= 1; j--) {f[j] = f[j - 1] * (i - j - same[i]) % 998244353 + f[j] * (1 + j + same[i]) % 998244353;f[j] %= 998244353;}f[0] = f[0] * (1 + same[i]) % 998244353;}cout << f[k] << endl;
}

After Increasing K Times

过了一段时间重新看了一下这道题,发现有几个优化,也顺便介绍一下。

首先,我们发现 n n n 很大,但是数值区间很小,所以考虑使用桶排序,因为数字在 [ 1 , n ] [1,n] [1,n],所以排序复杂度为 O ( n ) O(n) O(n)

然后,我们发现枚举区间可以缩小,因为我们并不是全都需要,简单用一个图表示:

左边是我们需要的值,右边是不需要的。

那么,有用的状态的区间边界很好推算,是 [ k + n − i + 1 , k ] [k+n-i+1,k] [k+ni+1,k],这个优化可以减少接近一半的时间。

以上优化让代码大大提速,获得了洛谷最优解,在 AtCoder 排名第二(截至2022.11.23)。

第一名本人丧心病狂卡常也卡不过,快了 4ms,但是本代码很短,最快代码使用了 IDFT。

#include <stdio.h>
inline int read() {char c = getchar();int sum = 0;while (c < '0' || c > '9') c = getchar();do {sum = (sum << 3) + (sum << 1) + c - '0';c = getchar();} while (c >= '0' && c <= '9');return sum ;
}
int n, k,s[5005],b[5005],t=1;
long long f[5005];
int main() {n=read(),k=read();for (int i = 1; i <= n; i++)b[read()]++;for(int i=1;i<=n&&t<=n;i++){if(b[i])b[i]--,t++;while(b[i])b[i]--,s[t] = s[t - 1] + 1,t++;} f[0] = 1;for (int i = 1; i <= n; i++) {int r=(k>i-s[i])?(i-s[i]):k,l=(k-n+i-1>1)?(k-n+i-1):1;for (int j = r; j >= l; j--) {f[j] = f[j] * (j + s[i] + 1) + f[j - 1] * (i - j - s[i]) ;f[j] %= 998244353;}f[0] = f[0] * (s[i] + 1) % 998244353;}printf("%lld\n",f[k]);return 0;
}

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

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

相关文章

上海亚商投顾:两市成交创年内新高 人工智能再爆发

上海亚商投顾前言&#xff1a;无惧大盘涨跌&#xff0c;解密龙虎榜资金&#xff0c;跟踪一线游资和机构资金动向&#xff0c;识别短期热点和强势个股。 市场情绪 三大指数今日高开高走&#xff0c;沪指震荡反弹逼近3300点&#xff0c;创业板指午后涨超1.7%&#xff0c;科创50指…

《领航优配》暴涨200%牛股,突然闪崩跌停!

今天早盘&#xff0c;A股全体低开高走微幅震荡&#xff0c;主要股指涨跌互现。 盘面上&#xff0c;知识产权、传媒娱乐、网络游戏、医药等板块涨幅居前&#xff0c;半导体、芯片、家用电器、工业母机等板块跌幅居前。北上资金净流出14.71亿元。 上海电影盘中跳水触及跌停&…

九龙证券|三胎概念股拉升…港股跳水,恒生科指重挫近5%

兔年首个交易日&#xff0c;A股迎来开门红&#xff0c;沪指开盘即打破3300点&#xff0c;创业板指一度涨近3%&#xff1b;港股却大幅下挫&#xff0c;恒生科技指数一度跌超5%。 详细来看&#xff0c;A股方面&#xff0c;两市股指全线高开&#xff0c;沪指开盘即打破3300点&…

港联证券|沪指高开低走跌0.16%,3只注册制主板新股涨翻倍

10日&#xff0c;三大指数团体高开&#xff0c;盘中全线下行翻绿&#xff0c;深成指领跌&#xff0c;A股迎来全面注册制&#xff0c;主板注册制第一批10只新股全线飙升&#xff0c;多股盘中触发临停。 上证指数跌0.16%&#xff0c;报3322.17点。深证成指跌0.70%&#xff0c;报1…

【转发+修正】【人工智能】验证码识别(代码)-- 附上训练好的模型

转发博客&#xff1a;[深度学习]验证码识别(代码) ps&#xff1a;原文中有链接提供了github上的项目代码&#xff0c;但是有一点点小问题&#xff08;我在原文评论中已经指出&#xff09;&#xff0c;另外我附上已经训练好的模型&#xff08;直接运行验证码测试.py** 就可以预测…

【NLP】自然语言处理的中间序列建模

&#x1f50e;大家好&#xff0c;我是Sonhhxg_柒&#xff0c;希望你看完之后&#xff0c;能对你有所帮助&#xff0c;不足请指正&#xff01;共同学习交流&#x1f50e; &#x1f4dd;个人主页&#xff0d;Sonhhxg_柒的博客_CSDN博客 &#x1f4c3; &#x1f381;欢迎各位→点赞…

自然语言处理 基于预训练模型的方法 代码解读 [ section 4.1.6, page 77 ]

自然语言处理 基于预训练模型的方法 代码解读 [ section 4.1.6, page 77 ] 自定义神经网络模型的例子&#xff1a;一个简单的多层感知器模型MLP 文件名为 mlp.py # Defined in Section 4.1.6 # Page 77 # 自定义神经网络模型的第一个例子&#xff08;The first example of c…

自然语言处理(基于预训练模型)02NLTK工具集

NLTK是对英文文本数据进行处理的常用工具 1 停用词 1.1 查看停用词 import nltk nltk.download(stopwords) from nltk.corpus import stopwords print(stopwords.words(english)) 2 常用语料库 2.1 未标注语料库 2.1.1 找出古腾堡语料库中的emma原文 gutenberg下载地址&am…

【NLP】介绍几个语言生成的预训练模型

作者 | Chilia 哥伦比亚大学 nlp搜索推荐 整理 | NewBeeNLP 大家好&#xff0c;这里是NewBeeNLP。本篇介绍四个为语言生成设计的预训练模型 -- BART&#xff0c;MASS&#xff0c;PEGASUS&#xff0c;UniLM。其中前三种方法都使用了Transformer Encoder-Dec…

使用ChatGPT+Xmind一键生成思维导图,简直泰裤辣

&#x1f4cb; 个人简介 &#x1f496; 作者简介&#xff1a;大家好&#xff0c;我是阿牛&#xff0c;全栈领域优质创作者。&#x1f61c;&#x1f4dd; 个人主页&#xff1a;馆主阿牛&#x1f525;&#x1f389; 支持我&#xff1a;点赞&#x1f44d;收藏⭐️留言&#x1f4d…

【使用心得】最新版ChatGPT查资料

最新版ChatGPT是一款非常实用的软件&#xff0c;它提供了广泛的辅助工具&#xff0c;可帮助我在各个领域提升工作效率。使用体验更加流畅&#xff0c;界面也相对更加美观。 首先&#xff0c;最新版ChatGPT加强了语言翻译功能&#xff0c;并进一步完善了交互方式&#xff0c;使…

ChatGPT4和低代码来临,程序员面临下岗?

一个网友吐槽道&#xff1a; “ 建站出来了&#xff0c;你们说程序员会失业。 低代码出来了&#xff0c;你们说程序员会失业。 Copilot出来了&#xff0c;你们说程序员会失业。 Chatgpt出来了&#xff0c;你们说程序员会失业 虽然这只是网友的吐槽&#xff0c;但却引起了小编…

ChatGPT时代的得意忘言

David S. Soriano, CC BY-SA 4.0 via Wikimedia Commons 导读&#xff1a; 以ChatGPT为代表的新的人工智能语言模型&#xff0c;具有划时代的意义。一个值得思考的问题是&#xff0c;人工智能具备的测算能力&#xff0c;无法完全等同于人类的判断力。 在《测算与判断&#xff1…

ChatGPT提示词工程进阶教学

ChatGPT提示词工程 1 两种大型语言模型LLM1.1 基础大模型&#xff08;base LLM&#xff09;1.2 指令调优大模型(Instruction Tuned LLM) 2 如何更清晰、具体地书写提示词2.1 在提示词中使用“定界符”2.2 向模型请求结构化的输出2.3 要求模型检查任务条件是否满足2.4 输入多范例…

【花雕学AI】ChatGPT的四大语言处理神器:文本生成、问答、创意生成和内容优化的技巧和实例

引言&#xff1a;ChatGPT是一个人工智能聊天机器人&#xff0c;它可以理解和交流多种语言&#xff0c;例如中文、英文、日文、西班牙语、法语、德语等。它是由OpenAI开发的&#xff0c;基于GPT-3.5和GPT-4这两个大型语言模型。它不仅可以与用户进行对话&#xff0c;还可以根据用…

chatgpt赋能python:Python文本清洗:从混乱到整洁

Python 文本清洗&#xff1a;从混乱到整洁 如果你曾经在处理文本数据时花费了大量时间将信息从混乱的文本中取出来&#xff0c;那么你应该考虑使用 Python 进行文本清洗。Python 是一种易于学习和使用的编程语言&#xff0c;可用于自动化文本清洗流程&#xff0c;实现高效准确…

难逃 AI 的法眼:ChatGPT 文本检测器(ERNIE 文本分类)

★★★ 本文源自AlStudio社区精品项目&#xff0c;【点击此处】查看更多精品内容 >>> 参考项目地址&#xff1a;https://github.com/Hello-SimpleAI/chatgpt-comparison-detection 本项目 Demo 地址&#xff1a;https://aistudio.baidu.com/aistudio/projectdetail…

chatgpt赋能python:Python对文本进行分词

Python对文本进行分词 在自然语言处理&#xff08;NLP&#xff09;领域中&#xff0c;对文本进行分词是一个重要的预处理步骤。分词的目的是将一段文本切割成由词语组成的序列&#xff0c;为后续的处理提供基础。 Python在NLP任务中是广泛使用的编程语言之一&#xff0c;有许…

chatgpt赋能python:Python中文文本预处理

Python中文文本预处理 Python作为一门广泛应用于数据分析、机器学习和人工智能的编程语言&#xff0c;在处理中文文本方面也有不可忽视的优势。但是由于中文特殊性&#xff0c;中文文本预处理也有独特的需求。本文将介绍在Python中进行中文文本预处理的常见操作。 分词 分词…

DeepSpeed Chat: 一键式RLHF训练,让你的类ChatGPT千亿大模型提速省钱15倍

DeepSpeed is a deep learning optimization library that makes distributed training and inference easy, efficient, and effective. www.deepspeed.ai/ DeepSpeed Integration DeepSpeed Chat: 一键式RLHF训练,让你的类ChatGPT千亿大模型提速省钱15倍