[蓝桥复盘] 算法赛内测赛2 20230831

news2024/11/20 4:20:56

[蓝桥复盘] 算法赛内测赛2 20230831

    • 总结
    • 新一与基德的身高大战
      • 1. 题目描述
      • 2. 思路分析
      • 3. 代码实现
    • 肖恩的投球游戏加强版
      • 1. 题目描述
      • 2. 思路分析
      • 3. 代码实现
    • 体育健将
      • 1. 题目描述
      • 2. 思路分析
      • 3. 代码实现
    • 小桥的奇异旋律
      • 1. 题目描述
      • 2. 思路分析
      • 3. 代码实现
    • 区间or划分
      • 1. 题目描述
      • 2. 思路分析
      • 3. 代码实现
    • 六、参考链接

总结

  • 好难啊。
  • T1 数学
  • T2 二维差分模板
  • T3 贪心+树状数组上二分
  • T4 差分模拟
  • T5 贪心+前后缀分解

在这里插入图片描述

新一与基德的身高大战

链接: 新一与基德的身高大战

1. 题目描述

在这里插入图片描述

2. 思路分析

  • 奇数+偶数会造成损失,那么优先把奇数和奇数互相配对即可。

3. 代码实现


def solve():
    n, = RI()
    a = sorted(RILST(), key=lambda x: x & 1)
    b = sorted(RILST(), key=lambda x: x & 1)

    print(sum((x + y) // 2 for x, y in zip(a, b)))

肖恩的投球游戏加强版

链接: 肖恩的投球游戏加强版

1. 题目描述

在这里插入图片描述

2. 思路分析

  • 直接贴模板,二维树状数组或者二维差分即可。

3. 代码实现

class BinTree2DIUPQ:
    """二维树状数组"""

    def __init__(self, m, n):
        self.n = n
        self.m = m
        self.tree = [[0] * (n + 1) for _ in range(m + 1)]

    def lowbit(self, x):
        return x & (-x)

    def _update_point(self, x, y, val):
        m, n, tree = self.m, self.n, self.tree
        while x <= m:
            y1 = y
            while y1 <= n:
                tree[x][y1] += val
                y1 += y1 & -y1
            x += x & -x

    def _sum_prefix(self, x, y):
        res = 0
        tree = self.tree
        while x > 0:
            y1 = y
            while y1 > 0:
                res += tree[x][y1]
                y1 &= y1 - 1
            x &= x - 1
        return res

    def add_interval(self, x1, y1, x2, y2, v):
        self._update_point(x1, y1, v)
        self._update_point(x2 + 1, y1, -v)
        self._update_point(x1, y2 + 1, -v)
        self._update_point(x2 + 1, y2 + 1, v)

    def query_point(self, x, y):
        return self._sum_prefix(x, y)


#       ms
def solve():
    n, m, q = RI()
    tree = BinTree2DIUPQ(n, m)

    for i in range(1, n + 1):
        row = RILST()
        for j, v in enumerate(row, start=1):
            tree.add_interval(i, j, i, j, v)
    for _ in range(q):
        x1, y1, x2, y2, c = RI()
        tree.add_interval(x1, y1, x2, y2, c)

    for i in range(1, n + 1):
        ans = []
        for j in range(1, m + 1):
            ans.append(tree.query_point(i, j))
        print(*ans)

体育健将

链接: 体育健将

1. 题目描述

在这里插入图片描述

2. 思路分析

  • 首先想背包,发现值域1e8,放弃。那肯定是贪心了。
  • 题目特殊点肯定是最后一个比赛可以无视休息,那么考虑枚举每一个比赛作为只取a的那场,看剩余k-ai的时间,能取多少场比赛。
  • 那么按a+b排序,然后在树状数组上二分即可,对于每个i,看前缀<=k-ai能到哪。

3. 代码实现

def lower_bound(lo: int, hi: int, key):
    """由于3.10才能用key参数,因此自己实现一个。
    :param lo: 二分的左边界(闭区间)
    :param hi: 二分的右边界(闭区间)
    :param key: key(mid)判断当前枚举的mid是否应该划分到右半部分。
    :return: 右半部分第一个位置。若不存在True则返回hi+1。
    虽然实现是开区间写法,但为了思考简单,接口以[左闭,右闭]方式放出。
    """
    lo -= 1  # 开区间(lo,hi)
    hi += 1
    while lo + 1 < hi:  # 区间不为空
        mid = (lo + hi) >> 1  # py不担心溢出,实测py自己不会优化除2,手动写右移
        if key(mid):  # is_right则右边界向里移动,目标区间剩余(lo,mid)
            hi = mid
        else:  # is_left则左边界向里移动,剩余(mid,hi)
            lo = mid
    return hi


class BinIndexTree:
    """    PURQ的最经典树状数组,每个基础操作的复杂度都是logn;如果需要查询每个位置的元素,可以打开self.a    """

    def __init__(self, size_or_nums):  # 树状数组,下标需要从1开始
        # 如果size 是数字,那就设置size和空数据;如果size是数组,那就是a
        if isinstance(size_or_nums, int):
            self.size = size_or_nums
            self.c = [0 for _ in range(self.size + 5)]
            # self.a = [0 for _ in range(self.size + 5)]
        else:
            self.size = len(size_or_nums)
            # self.a = [0 for _ in range(self.size + 5)]
            self.c = [0 for _ in range(self.size + 5)]
            for i, v in enumerate(size_or_nums):
                self.add_point(i + 1, v)

    def add_point(self, i, v):  # 单点增加,下标从1开始
        # self.a[i] += v
        while i <= self.size:
            self.c[i] += v
            i += i & -i

    def sum_prefix(self, i):  # 前缀求和,下标从1开始
        s = 0
        while i >= 1:
            s += self.c[i]
            # i -= i&-i
            i &= i - 1
        return s

    def lowbit(self, x):
        return x & -x


#       ms
def solve():
    n, k = RI()
    a = RILST()
    b = RILST()
    ans = 0
    s = BinIndexTree(n)
    ab = sorted(zip(a, b), key=lambda x: x[0] + x[1])
    for i, (x, y) in enumerate(ab, start=1):
        s.add_point(i, x + y)

    for i, (x, y) in enumerate(ab, start=1):
        s.add_point(i, -(x + y))
        p = lower_bound(1, n, lambda y:s.sum_prefix(y) > k-x) - 1
        ans = max(ans, 1 + p - int(p >= i))
        s.add_point(i, x + y)

    print(ans)

小桥的奇异旋律

链接: 小桥的奇异旋律

1. 题目描述

在这里插入图片描述

2. 思路分析

  • 由于是交替,可以考虑枚举正负正负…和负正负正…两种情况。
  • 由于求的是前缀和,但修改的是原数组,因此考虑枚举前缀和,从前向后处理,做差分即可。
  • 对于每个位置,如果它正负性不满足,则调整到1或-1。

3. 代码实现

def solve():
    n, = RI()
    a = RILST()
    p = list(accumulate(a))
    ans = 0

    def get(z):
        d =ans= 0
        for i,v in enumerate(p):
            v += d
            if i %2==z:  # 需求正数
                if v <= 0:
                    x = 1 - v
                    ans += x
                    d += x
            else:  # 需求负数
                if v >= 0:
                    x = v+1
                    ans += x
                    d -= x
        return ans
    print(min(get(1),get(0)))

区间or划分

链接: 区间or划分

1. 题目描述

在这里插入图片描述

2. 思路分析

赛中看错题了,以为是异或,其实是或,那就好想一点。
  • 由于a|b<a+b,那么最小的或和,一定是整个数组或起来的值。
  • 那么每一位上的1一定要在同一组,否则会进位。
  • 考虑能分多少组:发现两组的分界点一定等价于前缀或&后缀或==0。

3. 代码实现

def solve():
    n, = RI()
    a = RILST()
    m = reduce(ior,a)
    p = [0]+list(accumulate(a,ior))
    s = 0
    ans =  0

    for i in range(n-1,-1,-1):
        s |= a[i]
        if s & p[i] == 0:
            ans += 1
    print(m,ans)

六、参考链接

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

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

相关文章

刷新你对Redis持久化的认知

认识持久化 redis是一个内存数据库&#xff0c;数据存储到内存中。而内存的数据是不持久的&#xff0c;要想做到持久化&#xff0c;就需要让redis把数据存储到硬盘上。因此redis既要在内存上存储一份数据&#xff0c;还要在硬盘上存储一份数据。这样这两份数据在理论上是完全相…

掌握Spring框架核心组件:深入探讨IOC、AOP、MVC及注解方式面试指南【经验分享】

目录 引言 一、Spring IOC篇 1.什么是Spring 2.核心概念 3.核心架构 4.什么是控制反转&#xff08;IOC&#xff09; 5.依赖注入&#xff08;DI&#xff09; 二、Spring AOP篇 1.什么是AOP 2.Spring AOP代理机制 3.核心概念 4.通知分类 三、Spring MVC篇 1.什么…

【24考研】:四川大学计算机学院23届874考研考情分析

四川大学计算机学院23届CS考研考情分析 作者&#xff1a;老李 往年都是大佬们做的&#xff0c; 今年正好自己在做公众号这一块&#xff0c; 因此不自量力的承担这个工作&#xff0c;顺便锻炼一点pandas包和plt包的应用能力。 所以形式上我也会仿照一下往年的大佬。 21考情&a…

【Nacos】使用Nacos-Sync同步两个Nacos集群中的数据

Nacos-Sync官方文档&#xff1a;NacosSync 用户手册 介绍 NacosSync是一个支持多种注册中心的同步组件,基于Spring boot开发框架,数据层采用Spring Data JPA,遵循了标准的JPA访问规范,支持多种数据源存储,默认使用Hibernate实现,更加方便的支持表的自动创建更新使用了高效的事…

pg_database中的datlastsysoid

一&#xff0c;关于 pg_database 在 PostgreSQL 中&#xff0c;对于在数据库集群内创建的每个数据库,其关键信息都会被保存到 pg_database 系统表中。 PostgreSQL 确保通过 pg_database 系统表持久化存储每个数据库的属性信息&#xff0c;以方便后续管理和使用。这也让 pg_da…

【广州华锐互动】综合管廊3D可视化管理系统有效解决城市公用设施管理问题

在过去的几十年中&#xff0c;城市化进程不断加速&#xff0c;城市规模不断扩大&#xff0c;人口密度不断增加。这种发展带来了对城市基础设施的巨大需求&#xff0c;尤其是对电力、水、燃气和通信等公用设施的管理和维护。 为了满足这些需求&#xff0c;许多城市开始建设和管理…

如何实现自定义数据库账号密码加解密

背景 在实际的项目开发中我们有时候基于安全考虑需要在项目配置文件中对数据库账号密码做加密处理&#xff0c;这个时候我们就可以使用jasypt这个组件来实现。如果有些项目安全等级要求比较高&#xff0c;可能加密的算法需要自定义或者使用SM4国密算法来实现加解密&#xff0c…

【人工智能】—_逻辑回归分类、对数几率、决策边界、似然估计、梯度下降

文章目录 逻辑回归分类Logistic Regression ClassificationLogistic Regression: Log OddsLogistic Regression: Decision BoundaryLikelihood under the Logistic ModelTraining the Logistic ModelGradient Descent 逻辑回归分类 考虑二分类问题&#xff0c;其中每个样本由一…

【webpack】HMR热更新原理

本文&#xff1a;参考文章 一、HMR是什么&#xff0c;为什么出现 1、出现的原因 之前&#xff0c;应用的加载、更新都是一个页面级别的操作&#xff0c;即使单个代码文件更新&#xff0c;整个页面都要刷新&#xff0c;才能拿到最新的代码同步到浏览器&#xff0c;导致会丢失…

【附安装包】Proteus 8.13安装教程

软件下载 软件&#xff1a;Proteus版本&#xff1a;8.13语言&#xff1a;简体中文大小&#xff1a;447.33M安装环境&#xff1a;Win11/Win10/Win8/Win7硬件要求&#xff1a;CPU2.5GHz 内存4G(或更高&#xff09;下载通道①百度网盘丨下载链接&#xff1a;https://pan.baidu.co…

1992-2022年全国31省市产业升级、产业结构高级化水平面板数据(含原始数据和计算过程)

1992-2022年全国31省市产业升级、产业结构高级化水平面板数据&#xff08;含原始数据和计算过程&#xff09; 1、时间&#xff1a;1992-2022年 2、指标&#xff1a;地区生产总值、第一产业增加值、第二产业增加值、第三产业增加值、第一产业占GDP比重、第二产业占GDP比重、第…

jQuery实现表格最后增加一行和删除最后一行

HTML代码 <div><table><thead><tr><th>成绩表</th></tr></thead><tbody><tr><td>科目</td><td>成绩</td></tr><tr><td>语文</td><td>80</td></…

unittest框架的使用

先简单介绍一下unittest的核心组成部分&#xff1a; 测试夹具&#xff1a;Test Fixture 一般用于执行测试用例的准备或者清理工作&#xff0c;比如测试开始前的数据准备或者测试结束的数据清理等。通过setUp()、tearDown()、setUpClass()、tearDownClass()这四个钩子函数实现了…

YOLOv5目标检测模型训练超参数总结记录

整个YOLO系列的模型除了v1和v2比较古老没有实际项目应用过以外&#xff0c;从v3-v8或多或少都有实践&#xff0c;其中以v5使用频度最高&#xff0c;最早期刚接触YOLO的时候也是一通原理详解学习各种结构可视化&#xff0c;后面实际项目开发越来越多&#xff0c;对于前面的记忆就…

一、Mycat2介绍与下载安装

第一章 入门概述 1.1 是什么 Mycat 是数据库中间件。 1、数据库中间件 中间件&#xff1a;是一类连接软件组件和应用的计算机软件&#xff0c;以便于软件各部件之间的沟 通。 例子&#xff1a;Tomcat&#xff0c;web中间件。 数据库中间件&#xff1a;连接java应用程序和数据库…

解压后的文件丢失怎么恢复?解压文件丢失4种恢复方法

您是否出现过解压文件丢失的情况呢&#xff1f;解压文件通俗易懂地讲就是把压缩好了的文件解开。而有些小伙伴在解压文件以后发现丢失了&#xff0c;这些丢失的文件或许是您重要的img解压文件/rar文件解压/zip解压文件&#xff0c;为了正确解决解压文件丢失问题&#xff0c;下面…

在Visual Studio 2017上配置并使用OpenGL

1 在Visual Studio 2017上配置并使用OpenGL 在GLUT - The OpenGL Utility Toolkit&#xff1a;GLUT - The OpenGL Utility Toolkit中点击“GLUT for Microsoft Windows 95 & NT users”&#xff0c;选择“If you want just the GLUT header file, the .LIB, and .DLL file…

Win7系统电脑开机总出现硬盘自检的简单解决方法

你是不是经常会遇到电脑开机进行硬盘自检&#xff0c;而且每次开机都检查很久不能跳过&#xff1b;怎么才能跳过这一步骤呢&#xff1f;下面教大家如何让Win7系统电脑在开机的时候跳过硬盘自检这一步骤&#xff0c;加快开机时间。 解决步骤&#xff1a; 1、按下“Win R”快捷键…

冠达管理:美联储或已达加息终点,但反弹面临诸多不确定性

本周以来&#xff0c;多项数据显现美国经济正在降温&#xff0c;联邦基金利率期货显现&#xff0c;美联储本轮加息周期或已结束。 于美股而言&#xff0c;正处于高位的货币基金是未来继续上涨的潜在动力。不过&#xff0c;与此前反弹行情的推进力比较&#xff0c;当时的不确定…