牛客周赛 Round 111

news/2025/9/29 18:09:57/文章来源:https://www.cnblogs.com/alij/p/19119267

https://ac.nowcoder.com/acm/contest/117763

E

在此题中,我们认为数组以从左到右的顺序排列。

对于一个数组 \(a\),小芳定义两个函数 \(L\left( a\right)\)\(R\left( a\right)\) 为:

\(\hspace{23pt} \bullet\)\(L\left(a \right)\):数组中所有满足“大于其侧所有数”的数之和。

\(\hspace{23pt} \bullet\)\(R\left(a \right)\):数组中所有满足“大于其侧所有数”的数之和。

如,设一个数组 \(b = \{2,3,4,3,5,1\}\),则 \(L\left( b\right) = 2+3+4+5 =14\)\(R\left(b\right) = 1+5=6\)

小芳希望小红构造一个长为 \(n\)排列 \(c\),使得 \(L\left(c\right)+R\left(c\right)=k\)。请你帮帮小红。

也就是说大概是这样的:

联想截图_20250929164249

找到最高的位置,记为\(p\),那么\(L(a)\)也就等于\([1,p]\)单调增的所有数相加;\(R(a)\)等于\([p,n]\)从右向左单调增的所有数之和。由于答案要求我们构造一个长度为\(n\)的排列,因此\(n\)肯定会被计算两次,\(n-1\)会被计算一次,所以\(L(a)+R(a)\geq 3\times n-1\)

考虑如何构造:不妨把\(n\)方在最后一个位置,\(n-1\)放在\(n\)前面的位置,然后将构造\(k\)需要的数按大到小放在\(n-1\)的前面,没有用到的数放在\(n-1\)\(n\)的中间即可。对于从\([1,n-2]\)构造\(k-(3\times n-1)\),只需要贪心即可。

void solve() {int n,k;cin >> n >> k;if(k<3*n-1||k>((1+n)*n/2+n)){cout << -1 << endl;return;}k-=3*n-1;vector<int> vis(n+1);vis[n]=vis[n-1]=1;for(int i=n-2;i>=1;i--){if(k>=i){vis[i]=1;k-=i;}}if(k!=0){cout << -1 << endl;return;}vector<int> ans;for(int i=1;i<=n-1;i++){if(vis[i]) ans.push_back(i);}for(int i=1;i<=n-1;i++){if(!vis[i]) ans.push_back(i);}ans.push_back(n);for(int i:ans) cout << i << " ";cout << endl;
}

F

对于一个数组,小苯可以做任意次如下操作:

\(\hspace{23pt} \bullet\) 交换数组中的任意两个元素。

现在小红想要构造一个长为 \(n\) 的排列 \(a\),对所有的 \(a_i\) 都满足 \(a_i \ne i\),使得小苯将数组变为升序的最小操作数为 \(k\)

请你帮帮小红。

题意:现在要求我们构造一个排列,要求对于任意\(a_i\not= i\),且将其变为\(a_i=i\)的最小操作次数为\(k\),一次操作可以交换排列中任意两个元素的位置。

前置知识:置换环

我们考虑这样一个排列:

2 3 4 5 1

将其变为升序的最小操作次数为4次,也就是环的大小减1。我们可以对上面这样一个排列建图:\((i,a_i)\)。我们通过\(dfs\)可以得到\(m\)个连通块,且每个连通块都是一个环,考虑要将这\(m\)个连通块进行交换得到\(n\)个自环的最小操作次数:首先可以知道交换一定是在环内,连通块之间交换一定是不优的;其次连通块内的最小操作次数为\(sz_i-1\),其中\(sz_i\)为第\(i\)个连通块的大小。这个也是很容易证明的。所以我们可以得到结论:最小操作次数\(=\sum_{i=1}^{m}{(sz_i-1)}=\sum_{i=1}^{m}{sz_i}-m=n-m\)

现在要求我们最小操作次数为\(k\),所以连通块的数量一定为\(n-k\),所以我们只需要构造有\(n-k\)个连通块的排列就好。可以按照这样的方式构造一个连通块:对于\([1,m]\),我们要将其构造为一个置换环,只需要让所有元素向左或者右轮循一次就即可,变为\(2,3,4,5,6,\dots,m,1\)

