首页 > 编程语言 >python刷题常用模板

python刷题常用模板

时间:2024-07-28 16:06:53浏览次数:15  
标签:node __ idx python self add def 模板 刷题


#===================================== 素数筛 Begin =====================================#
MAXN = 1000
prime = []
isprime = [True] * (MAXN + 1)
def euler():
    isprime[1] = False
    for i in range(2, MAXN + 1):
        if isprime[i]: prime.append(i)
        for pr in prime:
            if i * pr > MAXN: continue
            isprime[i * pr] = False
            if i % pr == 0: break
euler()
#===================================== 素数筛 Test =====================================#
assert isprime[1] is False
assert isprime[59] is True
assert isprime[293] is True
print("Euler Prime test passed!")
#===================================== 素数筛 End =====================================#

#===================================== 并查集 Begin =====================================#
class DSU:
    def __init__(self, n):
        self.parent = [i for i in range(n)]

    def find(self, x):
        if self.parent[x] != x:
            self.parent[x] = self.find(self.parent[x])
        return self.parent[x]
    
    def merge(self, x, y):
        u, v = self.find(x), self.find(y)
        self.parent[u] = v
    
    def same(self, x, y) -> bool:
        return self.find(x) == self.find(y)
#===================================== 并查集 Test =====================================#
dsu = DSU(100)
assert dsu.same(1, 75) is False
dsu.merge(1, 50)
dsu.merge(25, 75)
dsu.merge(50, 25)
assert dsu.same(1, 75) is True
print("DSU test passed!")
#===================================== 并查集 End =====================================#

#===================================== 线段树 Begin =====================================#
class SegmentTree:
    def __init__(self, v):
        self.n = len(v)
        self.n4 = 4 * self.n
        self.tree = [0] * self.n4
        self.lazy = [0] * self.n4
        self.arr = v
        self.root = 1
        self.end = self.n
        self.__build(0, self.end - 1, self.root)
        self.arr = None

    def query(self, l, r):
        return self.__query(1, self.end, self.root, l + 1, r + 1)

    def add(self, l, r, val):
        self.__add(1, self.end, self.root, l + 1, r + 1, val)

    def __build(self, s, t, idx):
        if s == t:
            self.tree[idx] = self.arr[s]
        else:
            m = s + ((t - s) >> 1)
            self.__build(s, m, 2 * idx)
            self.__build(m + 1, t, 2 * idx + 1)
            self.__pushup(idx)

    def __add(self, s, t, idx, l, r, val):
        if l <= s and t <= r:
            self.lazy[idx] += val
            self.tree[idx] += (t - s + 1) * val
        else:
            m = s + ((t - s) >> 1)
            self.__pushdown(s, t, idx)
            if l <= m:
                self.__add(s, m, 2 * idx, l, r, val)
            if m < r:
                self.__add(m + 1, t, 2 * idx + 1, l, r, val)
            self.__pushup(idx)

    def __query(self, s, t, idx, l, r):
        if l <= s and t <= r:
            return self.tree[idx]
        m = s + ((t - s) >> 1)
        self.__pushdown(s, t, idx)
        sm = 0
        if l <= m:
            sm += self.__query(s, m, 2 * idx, l, r)
        if m < r:
            sm += self.__query(m + 1, t, 2 * idx + 1, l, r)
        return sm

    def __pushup(self, idx):
        self.tree[idx] = self.tree[idx * 2] + self.tree[idx * 2 + 1]

    def __pushdown(self, s, t, idx):
        m = s + ((t - s) >> 1)
        if self.lazy[idx] != 0:
            self.lazy[idx * 2] += self.lazy[idx]
            self.tree[idx * 2] += (m - s + 1) * self.lazy[idx]
            self.lazy[idx * 2 + 1] += self.lazy[idx]
            self.tree[idx * 2 + 1] += (t - m) * self.lazy[idx]
            self.lazy[idx] = 0
#===================================== 线段树 Test =====================================#
arr = [1, -2, 3, -4, 5]
seg = SegmentTree(arr)
assert seg.query(0, 2) == 2
seg.add(1, 3, 2)    # arr = [1, 0, 5, -2, 5]
assert seg.query(0, 3) == 4
print("SegmentTree1 test passed!")
#===================================== 线段树 End =====================================#


#===================================== 线段树 (动态开点)Begin =====================================#
class Node:
    def __init__(self, l, r):
        self.left = None
        self.right = None
        self.l = l
        self.r = r
        self.mid = (l + r) >> 1
        self.v = 0
        self.add = 0

