[acwing周赛复盘] 第 110 场周赛20230701

news2024/12/24 21:59:50

[acwing周赛复盘] 第 110 场周赛20230701

    • 总结
    • 5044. 求和
      • 1. 题目描述
      • 2. 思路分析
      • 3. 代码实现
    • 5045. 三角形数
      • 1. 题目描述
      • 2. 思路分析
      • 3. 代码实现
    • 5046. 智商药
      • 1. 题目描述
      • 2. 思路分析
      • 3. 代码实现
    • 六、参考链接

总结

  • 状态不对,把自己写懵了。
  • T1 模拟币
  • T2 对向双指针/两数之和。
  • T3 树状数组优化dp。
  • 在这里插入图片描述
    在这里插入图片描述

5044. 求和

链接: 5044. 求和

1. 题目描述

在这里插入图片描述

2. 思路分析

  • 模拟。

3. 代码实现

# Problem: 求和
# Contest: AcWing
# URL: https://www.acwing.com/problem/content/5047/
# Memory Limit: 256 MB
# Time Limit: 1000 ms

import sys
import random
from types import GeneratorType
import bisect
import io, os
from bisect import *
from collections import *
from contextlib import redirect_stdout
from itertools import *
from array import *
from functools import lru_cache, reduce
from heapq import *
from math import sqrt, gcd, inf
if sys.version >= '3.8':  # ACW没有comb
    from math import comb

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')
# print = lambda d: sys.stdout.write(str(d) + "\n")  # 打开可以快写,但是无法使用print(*ans,sep=' ')这种语法,需要print(' '.join(map(str, p))),确实会快。

DIRS = [(0, 1), (1, 0), (0, -1), (-1, 0)]  # 右下左上
DIRS8 = [(0, 1), (1, 1), (1, 0), (1, -1), (0, -1), (-1, -1), (-1, 0),
         (-1, 1)]  # →↘↓↙←↖↑↗
RANDOM = random.randrange(2**62)
MOD = 10**9 + 7
# MOD = 998244353
PROBLEM = """
"""


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


def bootstrap(f, stack=[]):

    def wrappedfunc(*args, **kwargs):
        if stack:
            return f(*args, **kwargs)
        else:
            to = f(*args, **kwargs)
            while True:
                if type(to) is GeneratorType:
                    stack.append(to)
                    to = next(to)
                else:
                    stack.pop()
                    if not stack:
                        break
                    to = stack[-1].send(to)
            return to

    return wrappedfunc


#       ms
def solve():
    n,s = RI()
    a = RILST()
    if sum(a) == s:
        print('YES')
    else:
        print('NO')


if __name__ == '__main__':
    t = 1
    if t:
        t, = RI()
        for _ in range(t):
            solve()
    else:
        solve()

5045. 三角形数

链接: 5045. 三角形数

1. 题目描述

在这里插入图片描述

2. 思路分析

  • 题意转化一下:有一个数列数字均为n(n+1)//2,求从中找两个数加起来等于x。
  • 那么显然就是两数之和的双指针思路,从左右两边同时指针寻找,和大就动右指针,和小动左指针。

3. 代码实现

def solve():
    n, = RI()
    l, r = 1, int((2 * n) ** 0.5)
    while l <= r:
        x = l * (l + 1) // 2 + r * (r + 1) // 2
        if x == n:
            return print('YES')
        elif x < n:
            l += 1
        else:
            r -= 1
    print('NO')

5046. 智商药

链接: 5046. 智商药

1. 题目描述

在这里插入图片描述

2. 思路分析

  • 手玩一下发现,首先数据里必须有l0和rn,否则没有方案数。不过实现时到时不用管这个条件。
  • 仔细想一下,对于一种药(l,r)来讲,吃它只能到达状态r,需要从[l,r-1]这个连续状态转移而来。这里边所有数字都应该是前边一种药的r。
  • 那么按照r排序,状态就满足无后效性了,发现每个状态的前驱状态都是连续的,可以用区间求和方法来优化。比如树状数组。
  • 用树状数组来当dp数组。
  • 令dp[i]为吃到第i种药的方案数,那么dp[i] = sum(dp[x,y]),其中x,y为对应右端点在[l,r-1]区间的药的下标。