那么答案可以贪心构造,每次选择两个元素进行构造,最后所有元素为一组,可以知道环最多为\(\frac{n}{2}\)个,所以可以先对\(k\)进行边界特判,最小操作次数肯定为\(n-\frac{n}{2}\),最大操作次数为\(n-1\)

void solve() {int n,k;cin >> n >> k;if(k<(n-n/2)||k>n-1){cout << -1 << endl;return;}int l=1,r=2;int m=n-k;vector<int> ans;while(m>1){ans.push_back(r);ans.push_back(l);l=r+1;r=l+1;m--;}//最后一个环r=n;for(int i=l+1;i<=n;i++) ans.push_back(i);ans.push_back(l);for(int i=1;i<=n;i++){cout << ans[i-1] << " \n"[i==n];}
}

再多补一个置换环的题:https://codeforces.com/gym/630599/problem/G

题意为给定一个排列,现在可以交换任意两个元素,问使得排列有恰好一个逆序对的最小操作次数。

很显然答案肯定为这个样子\({2,1,3,4,5,6,\dots,n}\),所以也就是我们将排列变为这个的最小操作次数。由上面的结论,我们可以知道将排列变为\(1,2,3,\dots,n\)的最小操作次数为\(n-m\)\(m\)为置换环的个数,之后再使用用一次将其变为答案这样。

现在只需要考虑会不会存在比这个操作次数更小的情况,我们发现如果恰好\(1和2\)在同一个置换环内,那么答案为\(n-m-1\),否则为\(n-m+1\)

#include <bits/stdc++.h>
using namespace std;
#define inf 1e18
#define endl '\n'
#define int long long
typedef  long long ll;
typedef pair<int, int> pii;
int dx[4] = {1, 0, -1, 0}, dy[4] = {0, 1, 0, -1};
const int N = 2e5 + 9, M = 2e5 + 9, mod = 1e9 + 7;void solve() {int n;cin >> n;vector<int> p(n+1);for(int i=1;i<=n;i++) cin >> p[i];vector<vector<int>> g(n+1);for(int i=1;i<=n;i++){g[i].push_back(p[i]);}//可以使用tarjan进行缩点vector<int> dfn(n+1),low(n+1),color(n+1),inq(n+1);stack<int> stk;int sscnt=0,tot=0;auto tarjan=[&](auto&& self,int u)->void{dfn[u]=low[u]=++tot;stk.push(u);inq[u]=1;for(int v:g[u]){if(!dfn[v]){self(self,v);low[u]=min(low[u],low[v]);}else if(inq[v]){low[u]=min(low[u],dfn[v]);}}if(low[u]==dfn[u]){int v;sscnt++;do{v=stk.top();color[v]=sscnt;stk.pop();inq[v]=0;}while(v!=u);}};for(int i=1;i<=n;i++){if(!dfn[i])tarjan(tarjan,i);}int ans=n-sscnt;if(color[1]==color[2]) ans--;else ans++;cout << ans << endl;
}
/*
5 1 4 3 2
5 1 2->2 1 5
4 3
*/
signed main() {ios::sync_with_stdio(0);cin.tie(0), cout.tie(0);int t = 1;cin >> t;while (t--) {solve();}return 0;
}

但是wa了,为什么呢?考虑有问题,因为答案的形式应该为\(1,2,3,4,5,\dots,n\),只交换其中一对相邻元素的形式,所以我们还需要对每个\((i,i+1)\)考虑是否在同一个置换环内,如果一个都没有,那么答案为\(n-m+1\),否则为\(n-m-1\)

