[acwing周赛复盘] 第 93 场周赛20230304

news2024/11/20 1:41:29

[acwing周赛复盘] 第 93 场周赛20230304

    • 一、本周周赛总结
    • 二、 4867. 整除数
      • 1. 题目描述
      • 2. 思路分析
      • 3. 代码实现
    • 三、 4868. 数字替换
      • 1. 题目描述
      • 2. 思路分析
      • 3. 代码实现
    • 四、4869. 异或值
      • 1. 题目描述
      • 2. 思路分析
      • 3. 代码实现
    • 六、参考链接

一、本周周赛总结

  • 彩笔了,只AC一题。
  • T1模拟,整除向上取整。
  • T2 BFS。这题应该是能AC的,但是一直TLE,就是样例都TLE,特判了也TLE。最后发现把前边一堆import删了就ac了。。看来import是加时间的。
  • T3 分治/01字典树/异或字典树。
  • 在这里插入图片描述

二、 4867. 整除数

链接: 4867. 整除数

1. 题目描述

在这里插入图片描述

2. 思路分析

  • 题目要求整除,且大于n,即最小是n+1的能整除k的数。显然是ceil((n+1) / k)

3. 代码实现

# Problem: 整除数
# Contest: AcWing
# URL: https://www.acwing.com/problem/content/4870/
# Memory Limit: 256 MB
# Time Limit: 1000 ms

import sys

RI = lambda: map(int, sys.stdin.buffer.readline().split())

