[CF复盘] Codeforces Round 874 (Div. 3) 20230520】

news2024/9/20 18:49:02

[CF复盘] Codeforces Round 874 (Div. 3 20230520

    • 总结
    • A. Musical Puzzle![在这里插入图片描述](https://img-blog.csdnimg.cn/01ab8d835b4343659e8b80680dd9d639.png)
      • 2. 思路分析
      • 3. 代码实现
    • B. Restore the Weather
      • 1. 题目描述
      • 2. 思路分析
      • 3. 代码实现
    • C. Vlad Building Beautiful Array
      • 1. 题目描述
      • 2. 思路分析
      • 3. 代码实现
    • D. Flipper
      • 1. 题目描述
      • 2. 思路分析
      • 3. 代码实现
    • E. Round Dance
      • 1. 题目描述
      • 2. 思路分析
      • 3. 代码实现
    • F. Ira and Flamenco
      • 1. 题目描述
      • 2. 思路分析
      • 3. 代码实现

总结

  • G好像lc出过,F卡一小时,G不想补了。
  • A模拟
  • B贪心
  • C模拟
  • D贪心+分类讨论
  • E贪心+并查集
  • F逆元+前缀乘在这里插入图片描述

A. Musical Puzzle在这里插入图片描述

2. 思路分析

3. 代码实现


PROBLEM = """用长度为2的字符串组合出整个串s,要多少种不同的串
"""


#       ms
def solve():
    n, = RI()
    s, = RS()
    p = set()
    for i in range(n - 1):
        p.add(s[i:i + 2])
    print(len(p))

B. Restore the Weather

链接: B. Restore the Weather

1. 题目描述

在这里插入图片描述

2. 思路分析

3. 代码实现

PROBLEM = """输入n、k和长为n的数组a、b。
a[i]代表第i天预测的气温。
b[i]代表第i天实际气温。但是b被打乱了。
已知每天的abs(预测值-实际值)<=k。
请还原出一个正确的b。数据保证有解
"""
"""贪心思考,优先匹配大的或者小的值即可。由于数据保证有解,k实际没用。
为了代码方便,从大的开始匹配,这样b就可以一直pop
"""


#       ms
def solve():
    n, k = RI()
    a = RILST()
    b = RILST()
    b.sort()
    ans = [0] * n
    for i in sorted(range(n), key=lambda x: -a[x]):
        ans[i] = b.pop()
    print(*ans)

C. Vlad Building Beautiful Array

链接: C. Vlad Building Beautiful Array

1. 题目描述

在这里插入图片描述

2. 思路分析

3. 代码实现


PROBLEM = """输入n和n个正整数a[i]。
构造一个长为n的数组b。
其中b[i]要么等于a[i],要么等于a[i]-a[j]。其中j随便选1~n。
要求b中所有数据奇偶性相同。
"""
"""分别尝试奇数或者偶数即可。
这题灵神还挖掘了更多性质,其实代码可以很短,只讨论最小的奇数即可。
但比赛中没必要深挖,直接写即可"""


#       ms
def solve():
    n, = RI()
    a = RILST()
    even, odd = [], []
    for v in a:
        if v & 1:
            odd.append(v)
        else:
            even.append(v)
    if not even or not odd:
        return print("YES")
    even.sort()
    odd.sort()

    def try_1():
        for i, v in enumerate(a):
            if v & 1:
                continue
            if odd[0] >= v:
                return False
        return True

    def try_2():
        for i, v in enumerate(a):
            if not v & 1:
                continue
            if odd[0] >= v:
                return False
        return True

    if try_1() or try_2():
        return print("YES")
    print("NO")

D. Flipper

链接: D. Flipper

1. 题目描述

在这里插入图片描述

2. 思路分析

3. 代码实现



PROBLEM = """给一个长为n的排列p。你必须做如下操作恰好一次:
1. 选一个子段[l,r],(1<=l<=r<=n)翻转这个段。
2. 把这个段两边的数据交换。即交换[1~l-1],[r+1,n],注意这两段可以为空

输出操作后字典序最大的p
"""
"""贪心,枚举l即可。注意讨论
- 先找最大的数即n的位置pos,让pos作为r,枚举l。若n在最后,则可以作为r,直接翻转到0.
- 若n在0上,由于必须翻转一次,n一定会向后, 那么考虑让n-1到0,方法和前边一样。
---
- 这题也有O(n)的做法。可以看看灵神的视频。
找到pos后,前边段其实是不变的,r翻转后也是不变的。讨论r-1即可。
"""



#       ms
def solve():
    n, = RI()
    p = RILST()
    if n == 1:
        return print(1)
    ans = p[::-1]
    pos = p.index(n)
    if pos:
        ans = max(ans, p[pos+1:]+p[pos:] + p[:pos])
        mx = []
        r = pos
        for l in range(pos):
            mx = max(mx, p[l:r][::-1] + p[:l])
        ans = max(ans, p[pos:] + mx)
    else:
        pos = p.index(n - 1)
        ans = max(ans, p[pos+1:]+p[pos:] + p[:pos])
        mx = []
        r = pos
        for l in range(pos):
            mx = max(mx, p[l:r][::-1] + p[:l])
        ans = max(ans, p[pos:] + mx)

    print(*ans)

E. Round Dance

链接: E. Round Dance

1. 题目描述

在这里插入图片描述

2. 思路分析

3. 代码实现


PROBLEM = """给出n和长为n的数组a[i].其中a[i]是i的一个邻居。
已知每个i其实有2邻居,整体组成多个环。
问最少、最多有几个环。
"""
"""并查集。
直接按已知邻居合并。最后有几个家族,最多就有几个环。
最少怎么讨论呢。
    - 已知的边合并时,若x,y已经在一个环里了,要么是x连过y,要么是z连过y,且z和x已经连接。显然第二种情况会导致这个环闭合。
    - 那么这就可以计算一个封闭的环。先计算出有多少个封闭的环。cc
    - 再计算有多少个点在非封闭的家族里。(这里计算有1个即可,因为是讨论最少),把所有非封闭的点连成1个环。op
    - mn=cc+op
"""



class DSU:
    def __init__(self, n):
        self.fathers = list(range(n))
        self.size = [1] * n  # 本家族size
        self.edge_size = [0] * n  # 本家族边数(带自环/重边)
        self.n = n
        self.setCount = n  # 共几个家族

    def find_fa(self, x):
        fs = self.fathers
        t = x
        while fs[x] != x:
            x = fs[x]
        while t != x:
            fs[t], t = x, fs[t]
        return x

    def union(self, x: int, y: int) -> bool:
        x = self.find_fa(x)
        y = self.find_fa(y)

        if x == y:
            # self.edge_size[y] += 1
            return False
        # if self.size[x] > self.size[y]:  # 注意如果要定向合并x->y,需要干掉这个;实际上上边改成find_fa后,按轶合并没必要了,所以可以常关
        #     x, y = y, x
        self.fathers[x] = y
        self.size[y] += self.size[x]
        self.edge_size[y] += 1 + self.edge_size[x]
        self.setCount -= 1
        return True


#       ms
def solve():
    n, = RI()
    a = RILST()
    dsu = DSU(n)

    c = set()  # 环内的点
    vis = set()
    for i, v in enumerate(a):
        if not dsu.union(i, v - 1) and (v - 1, i) not in vis:
            c.add(dsu.find_fa(i))
        vis.add((i, v - 1))

    cc = set()  # 每个环的代表元
    for p in c:
        cc.add(dsu.find_fa(p))
    op = set()  # 不在环的点
    for i in range(n):
        if dsu.find_fa(i) not in cc:
            op.add(i)
            break  # 只要一个就行
    if not op:
        mn = len(cc)
    elif not cc:
        mn = 1
    else:
        mn = len(cc) + 1
    # print(cc,op)
    print(mn, dsu.setCount)

F. Ira and Flamenco

链接: F. Ira and Flamenco

1. 题目描述

在这里插入图片描述

2. 思路分析

3. 代码实现


MOD = 10 ** 9 + 7
PROBLEM = """输入n,m和长为n的数组a[i]。
你需要从中选m个数。其中每两个数都不同,且每两个数的差值严格小于m。
问有多少种方案。下标不同则视为不同方案。
"""
"""逆元/区间乘/乘法原理
看错题很久, 后来发现严格选m个数,且差值小于m,那只能选一段连续的数字。
每个数字有cnt[x]个,那么乘法原理计算即可。剩下的问题就是区间乘怎么弄。
可以滑窗,维护长为m的段,合法情况是段首段尾的值正好差m-1。
每次乘上窗右侧,除去窗左侧出窗的数即可,由于除法不满足同余,因此要乘逆元logn。
但直接预处理前缀乘,就可以O(n)计算每个逆元。
---
赛后卡哈希了,哭了
"""

#       ms
def solve():
    n, m = RI()
    a = RILST()
    cnt = Counter(a)
    b = sorted((k, v) for k, v in cnt.items())
    fact = [1]
    for c,v in b:
        fact.append(fact[-1] * v % MOD)
    inv = [1] * len(fact)
    inv[-1] = pow(fact[-1], MOD - 2, MOD)
    for i in range(len(b) - 1, -1, -1):
        inv[i] = b[i][1] * inv[i + 1] % MOD

    ans = 0
    for i in range(m - 1, len(b)):
        j = i - m + 1
        if j >= 0 and b[j][0] == b[i][0] - m + 1:
            ans = (ans + fact[i + 1] * inv[j]) % MOD

    print(ans % MOD)

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

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

相关文章

FinClip | 2023 年 4 月产品大事记

我们的使命是使您&#xff08;业务专家和开发人员&#xff09;能够通过小程序解决您的关键业务流程挑战。不妨让我们看看在本月的产品与市场发布亮点&#xff0c;看看它们如何帮助您实现目标。 产品方面的相关动向&#x1f447;&#x1f447;&#x1f447; 全新版本的小程序统…

知识图谱实战应用12-食谱领域智能问答系统,实现菜谱问答

大家好,我是微学AI,今天给大家介绍一下知识图谱实战应用12-食谱领域智能问答系统,实现菜谱问答,本项目基于py2neo和neo4j图数据库,将知识图谱应用于菜谱领域。通过构建菜谱知识图谱,实现简单的菜谱食材问答系统。用户可以通过问答系统,快速获取简单的菜谱食材信息。 一…

Vivado综合属性系列之十一 GATED_CLOCK

目录 一、前言 二、GATED_CLOCK 2.1 属性说明 2.2 工程代码 2.3 综合结果 一、前言 在工程设计中&#xff0c;时钟信号通常来源于专用的时钟单元&#xff0c;如MMCM和PLL等。但也存在来自逻辑单元的信号作为时钟&#xff0c;这种时钟信号为门控时钟。门控时钟可以降低时…

Linux下V4l2框架编程_USB摄像头数据采集

Linux内核版本:3.5.0 1.1 V4L2简介 v4L2是针对uvc免驱usb设备的编程框架,主要用于采集usb摄像头等。 这篇文章介绍V4L2框架读取摄像头数据的流程,介绍ioctl常用的命令参数,以及各种摄像头相关的结构体成员含义,最终完成数据采集。 编程模式如下: V4l2支持多种设备,它可…

项目管理PMP好考吗,没有经验?

现在越来越多的产品经理和开发人员也投入到考PMP的大军中&#xff0c;在真实的项目中也会有很多产品经理兼任项目经理的职责&#xff0c;这点还是比较常见的&#xff0c;如果说产品或者开发人员考了PMP证书&#xff0c;本身也会让你在找工作的大军中更具有优势&#xff0c;俗话…

模电基础学习

模拟电路基础 计算机工作原理 用电去控制电,这是计算机工作的核心原理。 电学基础 软件编程更新迭代特别的快,而硬件的学习可能很多年都没有变化,越老越吃香。电路设计好比老中医,学会一个套路就可以用一辈子,因为电路设计是基于物理学原理一直都没有变化过,现在最常用…

SSM编程---Day 01

目录 一、Maven简介 &#xff08;一&#xff09;软件开发中的阶段 &#xff08;二&#xff09;Maven能做什么 &#xff08;三&#xff09;没有使用maven怎么管理依赖 &#xff08;四&#xff09;什么是maven &#xff08;五&#xff09;maven中的概念 二、Maven的核心概…

【面试题】计算机网络面试实战

version&#xff1a;1.0 文章目录 计算机网络网络分层模型&#x1f64e;‍♂️面试官&#xff1a;网络为什么要分层&#xff1f;&#x1f64e;‍♂️面试官&#xff1a;TCP/IP 各层的结构与功能&#xff1f;&#x1f64e;‍♂️面试官&#xff1a;OSI体系模型的结构和功能&…

AI歌手是否能够取代传统歌手,成为主流音乐的新宠?

⭐ “AI歌手”走红背后&#xff1a;谁在训练它&#xff1f;歌迷为何爱听&#xff1f;⭐ 这种新型演艺模式能否获得广泛的市场认可&#xff1f;⭐ AI歌手会取代流行歌手成为主流吗&#xff1f;⭐ AI还在哪些方面有应用呢&#xff1f; 你听过AI歌手吗&#xff1f;近日&#xff0c…

机器学习 | 降维:PCA主成分分析

本文整理自 长路漫漫2021的原创博客&#xff1a;sklearn基础篇&#xff08;九&#xff09;-- 主成分分析&#xff08;PCA&#xff09;李春春_的原创博客&#xff1a;主成分分析&#xff08;PCA&#xff09;原理详解bilibili视频&#xff1a;用最直观的方式告诉你&#xff1a;什…

结构体入门调试技巧

目录 前言&#xff1a; 一.结构体 1.1结构体的初始化和访问 二.结构体传参 三.调试技巧 3.1VS里的版本 3.2调试功能介绍 四.好代码 4.1const修饰指针的两种位置 五.错误分类 ❤博主CSDN:啊苏要学习 ▶专栏分类&#xff1a;C语言◀ C语言的学习&#xff0c;是为我们今…

蓝桥杯2019年省赛——扫地机器人

题目描述 小明公司的办公区有一条长长的走廊&#xff0c;由 NN 个方格区域组成&#xff0c;如下图所示。 走廊内部署了 K 台扫地机器人&#xff0c;其中第 i 台在第Ai​ 个方格区域中。已知扫地机器人每分钟可以移动到左右相邻的方格中&#xff0c;并将该区域清扫干净。 请你…

Java企业级开发学习笔记(4.1)Spring Boot入门程序

该文章主要为完成实训任务&#xff0c;详细实现过程及结果见【http://t.csdn.cn/Qh554】 文章目录 一、使用Maven方式构建Spring Boot项目1.1 创建Maven项目1.2 添加依赖1.3 创建入口类1.4 创建控制器1.5 运行入口类1.6 访问Web页面1.7 修改访问映射路径1.8 定制启动标语1.8.1 …

UE5.1.1C++从0开始(10.作业三)

这次作业量和之前的相比可能会有点大&#xff0c;我先整理一下这次的作业清单&#xff1a; 魔法子弹的飞行声音以及爆炸声音给玩家增加受击的闪亮的效果&#xff0c;和立方体相同的那种增加一个health max的变量&#xff0c;把widget里头的health节点更换为health max节点&…

PythonOCR识别扫描版纯图PDF提取汉字的10大方法,力推RapidOCRPDF 可识别纯图PDF 加密签名的PDF 重点是开源免费,某些方面准确度比百度OCR高

下面实例都以下面的测试样例PDF为实验对象 非纯图可复制pdf 纯图PDF TOP1&#xff1a;RapidOCRPDF 可识别纯图PDF也能识别加密签名的PDF 重点是开源免费 https://github.com/RapidAI/RapidOCRPDF # 基于rapidocr_onnxruntime pip install rapidocr_pdf[onnxruntime]# 基于ra…

多体动力学:哈密尔顿原理的使用

参考资料&#xff1a; HAMILTON’S PRINCIPLE AND HAMILTON’S FORMULATION 原理已经讲得很详细了。如果看不到可以见我的资源&#xff0c;不用积分就可以下载。 步骤&#xff1a; 1.写出拉格朗日表达式 L T − V LT-V LT−V, T T T是系统的动能&#xff0c; V V V是系统的…

二进制安装1.26版本k8s(docker)

文章目录 前言准备工作准备4台虚拟机说明下载对应的二进制包初始化操作CentOS7配置yum源配置免密、修改hostname、关闭防火墙、selinux、关闭swap分区(方便后面进行其它操作)下载软件包并批量安装配置时间同步配置打开文件描述符添加ipvs模块和内核模块 Ubuntu配置apt源配置免密…

【数据结构】---堆排序+TOP-K问题(了解游戏排行底层原理)

文章目录 前言&#x1f31f;一、建堆的两种方式&#xff1a;&#x1f30f;1.1 向上调整建堆(堆排序)&#xff1a;&#x1f4ab;1.1.1 完整代码&#xff1a;&#x1f4ab;1.1.2 流程图(以小堆为例)&#xff1a;升序&#xff1a;建大堆&#x1f4ab;1.1.3 流程图(以小堆为例)&…

python调用海康视频汇聚平台API,获得所有摄像头设备编号、实时播放rtsp地址、回放rtsp地址

目录 1. 需求2. 思路3. 实现3.1. 确保服务器上安装视频汇聚平台&#xff08;iSecure Center&#xff09;3.2. 查看API网关是否安装成功3.3. 分配身份认证信息AK/SK3.4. 利用认证信息&#xff0c;python demo开发 1. 需求 海康视频汇聚平台(综合安防管理平台&#xff08;iSecur…

机器学习之集成学习

一、介绍 集成学习&#xff08;Ensemble Learning&#xff09;是一种机器学习技术&#xff0c;通过结合多个学习器&#xff08;例如决策树、神经网络、支持向量机等&#xff09;的预测结果&#xff0c;来达到更好的分类或回归预测性能。集成学习可以通过降低模型的方差&#x…