3. 代码实现

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
            self.c[i] %= MOD
            i += i & -i

    # def set_point(self, i, v):  # 单点修改,下标从1开始 需要先计算差值,然后调用add
    #     self.add_point(i, v - self.a[i])
    #     self.a[i] = v

    def sum_interval(self, l, r):  # 区间求和,下标从1开始,计算闭区间[l,r]上的和
        return (self.sum_prefix(r) - self.sum_prefix(l - 1)) % MOD

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

    def min_right(self, i):
        """寻找[i,size]闭区间上第一个正数(不为0的数),注意i是1-indexed。若没有返回size+1;复杂度O(lgnlgn)"""
        p = self.sum_prefix(i)
        if i == 1:
            if p > 0:
                return i
        else:
            if p > self.sum_prefix(i - 1):
                return i

        l, r = i, self.size + 1
        while l + 1 < r:
            mid = (l + r) >> 1
            if self.sum_prefix(mid) > p:
                r = mid
            else:
                l = mid
        return r

    def kth(self, s):
        """返回<=s的最小下标"""
        pos = 0
        for j in range(18, -1, -1):
            if pos + (1 << j) <= self.size and self.c[pos + (1 << j)] <= s:
                pos += (1 << j)
                s -= self.c[pos]
        return pos

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


#       ms
def solve():
    n, m = RI()
    a = []
    for _ in range(m):
        a.append(RILST())

    a.sort(key=lambda x: x[1])
    b = [y for _, y in a]
    f = BinIndexTree(m)
    ans = 0
    for i, (l, r) in enumerate(a, start=1):
        x = bisect_left(b, l) + 1
        y = bisect_right(b, r - 1) - 1 + 1
        if x <= y:
            f.add_point(i, f.sum_interval(x, y))
        if l == 0:
            f.add_point(i, 1)

        if r == n:
            ans = (ans + f.sum_interval(i, i)) % MOD
    print(ans)

六、参考链接

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

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

相关文章

关于Linux同步机制知识点整理

在Linux系统中&#xff0c;同步机制是操作系统中非常重要的一部分&#xff0c;以下是一些基本要点&#xff1a; 互斥锁 互斥锁是一种「独占锁」&#xff0c;比如当线程 A 加锁成功后&#xff0c;此时互斥锁已经被线程 A 独占了&#xff0c;只要线程 A 没有释放手中的锁&#…

梁宁:VisionPro、GPT、Web3三件套齐备,元宇宙开启

本文内容整理自图灵社区对谈栏目直播&#xff0c;主题为 ChatGPT 真需求&#xff0c;从产品的第一性原理解析。 上篇内容回顾&#xff1a;梁宁&#xff1a;为什么中国没有像 ChatGPT 和 Vision Pro 这样的创新产品&#xff1f; 梁宁&#xff0c;产品战略专家&#xff0c;曾任湖…

chatgpt赋能python:如何在Python中安装PIL

如何在Python中安装PIL Python Imaging Library&#xff08;PIL&#xff09;是一款用于处理图像的Python库&#xff0c;它提供了各种图像处理功能&#xff0c;包括大小调整、旋转、裁剪等等。如果你需要在你的Python项目中处理图像&#xff0c;那么PIL是一个不错的选择。 步骤…

DBeaver连接GaussDB

DBeaver 官网&#xff1a;https://dbeaver.io/打开DBeaver&#xff0c;点击菜单栏 “数据库”>“驱动管理” 点击“新建” 填入下面内容&#xff1a; 驱动名称&#xff1a;GS 驱动类型&#xff1a;Generic 类名&#xff1a;org.postgresql.Driver URL模板&#xff1a;jdbc…

Linux:LNMP上搭建discuz论坛(源码安装)

LNMP环境 Linux &#xff1a;LNMP&#xff08;源码包安装&#xff09;_鲍海超-GNUBHCkalitarro的博客-CSDN博客 discuz论坛 准备好源码包 LNMP环境正常 yum -y install unzip unzip Discuz_X3.3_SC_UTF8.zip # unzip 源码包名称 mv upload/ /usr/local/nginx/html/tarro…

信号链噪声分析13

文章目录 概要整体架构流程技术名词解释技术细节小结 概要 提示&#xff1a;这里可以添加技术概要 接 触 ADC 或 DAC 时您一定会碰到这个经常被引用的公式&#xff0c;用于计算转换器理论信噪 比(SNR)。与其盲目地相信表象&#xff0c;不如从根本上了解其来源&#xff0c;因为…

Shell中的流程控制(if/case/for/while)

文章目录 Shell中的流程控制&#xff08;if/case/for/while&#xff09;1 if判断1.1 单分支1.2 多分支 2. case语句3 for循环3.1 第一种写法 (())3.2 第二种写法 in 4 while循环4.1 demo14.2. demo2测试let Shell中的流程控制&#xff08;if/case/for/while&#xff09; 1 if判…

【C】操作符详解

操作符 算术操作符移位操作符位操作符赋值操作符&#xff08;&#xff09;复合赋值操作符 单目操作符关系操作符逻辑操作符逗号表达式条件操作符下标引用&#xff0c;函数调用和结构成员 今天给大家带来一篇关于C语言操作符的详细介绍&#xff0c;在C语言中操作符主要有以下几种…

