蓝桥杯模板(二)python组

双指针

#模板:i快指针,j慢指针(快指针可以不停的移动,有个慢指针需要符合条件后才能移动) #eg 求最长的不包含重复数字的连续子序列 # 通过一个快指针和慢指针在一个for循环下完成两个for循环的工作 for i in range(n): j=0 while j < i and check(j): #当j指针满足一一定条件后才会移动 j+=1; # 每道题的具体逻辑 #https://www.cnblogs.com/bonelee/p/11789330.html

区间合并

n = int(input()) #管道问题 ##区间集合,intervals = [[1,3],[2,6],[8,10],[15,18]] intervals = [list(map(int,input().split())) for _ in range(n)] def merge(intervals): if len(intervals) == 0: return intervals #排序 intervals.sort(key=lambda x:x[0]) #左区间排序 res = [] #存结果 操作在res中进行 res.append(intervals[0]) #第一个先加入 for i in range(1,len(intervals)): if res[-1][1] >= intervals[i][0]:#重叠 res[-1] = [res[-1][0],max(res[-1][1],intervals[i][1])] else: res.append(intervals[i]) #不重叠直接加入 return res

二分

#二分模板 #何时考虑:在某一值一侧全符合 另一侧全部不符合(如分巧克力,管道问题) # 状态的决策过程或者序列是否满足单调性或者可以局部舍弃性 def check(x): #判断x是否合适 返回的是目标值在数组中的最右边位置 if (s[x]<=goal): return True return False l = 0 r = len(s)-1 while l < r: mid = (r+l)//2 if check(mid): l = mid else: r = mid+1 print(s[left]) def check(x): #判断x是否合适 返回的是目标值在数组中的最左边位置 if (s[x]>=goal): return True return False l = 0 r = len(s)-1 while l < r: mid = (r+l)//2 if check(mid): r = mid else: l = mid-1 print(s[left]) #二分查找 def b_s(ls,val): l = 0 r = len(s)-1 while l < r: mid = (r+l)//2 if ls[mid] == val: return mid elif ls[mid] > val: r = mid-1 else ls[mid] < val: l = mid +1 return

树状数组

#点修区间查 n,m = map(int,input().split())#数列的长度和操作的总数 #加上一个零使数组下标从1开始,方便处理 a = [0] + list(map(int,input().split())) s = [0]* (len(a)+5)#用于存储树状数组的信息 #计算x的二进制表示中最低位的1所代表的值 def lowbit(x): return x & -x def add(i,x): #用于向树状数组中的第i个位置加上x while i<n: s[x] += x i += lowbit(x) def sum_s(x):#查询前x项的和 res = 0 while x: res += s[x] x -= lowbit(x) return res for i in range(1,n+1): add(i,a[i]) #更新树状数组的值 for i in range(m): o,l,r = map(int,input().split()) if o == 1: #操作是1,则调用add(l,r)函数,将第l个数加上r add(l,r) else: print(sum_s(r)-sum_s(l-1)) #操作是2,则打印区间[l,r]内的所有数的和 #区间修点查 for i in range(m): b = list(map(int,input().split()))#操作 if b[0] == 1: #差分的思想 某区间每一个数加上一个给定值 add(b[1],b[3]) add(b[2],-b[3]) else: print(a[b[1]+sum_s(b[1])]) #先获取该位置的原始值,再加上前缀和

__EOF__

本文作者小苔藓
本文链接https://www.cnblogs.com/taixian/p/18120219.html
关于博主:计算机本科生一枚,希望从今天开始慢慢提高,一步步走向技术的高峰!
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   taixian  阅读(30)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
· SQL Server 2025 AI相关能力初探
点击右上角即可分享
微信分享提示