Codeforces Round 987 (Div. 2)

news/2024/11/16 10:07:13/文章来源:https://www.cnblogs.com/zhouruoheng/p/18548998

Codeforces Round 987 (Div. 2) 总结

A

常见的套路,将一个序列变为不下降序列所需要改变的值的最小数量,考虑最大能保留多少个,显然是求最长上升子序列,而这题给出的 \(a\) 序列保证不上升,所以只需要考虑相同长度的一段。

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <vector>
#include <queue>
#include <map>using namespace std;
typedef long long ll;
const int N=55;
int n;
int a[N];
void solve()
{cin>>n;for(int i=1;i<=n;i++) cin>>a[i];int ans=0,len=0;for(int i=1;i<=n;i++){if(a[i]!=a[i-1]) ans=max(ans,len),len=1;else len++;}ans=max(ans,len);cout<<n-ans<<'\n';
}
int main ()
{#ifndef ONLINE_JUDGEfreopen("1.in","r",stdin);freopen("1.out","w",stdout);#endif ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);int T;cin>>T;while(T--) solve();return 0;
}

B

考虑每个数 \(p_i\) 能否移动到 \(i\) 位置。
首先能交换的值只有 \(p_i-1\)\(p_i+1\),显然不能连续移动两次,不然比 \(p_i\) 大或小 \(1\) 的数一定不会到该到的位置。因此最多交换一次。再看是否能交换到自己想要的位置,如果有一个不能,那就不可行。

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <vector>
#include <queue>
#include <map>using namespace std;
typedef long long ll;
const int N=2e5+5;
int n;
int a[N];
void solve()
{cin>>n;for(int i=1;i<=n;i++) cin>>a[i];int st=1;for(int i=1;i<=n;i++){if(a[i]<i&&!(i-a[i]==1&&a[a[i]]==a[i]+1)) st=0;  else if(a[i]>i&&!(a[i]-i==1&&a[a[i]]==a[i]-1)) st=0;}if(st) cout<<"Yes\n";else cout<<"No\n";
}
int main ()
{#ifndef ONLINE_JUDGEfreopen("1.in","r",stdin);freopen("1.out","w",stdout);#endif ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);int T;cin>>T;while(T--) solve();return 0;
}

C

构造题,思路还是比较清晰的。

首先不难想到 \(1,1,2,2,3,3,\dots\) 这样的情况,所以 \(n\) 为偶数时一定成立。

再考虑奇数,由于任意两个相同的馅料之间的距离都要是完全平方数,考虑三个相同的,位置为 \(x,y,z\),满足 \(y-x=a^2\)\(z-y=b^2\)\(z-x=c^2\),且 \(a,b,c\) 都为正整数,因此有 \(c^2=a^2+b^2\)
考虑最小的勾股数 \(3,4,5\)。令 \(x=1,y=10,z=26\),这样剩下的位置就是偶数个,比较好构造了。下面给出一种构造方案:

\[ 1,2,2,3,3,4,4,5,5,1,6,6,7,7,8,8,9,9,10,10,11,11,12,13,13,1,12,\dots \]

后面就按偶数的接下去就行了。

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <vector>
#include <queue>
#include <map>using namespace std;
typedef long long ll;
const int N=2e5+5;
int n;
int a[N];
void solve()
{cin>>n;if(n%2==0){int cnt=1;for(int i=1;i<=n;i+=2) a[i]=a[i+1]=++cnt;}else {if(n>=27){a[1]=a[10]=a[26]=1;int cnt=1;for(int i=2;i<=8;i+=2) a[i]=a[i+1]=++cnt;for(int i=11;i<=21;i+=2) a[i]=a[i+1]=++cnt;a[23]=a[27]=++cnt;a[24]=a[25]=++cnt;for(int i=28;i<=n;i+=2) a[i]=a[i+1]=++cnt;}else {cout<<-1<<'\n';return ;}}for(int i=1;i<=n;i++) cout<<a[i]<<' ';cout<<'\n';
}
int main ()
{#ifndef ONLINE_JUDGEfreopen("1.in","r",stdin);freopen("1.out","w",stdout);#endif ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);int T;cin>>T;while(T--) solve();return 0;
}