class SegmentTree2:
    def __init__(self):
        self.root = Node(1, int(1e9))

    def modify(self, l, r, v, node=None):
        if l > r:
            return
        if node is None:
            node = self.root
        if node.l >= l and node.r <= r:
            node.v = v
            node.add = v
            return
        self.pushdown(node)
        if l <= node.mid:
            self.modify(l, r, v, node.left)
        if r > node.mid:
            self.modify(l, r, v, node.right)
        self.pushup(node)

    def query(self, l, r, node=None):
        if l > r:
            return 0
        if node is None:
            node = self.root
        if node.l >= l and node.r <= r:
            return node.v
        self.pushdown(node)
        v = 0
        if l <= node.mid:
            v = max(v, self.query(l, r, node.left))
        if r > node.mid:
            v = max(v, self.query(l, r, node.right))
        return v

    def pushup(self, node):
        node.v = max(node.left.v, node.right.v)

    def pushdown(self, node):
        if node.left is None:
            node.left = Node(node.l, node.mid)
        if node.right is None:
            node.right = Node(node.mid + 1, node.r)
        if node.add:
            node.left.v = node.add
            node.right.v = node.add
            node.left.add = node.add
            node.right.add = node.add
            node.add = 0
#===================================== 线段树 (动态开点)Test =====================================#
seg = SegmentTree2()
seg.modify(0, 5, 2)
assert seg.query(0, 5) == 2
seg.modify(3, 7, 4)
assert seg.query(5, 5) == 4
print("SegmentTree2 test passed!")
#===================================== 线段树 (动态开点)End =====================================#




标签:node,__,idx,python,self,add,def,模板,刷题
From: https://www.cnblogs.com/linyf49/p/18328339

相关文章

  • [附开题]flask框架的全国汽车销售信息查询系统的设计与实现7m1w0(python+源码)
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容研究背景随着中国汽车市场的蓬勃发展,汽车品牌的日益丰富以及消费者购车需求的多样化,汽车销售信息的准确性与时效性成为了市场关注的焦点。传统汽车......
  • [附开题]flask框架的校园停车场管理系统的设计与实现61m0e(源码+论文+python)
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容研究背景随着高等教育的普及和校园规模的不断扩大,校园内车辆数量急剧增加,停车难问题日益凸显。传统的人工停车场管理模式已难以满足现代校园对高效......
  • [附开题]flask框架的校园学生管理系统s8h32(源码+论文+python)
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容研究背景随着教育技术的不断进步和高校规模的不断扩大,传统的学生管理方式已难以满足现代校园管理的需求。学生数量激增、课程种类繁多、选课流程复......
  • [附开题]flask框架的校园疫情管理系统92tl0(源码+论文+python)
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容研究背景随着新冠疫情的持续影响,校园作为人群密集、流动性大的场所,其疫情防控工作显得尤为重要。传统的手工记录和口头报告方式已难以满足当前复杂......
  • 如何从 python 脚本将事件和上下文传递到 AWS lambda?
    我正在创建一个cli应用程序,我想用它来调用我的AWSlambda函数:@click.group(context_settings={"help_option_names":["-h","--help"]},invoke_without_command=True)@click.version_option(version=__version__,prog_name="experiment")def......
  • 个人工作述职报告模板PPT转正述职报告通用工作总结汇报范文免费
    不知道怎么写述职报告的同学,可以下载PPT模板,改一改就能用。模板文件一共有几个G,下载可能比较慢,建议选择转存,几秒就能保存全部文件,而且几乎不消耗数据流量。不需要开会员,文件可以免费保存,建议一次选择一个文件夹转存。手机APP保存的文件,可以同步在电脑端查看。 以下是部分述职......
  • 有没有办法检查是否有人提到@youtubechannelname并使用youtube数据api让Python脚本回
    标题解释了大部分内容。我的问题是,尽管到处搜索,但我没有找到任何有用的解决方案。AI和ChatGPT都无法对此提供帮助。不幸的是,YouTube数据API不提供直接监控频道提及或自动回复评论的功能。YouTube数据API主要用于检索和管理YouTube上的视频、评论和其他资源,而......
  • 如何在 Python 中从 Milesight TrafficX 摄像头、Post(MQTT、TCP/IP、HTTP) 获取数据?
    你好,祝你度过愉快的一天或一夜,我有这个MilesightTrafficX摄像头已启动并正在运行,仪表板中有一个名为POST的设置,您可以在下图中看到:我想要的是知道如何设置这些设置(基于实际上我的意思是)能够在我的Python代码中接收数据。无论协议如何,数据都将如下所示:......
  • 如何循环使用按钮输入,在python中的不同选项之间循环?
    我有一个循环,它采用三路开关输入并在相机开机时选择一个选项:#SetGPIOinputswitchColorOne=pyb.Pin("P9",pyb.Pin.IN,pyb.Pin.PULL_UP)switchColorTwo=pyb.Pin("P7",pyb.Pin.IN,pyb.Pin.PULL_UP)#SetcolorpalletebyswitchifswitchColorOne.value()==0:......
  • SSL 证书验证失败 - 雅虎财经 API - Python
    我正在尝试从雅虎财经获取数据,但收到SSL错误。代码如下:importrequestsresponse=requests.get("https://query1.finance.yahoo.com/v8/finance/chart/META",verify=True)print(response.status_code)出现以下错误:urllib3.exceptions.SSLError:[SSL:CERTIFICATE_......