#include <bits/stdc++.h>
using namespace std;
#define inf 1e18
#define endl '\n'
#define int long long
typedef  long long ll;
typedef pair<int, int> pii;
int dx[4] = {1, 0, -1, 0}, dy[4] = {0, 1, 0, -1};
const int N = 2e5 + 9, M = 2e5 + 9, mod = 1e9 + 7;void solve() {int n;cin >> n;vector<int> p(n+1);for(int i=1;i<=n;i++) cin >> p[i];vector<vector<int>> g(n+1);for(int i=1;i<=n;i++){g[i].push_back(p[i]);}//可以使用tarjan进行缩点vector<int> dfn(n+1),low(n+1),color(n+1),inq(n+1);stack<int> stk;int sscnt=0,tot=0;auto tarjan=[&](auto&& self,int u)->void{dfn[u]=low[u]=++tot;stk.push(u);inq[u]=1;for(int v:g[u]){if(!dfn[v]){self(self,v);low[u]=min(low[u],low[v]);}else if(inq[v]){low[u]=min(low[u],dfn[v]);}}if(low[u]==dfn[u]){int v;sscnt++;do{v=stk.top();color[v]=sscnt;stk.pop();inq[v]=0;}while(v!=u);}};for(int i=1;i<=n;i++){if(!dfn[i])tarjan(tarjan,i);}int ans=n-sscnt;bool ok=false;for(int i=1;i<n;i++){if(color[i]==color[i+1]){ok=true;break;}}if(ok) ans--;else ans++;cout << ans << endl;
}
/*
5 1 4 3 2
5 1 2->2 1 5
4 3
*/
signed main() {ios::sync_with_stdio(0);cin.tie(0), cout.tie(0);int t = 1;cin >> t;while (t--) {solve();}return 0;
}

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

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

相关文章

高端母婴网站模板网络营销渠道

云原生专栏大纲 文章目录 准备工作项目结构介绍配置安全测试ConfigMapSecret使用Secret中数据的方式Deployment使用Secret配置Secret加密 kustomize部署清单ConfigMap改造SecretSealedSecretDeployment改造Serviceistio相关资源DestinationRuleGatewayVirtualServiceServiceAc…

OpenLayers地图交互 -- 章节十一:拖拽材料交互详解

OpenLayers地图交互 -- 章节十一:拖拽材料交互详解pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas"…

2025年人工智能与智能装备国际学术会议(AIIE 2025)

2025年人工智能与智能装备国际学术会议(AIIE 2025) 2025 International Conference on Artificial Intelligence and Intelligent Equipment 在这里看会议官网详情 时间:2025年11月7日-9日 地点:中国西安 本轮截稿…

详细介绍:衡石HQL深度解析:如何用类SQL语法实现跨源数据的高效联邦查询?

详细介绍:衡石HQL深度解析:如何用类SQL语法实现跨源数据的高效联邦查询?2025-09-29 18:00 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !important; overflow-x:…

通过IDOR实现权限提升导致未授权用户注入

本文详细介绍了作者在公开漏洞赏金项目中发现的IDOR漏洞,通过修改contactId参数实现权限提升,能够将任意用户添加到设备管理组中,获得了相应的漏洞赏金。通过IDOR实现权限提升导致未授权用户注入 再次问候,我是Oma…

APUE学习笔记之基础知识(一) - Invinc

本文记录《UNIX环境高级编程》第3版中第1章 基础知识 的一些知识点。 包括UNIX体系结构和登录、文件和目录、输入和输出、程序和进程、出错处理、用户标识、信号、时间值、系统调用和库函数等基本概念。本文记录《UNIX…

Syslog日志集成搭建

搭建一个完整的 syslog → Filebeat → Elasticsearch → Kibana 测试环境,详细的分步骤配置手册,包括 Linux (Filebeat) 和 Windows (Elasticsearch + Kibana) 的安装和配置。 部署架构 Filebeat:运行在 Linux 服务…

拿别的公司名字做网站工业互联网平台首先要提高数据的挖掘能力

当string&#xff0c;number函数不被用作构造函数的可以当成转换函数 如 string(false),number(‘3’),boolean([]) Object(3) new number(3); 除了NULL和undefined以外任何值都具有toString()方法 JS 在执行程序的时候会自动检测表达式来进行变量转换。 显示转换变量&#xf…

定义工业生产新范式!网易灵动发布全球首款全域智能无人装载机“灵载”