D

赛时的清奇想法。

首先发现能跳跃的两个位置是逆序对,因此考虑用并查集维护,并记录集合内最大值与最小值。

再考虑这样一种做法,先遍历一遍数组,目前遇到的最大值为 \(x\),下标为 \(id\),加入一个数 \(a_i\)

  • \(a_i>=x\) 更新 \(x\)\(id\)
  • \(a_i<x\) 那么就合并 \(i\)\(id\)

以最后一组样例为例:
img

\(mx_i\) 表示集合 \(i\) 中最大的 \(a_i\)\(mi_i\) 表示最小值。

然后考虑合并不同集合,从后往前,如果出现两个不同集合 \(i,j\)\(i<j\)。由前面的过程易知 \(mx_i \le mx_j\),如果 \(mx_i>mi_j\),就说明这两个集合可以合并。
那有没有可能出现不是相邻的集合合并呢?答案是否定的,考虑 \(k,i,j\) 三个集合,\(mx_k \le mx_i \le mx_j\),如果 \(i\)\(j\) 不能合并,则 \(mx_i \le mi_j\),就会有 \(mx_k \le mx_i \le mi_j\),显然 \(k\)\(j\) 不能合并。因此每个集合都只能和相邻的集合合并。

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <vector>
#include <queue>
#include <map>using namespace std;
typedef long long ll;
const int N=5e5+5;
int n;
int a[N],ans[N];
int fa[N],mi[N],mx[N];
int find(int x)
{if(x==fa[x]) return x;return fa[x]=find(fa[x]);
}
void merge(int x,int y)
{x=fa[x],y=fa[y];fa[y]=x;mi[x]=min(mi[x],mi[y]);mx[x]=max(mx[x],mx[y]);
}
void solve()
{cin>>n;for(int i=1;i<=n;i++) {cin>>a[i];fa[i]=i;mi[i]=mx[i]=a[i];}int x=a[1],id=1;for(int i=2;i<=n;i++) {if(a[i]<x) merge(id,i);else x=a[i],id=i;}for(int i=n-1;i>=1;i--)if(find(i)!=find(i+1)&&mi[find(i+1)]<mx[find(i)])merge(i,i+1);for(int i=1;i<=n;i++) cout<<mx[find(i)]<<' ';cout<<'\n';
}
int main ()
{#ifndef ONLINE_JUDGEfreopen("1.in","r",stdin);freopen("1.out","w",stdout);#endif ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);int T;cin>>T;while(T--) solve();return 0;
}

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

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

相关文章

利用PyTorch的三元组损失Hard Triplet Loss进行嵌入模型微调

本文介绍如何使用 PyTorch 和三元组边缘损失 (Triplet Margin Loss) 微调嵌入模型,并重点阐述实现细节和代码示例。三元组损失是一种对比损失函数,通过缩小锚点与正例间的距离,同时扩大锚点与负例间的距离来优化模型。 https://avoid.overfit.cn/post/4b8a8e91f3274f8ca41b…

二分查找 理论 例题