VS工程加载失败 | 找不到导入的项目CUDA xx.props解决方案

问题背景&#xff1a; 如果遇到VS项目某些工程无法加载&#xff0c;有一个可能的原因是属性表没有找到。即props文件无法加载&#xff0c;导致项目加载失败。 解决方案&#xff1a; 找到工程配置 .vcxproj 文件&#xff0c;编辑打开&#xff0c;查找props&#xff0c;发现电脑…

07_Linux并发与竞争

目录 Linux并发与竞争Linux并发与竞争 并发与竞争 保护内容是什么 原子操作简介 原子整形操作API函数 原子位操作API函数 自旋锁简介 自旋锁API函数 信号量简介 信号量API 函数 互斥体简介 互斥体API函数 Linux并发与竞争Linux并发与竞争 Linux是一个多任务操作系…

SQL-每日一题【178.分数排名】

题目 表: Scores 编写 SQL 查询对分数进行排序。排名按以下规则计算: 分数应按从高到低排列。 如果两个分数相等&#xff0c;那么两个分数的排名应该相同。 在排名相同的分数后&#xff0c;排名数应该是下一个连续的整数。换句话说&#xff0c;排名之间不应该有空缺的数字。 …

Redis安装配置及常用redis命令

目录 一、关系型数据库与非关系型数据库 1.关系型数据库 2. 非关系型数据库 3. 关系型数据库和非关系型数据库区别 3.1数据存储方式不同 3.2扩展方式不同 3.3对事务性的支持不同 4.非关系型数据库产生背景 5.总结 二、Redis简介 1.redis的工作过程 ​编辑 2.Redis…

chatgpt赋能python:如何用Python快速找到你需要的资料

如何用Python快速找到你需要的资料 在互联网时代&#xff0c;人们每天都需要浏览大量的信息来获取所需的资源和知识。但是在海量信息面前&#xff0c;如何快速准确地获取你想要的资料呢&#xff1f;这就要依靠搜索引擎了。而Python作为一门通用编程语言&#xff0c;也可以在搜…

路由基础静态路由

路由基础&静态路由 一、路由器基本原理1.1、路由器基本概述1.2、LAN和广播域1.3、路由选路1.3.1、路由器转发数据包1.3.2、IP路由表1.3.3、建立路由表1.3.4、最长匹配原则1.3.5、路由优先级1.3.6、路由度量1.3.7、等价路由 1.4、总结 二、静态路由基础2.1、静态路由配置2.2…

【C++】 Qt-事件(上)(事件、重写事件、事件分发)

文章目录 事件重写事件事件分发 事件 事件&#xff08;event&#xff09;是由系统或Qt本身在不同的时刻发出的。比如&#xff0c;当用户按下鼠标&#xff0c;敲下键盘&#xff0c;或窗口需要重新绘制的时候&#xff0c;都会发出一个相应的事件。一些事件是在对用户操作做出响应…

【记录】OLAP引擎中的冷热分层技术

在数据分析的实际场景中&#xff0c;冷热数据往往面临着不同的查询频次及响应速度要求。例如在电商订单场景中&#xff0c;用户经常访问近 6 个月的订单&#xff0c;时间较久远的订单访问次数非常少&#xff1b;在行为分析场景中&#xff0c;需支持近期流量数据的高频查询且时效…

Airtest:Windows桌面应用自动化测试四【Airtest之python本地环境安装、独立IDE运行】

Airtest之python本地环境安装、独立IDE运行 一、环境配置二、安装Airtest三、安装poco四、常见问题4.1若运行代码时&#xff0c;在cv2模块报ImportError: DLL load failed: 找不到指定模块的错&#xff0c;有几种解决方案&#xff1a;4.1.1.本问题的根本原因应该是DLL文件的缺失…

如何在前端写播放音频

ml(html文档、wxml文档等) <audio action{{action}} src"http://music.163.com/song/media/outer/url?id2059780541.mp3"></audio> js文档 action:{"method":"play"}

6.19、一起学JAVA API Object String StringBuffer/StringBuilder

1 前言 亲爱的小伙伴萌,目前我们看到的是Java基础部分的一个新的部分API,这是个啥,又能做啥呢? 其实可以概括成一句话:帮助我们站在巨人的肩膀上,实现更加高效的开发,那么我们来一探究竟吧~ 2 什么是API API&#xff08;Application Programming Interface&#xff0c;应用…

软考A计划-系统集成项目管理工程师-项目概念-上

点击跳转专栏>Unity3D特效百例点击跳转专栏>案例项目实战源码点击跳转专栏>游戏脚本-辅助自动化点击跳转专栏>Android控件全解手册点击跳转专栏>Scratch编程案例点击跳转>软考全系列 &#x1f449;关于作者 专注于Android/Unity和各种游戏开发技巧&#xff…