#       ms
def solve():
    n, k = RI()
    n += 1
    print((n + k - 1) // k * k)


if __name__ == '__main__':
    solve()

三、 4868. 数字替换

链接: 4868. 数字替换

1. 题目描述

在这里插入图片描述

2. 思路分析

这题的教训是:如果在acw卡常,先把import都删干净!

  • 看完题应该立刻想到一些特例,然后BFS即可。
  • 特例:如果x是0或者1,那么n只能是1,否则返回-1.
  • 如果x里有0,那么可以一步到一位数。
  • 只有0才能让数字位数变小,且只能变到一位,特判一下存在0且n==1的情况
  • 其它情况只要n<len(x) 一定无解。
  • 然后bfs即可。

3. 代码实现

# Problem: 数字替换
# Contest: AcWing
# URL: https://www.acwing.com/problem/content/4871/
# Memory Limit: 256 MB
# Time Limit: 1000 ms

import sys
from collections import *

RI = lambda: map(int, sys.stdin.buffer.readline().split())
RS = lambda: map(bytes.decode, sys.stdin.buffer.readline().strip().split())
RILST = lambda: list(RI())
DEBUG = lambda *x: sys.stderr.write(f'{str(x)}\n')




#       ms
def solve():
    n, x = RI()
    ans = 0
    s = str(x)
    if len(s) == n:
        return print(0)
    if '0' in s and n == 1:
        return print(1)
    if n < len(s):
        return print(-1)
    if max(s) == '1':
        return print(-1)
    q = deque([x])
    vis = {x}
    while q:
        ans += 1
        for _ in range(len(q)):
            x = q.popleft()
            s = str(x)
            for i in s:
                y = x * int(i)
                if len(str(y)) == n:
                    return print(ans)
                if y not in vis:
                    vis.add(y)
                    q.append(y)
    print(-1)


if __name__ == '__main__':
    solve()

四、4869. 异或值

链接: 4869. 异或值

1. 题目描述

在这里插入图片描述

2. 思路分析

这题01字典树或者分治都可以。
  • 其实应该立刻想到01字典树的,因为是批量异或的最大值问题。
  • 假设我们要异或的数字是x,最终得到最大值是mx。
  • 建完树后,从高位向下逐层考虑:
    • 如果本层里只有1,那可以让x这一位是1,则mx的这一位可以是0。那么我们往1走,返回递归后的结果即可。
    • 如果只有0,同理。往0走即可。
    • 如果01都有,那么x这位无论是几,mx这位都会取到1,那么我们往01走都要试一下,取那个最小的;别忘记加上本层的1。
  • 恶心之处在于,做这题时,用封装版的TLE了,拆出来后才过的,但也7000ms。

  • 试了下,直接分治是更快的。1700ms。
  • 直接按位考虑,把数字按本位01分组。讨论方法同上。
    • 若只有1的组,那就递归1即可。
    • 若只有0的组,递归0即可。
    • 若都有,则mx这位必是1,递归两边取最小。

3. 代码实现

# Problem: 异或值
# Contest: AcWing
# URL: https://www.acwing.com/problem/content/4872/
# Memory Limit: 256 MB
# Time Limit: 1000 ms

import sys

RI = lambda: map(int, sys.stdin.buffer.readline().split())
RS = lambda: map(bytes.decode, sys.stdin.buffer.readline().strip().split())
RILST = lambda: list(RI())
DEBUG = lambda *x: sys.stderr.write(f'{str(x)}\n')

MOD = 10 ** 9 + 7
PROBLEM = """
"""


class TrieXor:
    def __init__(self, nums=None, bit_len=31):
        # 01字典树,用来处理异或最值问题,本模板只处理数字最低的31位
        # 用nums初始化字典树,可以为空
        self.trie = {}
        self.cnt = 0  # 字典树插入了几个值
        if nums:
            for a in nums:
                self.insert(a)
        self.bit_len = bit_len

    def insert(self, num):
        # 01字典树插入一个数字num,只会处理最低bit_len位。
        cur = self.trie
        for i in range(self.bit_len - 1, -1, -1):
            nxt = (num >> i) & 1
            if nxt not in cur:
                cur[nxt] = {}
            cur = cur[nxt]
            cur[3] = cur.get(3, 0) + 1  # 这个节点被经过了几次
        cur[5] = num  # 记录这个数:'#'或者'end'等非01的当key都行;这里由于key只有01因此用5
        self.cnt += 1

    def find_max_xor_num(self, num):
        # 计算01字典树里任意数字异或num的最大值,只会处理最低bit_len位。
        # 贪心的从高位开始处理,显然num的某位是0,对应的优先应取1;相反同理
        cur = self.trie
        ret = 0
        for i in range(self.bit_len - 1, -1, -1):
            if (num >> i) & 1 == 0:  # 如果本位是0,那么取1才最大;取不到1才取0
                if 1 in cur:
                    cur = cur[1]
                    ret += ret + 1
                else:
                    cur = cur.get(0, {})
                    ret <<= 1
            else:
                if 0 in cur:
                    cur = cur[0]
                    ret += ret + 1
                else:
                    cur = cur.get(1, {})
                    ret <<= 1
        return ret

    def find_max_xor_any(self):
        """计算所有数字异或异或同一数字x时,结果里max的最小值"""

        def dfs(cur, bit):  # 计算当前层以下能取到的最小的最大值
            if bit < 0:
                return 0
            if 0 not in cur:  # 如果这层都是1,那么可以使x的这层是1,结果里的这层就是0,递归下一层即可。
                return dfs(cur[1], bit - 1)
            elif 1 not in cur:  # 如果这层都是0,使x这层是0,递归下一层。
                return dfs(cur[0], bit - 1)
            # 如果01都有,那么x这层不管是几,结果最大值里这层都是1,那么考虑走1还是走0方向,取min后加上本层的值。
            return min(dfs(cur[0], bit - 1), dfs(cur[1], bit - 1)) + (1 << bit)

        return dfs(self.trie, self.bit_len - 1)

    def count_less_than_limit_xor_num(self, num, limit):
        # 计算01字典树里有多少数字异或num后小于limit
        # 由于计算的是严格小于,因此只需要计算三种情况:
        # 1.当limit对应位是1,且异或值为0的子树部分,全部贡献。
        # 2.当limit对应位是1,且异或值为1的子树部分,向后检查。
        # 3.当limit对应为是0,且异或值为0的子树部分,向后检查。
        # 若向后检查取不到,直接剪枝break
        cur = self.trie
        ans = 0
        for i in range(self.bit_len - 1, -1, -1):
            a, b = (num >> i) & 1, (limit >> i) & 1
            if b == 1:
                if a == 0:
                    if 0 in cur:  # 右子树上所有值异或1都是0,一定小于1
                        ans += cur[0][3]
                    cur = cur.get(1)  # 继续检查右子树
                    if not cur: break  # 如果没有1,即没有右子树,可以直接跳出了
                if a == 1:
                    if 1 in cur:  # 右子树上所有值异或1都是0,一定小于1
                        ans += cur[1][3]
                    cur = cur.get(0)  # 继续检查左子树
                    if not cur: break  # 如果没有0,即没有左子树,可以直接跳出了
            else:
                cur = cur.get(a)  # limit是0,因此只需要检查异或和为0的子树
                if not cur: break  # 如果没有相同边的子树,即等于0的子树,可以直接跳出了
        return ans


#    封装成类卡常真是吐了   ms
def solve_tle():
    n, = RI()
    a = RILST()
    trie = TrieXor(bit_len=30)
    for x in a:
        trie.insert(x)
    ans = trie.find_max_xor_any()
    print(ans)


#   7224    ms
def solve1():
    n, = RI()
    a = RILST()
    trie = {}
    for x in a:
        cur = trie
        for i in range(29, -1, -1):
            nxt = (x >> i) & 1
            if nxt not in cur:
                cur[nxt] = {}
            cur = cur[nxt]

    def dfs(cur, bit):  # 计算当前层以下能取到的最小的最大值
        if bit < 0:
            return 0
        if 0 not in cur:  # 如果这层都是1,那么可以使x的这层是1,结果里的这层就是0,递归下一层即可。
            return dfs(cur[1], bit - 1)
        elif 1 not in cur:  # 如果这层都是0,使x这层是0,递归下一层。
            return dfs(cur[0], bit - 1)
        # 如果01都有,那么x这层不管是几,结果最大值里这层都是1,那么考虑走1还是走0方向,取min后加上本层的值。
        return min(dfs(cur[0], bit - 1), dfs(cur[1], bit - 1)) + (1 << bit)

    ans = dfs(trie, 29)
    print(ans)


#     1725   ms
def solve():
    n, = RI()
    a = set(RILST())

    def dfs(a, bit):  # 计算当前层以下能取到的最小的最大值
        if bit < 0:
            return 0
        x, y = [], []
        t = 1 << bit
        for v in a:
            if v & t:
                x.append(v)
            else:
                y.append(v)
        if not x: return dfs(y, bit - 1)
        if not y: return dfs(x, bit - 1)
        # 如果01都有,那么x这层不管是几,结果最大值里这层都是1,那么考虑走1还是走0方向,取min后加上本层的值。
        return min(dfs(x, bit - 1), dfs(y, bit - 1)) + t

    print(dfs(a, 29))


if __name__ == '__main__':
    solve()

六、参考链接

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

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

相关文章

十大经典排序算法【快速了解】

文章目录一、算法分类二、经典排序算法总览三、算法复杂度四、代码实现一、算法分类 十种常见排序算法可以分为两大类&#xff1a; 比较类排序&#xff1a; 通过比较来决定元素间的相对次序由于其时间复杂度不能突破O(nlogn)&#xff0c;因此也称为非线性时间比较类排序。 非…

电视剧《狂飙》太过诡异,主演各个悄无声息,龙套演员却身价倍增

说起电视剧《狂飙》&#xff0c;相信很多人都有过观看&#xff0c;这部以反腐为题材的大剧&#xff0c;尺度之大近年来绝无仅有。不过观众在被剧情震撼的同时&#xff0c;也发现了一些诡异的事情&#xff0c;比如说主角和配角的反差&#xff0c;让人感觉很不适应。 在电视剧《狂…

51单片机入门————数码管显示

我们在马路上看到的红绿灯&#xff0c;就是由数码管来实现的&#xff0c;就是其中可能加入了一些延时和转换数码管是通过控制138译码器与74HC245来控制数码管的亮灭与数字的显示电路原理图我们先讨论一个数码管数码管有共阳极和共阴极&#xff0c;我们现在使用的STC89C52是共阴…

DataX入门

目录 1. DataX介绍 2. DataX支持的常用数据源类型 3. 设计理念 4. DataX框架设计 4.1. Reader 4.2. Writer 4.3. Framework 5. DataX的运行流程 6. DataX与Sqoop对比 7. 部署 8. 配置详解 9. 案例 同步MySql到HDFS 9.1. 整体结构 9.2. mySqlReader 9.2.1. …

C语言函数:字符串函数及模拟实现strncpy()、strncat()、strncmp()

C语言函数&#xff1a;字符串函数及模拟实现strncpy()、strncat()、strncmp() 在了解strncpy、strncat()、前&#xff0c;需要先了解strcpy()、strncat()&#xff1a; C语言函数&#xff1a;字符串函数及模拟实现strlen() 、strcpy()、 strcat()_srhqwe的博客-CSDN博客 strncp…

包装类详解(装箱,拆箱)

Object 引用可以指向任意类型的对象&#xff0c;但有例外出现了&#xff0c;8 种基本数据类型不是对象&#xff0c;那岂不是刚才的泛型机制要失效了&#xff1f;&#xff08;泛型详解._阿瞒有我良计15的博客-CSDN博客&#xff09; 实际上也确实如此&#xff0c;为了解决这个问题…

数据结构与算法-二叉树-序列化与反序列化

可能性探究:我们可以想到的是只有一棵树按照某个序是唯一确定要给结构的情况才可能被序列化和反序列化&#xff0c;比如我们对于以下的二叉树可以找到它的先序、中序、后序如下&#xff1a; 根据它的先序和后序我们找不到任何其他可能的树&#xff0c;所以可以根据先序和后序去…

NLP预训练模型

Models Corpus RoBERTa: A Robustly Optimized BERT Pretraining Approach 与BERT主要区别在于&#xff1a; large mini-batches 保持总训练tokens数一致&#xff0c;使用更大的学习率、更大的batch size&#xff0c;adam β20.98\beta_20.98β2​0.98&#xff1b;dynamic ma…

aws eks 集群初始化过程中pause容器的启动逻辑

eks集群默认策略在磁盘使用量达到threshold时会清除镜像&#xff0c;其中pause镜像也可能会被清除 https://aws.amazon.com/cn/premiumsupport/knowledge-center/eks-worker-nodes-image-cache/ pause容器能够为pod创建初始的名称空间&#xff0c;pod的内的容器共享其中的网络空…

库函数qsort 的模拟实现

在之前了解了库函数qsort的使用之后 我们来模拟实现一下上篇有介绍 qsort的底层实现是快速排序 由于害怕没有人了解过快速排序 我就用大家熟知的冒泡排序进行模拟实现 先来展示完整代码 以下代码为升序排序 如果降序将冒泡排序中的大于号改为小于号就可以了#define _CRT_SECURE…

malloc实现原理探究

2021年末面试蔚来汽车&#xff0c;面试官考察了malloc/free的实现机制。当时看过相关的文章&#xff0c;有一点印象&#xff0c;稍微说了一点东西&#xff0c;不过自己感到不满意。今天尝试研究malloc的实现细节&#xff0c;看了几篇博文&#xff0c;发现众说纷纭&#xff0c;且…

MySql启动错误(Mac系统 安装 mysql-8.0.32-macos13-arm64 后每次点击启动 无法启动) --- 已解决

MySql启动的时候: 立即变红! 查看日志如下: 2023-03-04T14:18:01.089671Z 0 [System] [MY-010910] [Server] /usr/local/mysql/bin/mysqld: Shutdown complete (mysqld 8.0.32) MySQL Community Server - GPL. 2023-03-04T14:18:10.304169Z 0 [System] [MY-010116] [Server]…

【EDA工具使用】——VCS和Verdi的联合仿真的简单使用

目录 1.芯片开发所需的工具环境 2.编译仿真工具 3.三步式混合编译仿真&#xff08;最常用&#xff09;​编辑 4.两步式混合编译仿真​编辑 5.VCS的使用 ​6.verdi的使用 1.产生fsdb文件的两种方法​编辑 1.芯片开发所需的工具环境 2.编译仿真工具 3.三步式混合编译仿真…

按位与为零的三元组[掩码+异或的作用]

掩码异或的作用前言一、按位与为零的三元组二、统计分组1、map统计分组2、异或掩码总结参考资料前言 当a b 0时&#xff0c;我们能够很清楚的知道b是个什么值&#xff0c;b 0 - a -a&#xff0c;如果当a & b 0时&#xff0c;我们能够很清楚的知道b是什么值吗&#xf…

Python GUI界面编程-初识

图形用户界面(Graphical User Interface&#xff0c;简称 GUI&#xff0c;又称图形用户接口)是指采用图形方式显示的计算机操作用户界面。与早期计算机使用的命令行界面相比&#xff0c;图形界面对于用户来说在视觉上更易于接受。然而这界面若要通过在显示屏的特定位置&#xf…

HiveSQL一天一个小技巧:如何精准计算非连续日期累计值【闪电快车面试题】

0 需 求稀疏字段累计求和问题1 问题分析根据图片中数据变换的形式&#xff0c;可以看出是根据字段term补齐数据中缺失的日期&#xff0c;term为连续日期的个数&#xff0c;当为12时&#xff0c;表明由2018-12-21到2019-01-02连续日期个数为12&#xff0c;当补齐日期后&#xff…

sklearn中的逻辑回归

目录 一.名为“回归”的分类器 二.逻辑回归的优点 三.sklearn中的逻辑回归 四.linear_model.LogisticRegression 五.penalty & C(正则化) 六.逻辑回归中的特征工程 1.业务选择 2.PCA和SVD一般不用 3.统计方法可以使用&#xff0c;但不是非常必要 4.高效的嵌入法e…

【vulhub漏洞复现】CVE-2013-4547 Nginx 文件名逻辑漏洞

一、漏洞详情影响版本 Nginx 0.8.41 ~ 1.4.3 / 1.5.0 ~ 1.5.7通过%00截断绕过后缀名的限制&#xff0c;使上传的php内容文件被解析执行。当Nginx得到一个用户请求时&#xff0c;首先对url进行解析&#xff0c;进行正则匹配&#xff0c;如果匹配到以.php后缀结尾的文件名&#x…

2022秋-2023-中科大-数字图像分析-期末考试试卷回忆版

今天晚上刚考完&#xff0c;心累&#xff0c;在这里继续授人以渔(仅供参考&#xff0c;切勿对着复习不看ppt&#xff0c;ppt一定要过两遍)。 注意:往年的经验贴&#xff0c;到此为止&#xff0c;全部作废&#xff0c;一个没考。千万不要只对着复习&#xff0c;SIFT没考&#x…

JavaScript(JS)

一、三种引入方式&#xff1a; 1、内部js 通过script标签嵌入到html里面 <script>alert(hello);</script> 2、外部js 写成一个单独的.js文件&#xff0c;让html引入进来 <script src"app.js"></script> 3、行内js 直接写到html内部 &…