递归代码int binary_search(int arr[],int left,int right,int key){if (left>right){//区间无效return -1;}int mid=left+(right-left)/2; //直接平均可能会溢出if(arr[mid]==key){return mid;}else if(key>arr[mid]){return binary_search(arr,mid+1,right,key); //右半…

统信 UOS 操作系统介绍

一、前言 近年来,软件国产化的呼声越来越高,而操作系统国产化是软件国产化过程中核心的一环,自然也不例外。目前国产操作系统有 统信UOS、麒麟(Kylin) 和 openEuler 等,本篇文章为大家介绍 统信UOS 操作系统,主要包括统信UOS 简介 版本介绍 选择建议与系统展示 总结二、…

经营分析是什么

在当今快速变化的商业环境中,大厂们越来越重视经营分析,这不仅是对企业经营状况的全面诊断,更是实现效益最大化的关键。近期一连有两个大厂(短视频、游戏)的朋友来聊经营分析,着实让我好奇了一下。经营分析这个东西,以往都是传统国企做得多,咋连他们也开始纠结了。 聊完…

2024-2025-1 20241318 《计算机基础与程序设计》第八周学习总结

这个作业属于哪个课程 https://edu.cnblogs.com/campus/besti/2024-2025-1-CFAP(如[2024-2025-1-计算机基础与程序设计])这个作业要求在哪里 https://www.cnblogs.com/rocedu/p/9577842.html#WEEK08这个作业的目标 加入云班课,参考本周学习资源自学教材 计算机科学概论(第七…

零基础入门Hadoop:IntelliJ IDEA远程连接服务器中Hadoop运行WordCount

今天我们来聊一聊大数据,作为一个Hadoop的新手,我也并不敢深入探讨复杂的底层原理。因此,这篇文章的重点更多是从实际操作和入门实践的角度出发,带领大家一起了解大数据应用的基本过程。我们将通过一个经典的案例——WordCounter,来帮助大家入门。简单来说,这个案例的目标…

NOIP2024 前集训:NOIP2024加赛 5

前言music 《浮光》看指尖拨响蝴蝶 扇动一场离别我推开无声岁月 续梦一页你我只是打个照面 可曾有过誓约走进熟悉却 陌生的思念啊……啊……你的眼眸 装满了时间你的身后 拥故事成篇此生如梦 愿细数流年与你同写 沧海桑田浮光掠影 重山彩云间你的伏线 穿越千百年人生不过 恍惚三…

读数据质量管理:数据可靠性与数据质量问题解决之道05数据标准化

数据标准化1. 批处理 1.1. 批处理在一段时间内收集数据,然后将大量数据“批处理”在离散的数据包中 1.2. 直到20世纪10年代中期,批处理都是处理分析型数据最常用的方法 1.3. 批处理比流处理要便宜得多,即使是对时间要求最苛刻的处理需求也足以满足 1.4. 批处理是经过时间考验…

基于C#开源、功能强大、灵活的跨平台开发框架 - Uno Platform

前言 今天大姚给大家分享一个基于C#开源、功能强大、灵活的跨平台开发框架:Uno Platform。通过 Uno Platform,开发者可以利用单一代码库实现多平台兼容,极大地提高了开发效率和代码复用性。项目介绍 Uno Platform是一个基于C#开源、功能强大、灵活的跨平台开发框架,用于快速…

chrony配置/释义

[root@c7-1 ~]# cat /etc/centos-release CentOS Linux release 7.9.2009 (Core)[root@c7-1 ~]# yum -y install chrony [root@c7-1 ~]# vim /etc/chrony.conf # 自带 server 0.centos.pool.ntp.org iburst server 1.centos.pool.ntp.org iburst server 2.centos.pool.ntp…

WPF 打开资源管理器且选中某个文件

本文将和大家介绍如何在 Windows 系统上使用 SHOpenFolderAndSelectItems 方法打开资源管理器且选中给定的文件打开资源管理器且选中某个文件可以使用 cmd 调用 explorer 带上 select 参数,如下面命令行所示 explorer.exe /select,"C:\Folder\file.txt"但有很多情况…

Virtual Box 虚拟机扩容

Virtual Box 虚拟机扩容 扩容有风险,有可能导致磁盘损坏,系统不可用。 需要使用的工具 gparted GParted -- A free application for graphically managing disk device partitions 步骤图解 1.扩大虚拟硬盘的容量2.加载分区工具执行分区操作3.扩展逻辑卷 要扩大 / 分区的空间…