近日,在全球最具影响力的工程机械盛会——BICES 2025现场,网易旗下工程机械智能化品牌网易灵动隆重召开无人装载机智能解决方案发布会,正式推出全球首款面向全域场景的具身智能无人装载机——“灵载”。 此次发布标…

国有银行人力资源数字化转型的合规突围与效能跃迁

在数字化浪潮下,金融行业正面临深刻变革。作为数字中国建设的重要支撑,国家金融数字化战略明确要求银行体系充分应用数字技术,优化服务模式、提升管理效能。国有银行作为金融体系的中流砥柱,不仅需要驱动外部服务数…

深圳网站商城定制设计邯郸招聘网最新招聘信息2023

本页包含内容&#xff1a; 术语赋值运算符算术运算符组合赋值运算符比较运算符三目运算符空合运算符区间运算符逻辑运算符 运算符是检查、改变、合并值的特殊符号或短语。例如&#xff0c;加号&#xff08;&#xff09;将两个数相加&#xff08;如 let i 1 2&#xff09;。更…

Java 类类型

Note: This article has been written with the assistance of AI.普通类 (Regular Class) 类的定义和基本结构 类的定义语法 [访问修饰符] class 类名 [extends 父类] [implements 接口1, 接口2, ...] {// 成员变量//…

有口碑的南通网站建设潜江资讯网免费发布信息

【SA8295P 源码分析】121 - MAX9295A 加串器芯片手册分析 及初始化参数分析 一、MAX9295A 芯片特性1.1 GPIO 引脚说明1.2 功能模块框图1.3 时序分析1.3.1 GMSL2 Lock Time:25 ms1.3.2 视频初始化延时:1.1ms + 17000 x t(PCLK)1.3.3 High-Speed Data Transmission in Bursts1.…

OpenFeign 继承FeignClient客户端注意事项

问题 起因是希望打印部分FeignClient的日志,不希望修改全局OpenFeign的日志打印。 因此不能使用 feign.client.config.default.logger-level=FULL 也不能使用全局的 @Bean public Logger.Level openFeignFullLog() { …

合肥 网站制作公司建设网站费用如何入帐

合合信息亮相CSIG AI可信论坛&#xff0c;全面拆解视觉内容安全的“终极防线”&#xff01; &#x1f42f; AI伪造泛滥&#xff0c;我们还能相信“眼见为实”吗&#xff1f; 近期&#xff0c;由中国图象图形学学会主办的CSIG青年科学家会议 AI可信论坛在杭州成功举办。本次论…

详细介绍:Redis 核心数据类型:从命令、结构到实战应用

详细介绍:Redis 核心数据类型:从命令、结构到实战应用2025-09-29 17:44 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; …

青海个人旅游网站建设抖音代运营工作怎么样

安装gdal 安装gdal&#xff0c;真是一波三折哇。pip、conda、c编译了等等&#xff0c;网上各种大佬的解决方法都试了试。咱就是说&#xff0c;都不行&#xff0c;很扯淡。甚至 使用conda install gdal 都显示安装成功了&#xff0c;但是 from osgeo import gdal&#xff1b; i…

9月29日

学习了java中的方法,讲解了使用静态导入和类方法的编写,以及如何生成随机数、怎样处理大数字浮点数,在课堂测试中编写生成四则运算题目程序

服装网站开发项目计划书电子工程王粟

简介&#xff1a; 快速排序也采用的是分而制之的思想。那么快速排序和归并排序的区别在什么地方呢&#xff1f; 归并排序是将所有的元素拆分成一个个排好序的数组&#xff0c;然后将这些数组再进行合并。 而快速排序虽然也是拆分&#xff0c;但是拆分之后的操作是从数组中选出一…

做网站一般会出现的问题wordpress 个人公众号

首先&#xff0c;为什么各种浏览器会产生兼容性问题&#xff1f; 产生这个问题的主要原因是市面上的浏览器的种类很多&#xff0c;但由于不同的浏览器的内核不一致&#xff0c;从而导致各个浏览器对网页的解析就产生了差异。 对于解决浏览器兼容性问题&#xff0c;我们要从三…