蓝桥杯 第五十四天 模板复习

快速排序

一些边界的问题其实想的不是很清楚

def quicksort(start,end):
    if start>=end:
        return
    s=start-1
    e=end+1
    value=a[s+(e>>1)]
    while s<e:
        while True:
            s+=1
            if a[s]>=value:
                break
        while True:
            e-=1
            if a[e]<=value:
                break
        if s<e:
            a[s],a[e]=a[e],a[s]
    quicksort(start,e)
    quicksort(e+1,end)
    return

n=int(input())
a=list(map(int,input().split()))
quicksort(0,n-1)
print(a)

第k个数

def quicksort(start,end):
    if start>=end:
        return
    value=a[start+(end>>1)]
    s=start-1
    e=end+1
    while s<e:
        while True:
            s+=1
            if a[s]>=value:
                break
        while True:
            e-=1
            if a[e]<=value:
                break
        if s<e:
            a[e],a[s]=a[s],a[e]
    quicksort(start,e)
    quicksort(e+1,end)
    return
n,k=map(int,input().split())
a=list(map(int,input().split()))
quicksort(0,n-1)
print(a[k-1])

归并排序

这个比快排好理解一些,而且更快,所以快排是蠢b

def mergesort(start,end):
    if start>=end:
        return
    mid=start+end>>1
    mergesort(start,mid)
    mergesort(mid+1,end)
    temp=[]
    l,r=start,mid+1
    while l<=mid and r<=end:
        if a[l]<a[r]:
            temp.append(a[l])
            l+=1
        else:
            temp.append(a[r])
            r+=1
    while l<=mid:
        temp.append(a[l])
        l+=1
    while r<=end:
        temp.append(a[r])
        r+=1
    for i in range(start,end+1):
        a[i]=temp[i-start]
    return
n=int(input())
a=list(map(int,input().split()))
mergesort(0,n-1)
print(a)

逆序对的数量

ans+=mid-l+1

def mergesort(start,end):
    global ans
    if start>=end:
        return
    mid=start+end>>1
    mergesort(start,mid)
    mergesort(mid+1,end)
    temp=[]
    l,r=start,mid+1
    while l<=mid and r<=end:
        if a[l]<a[r]:
            temp.append(a[l])
            l+=1
        else:
            ans+=mid-l+1
            temp.append(a[r])
            r+=1
    while l<=mid:
        temp.append(a[l])
        l+=1
    while r<=end:
        temp.append(a[r])
        r+=1
    for i in range(start,end+1):
        a[i]=temp[i-start]
    return
n=int(input())
a=list(map(int,input().split()))
ans=0
mergesort(0,n-1)
print(ans)

数的范围(整数二分)

def firstcheck(x):
    left=0
    right=n-1
    while left<right:
        mid=(left+right)//2
        if a[mid]>=x:
            right=mid
        else:
            left=mid+1
    if a[left]==x:
        return left
    else:
        return -1

def lastcheck(x):
    left,right=0,n-1
    while left<right:
        mid=(left+right+1)//2
        if a[mid]<=x:
            left=mid
        else:
            right=mid-1
    if a[right]==x:
        return right
    else:
        return -1

n,m=map(int,input().split())
a=list(map(int,input().split()))
for i in range(m):
    c=int(input())
    x=firstcheck(c)
    y=lastcheck(c)
    print(x,y)

数的三次方根 (浮点数二分)

def binarysearch(x):
    left,right=0,x
    i=0
    while left<right:
        mid=(left+right)/2
        i+=1
        va=mid*mid*mid
        if abs(x-va)<1e-8:
            return mid
        elif va<x:
            left=mid
        else:
            right=mid
n=float(input())
a=binarysearch(n)
print(a)

前缀和(一维)

n,m=map(int,input().split())
a=[0]+list(map(int,input().split()))
b=[0]
for i in range(1,n+1):
    b.append(a[i]+b[i-1])
for i in range(m):
    x,y=map(int,input().split())
    print(b[y]-b[x-1])

子矩阵的和 (二维)

要熟练

n,m,q=map(int,input().split())
a=[[0 for i in range(m+1)]]
for i in range(n):
    a.append([0]+list(map(int,input().split())))
for i in range(1,n+1):
    for j in range(1,m+1):
        a[i][j]+=a[i-1][j]+a[i][j-1]-a[i-1][j-1]
for i in range(q):
    x1,y1,x2,y2=map(int,input().split())
    print(a[x2][y2]+a[x1-1][y1-1]-a[x2][y1-1]-a[x1-1][y2])

差分 (一维差分)

n,m=map(int,input().split())
a=[0]+list(map(int,input().split()))+[0]
b=[0]
for i in range(1,n+1):
    b.append(a[i]-a[i-1])
b.append(0)
for i in range(m):
    l,r,v=map(int,input().split())
    b[l]+=v
    b[r+1]-=v
for i in range(1,n+1):
    b[i]+=b[i-1]
    print(b[i],end=" ")

差分矩阵 (二维差分)

初始化其实就是特殊的插入,只在这一个点增加一个值

def insert(x1,y1,x2,y2,value):
    a[x1][y1] += value
    a[x2 + 1][y1] -= value
    a[x1][y2 + 1] -= value
    a[x2 + 1][y2 + 1] += value
n,m,q=map(int,input().split())
adj=[[0 for i in range(m+3)]]
for i in range(n):
    adj.append([0]+list(map(int,input().split()))+[0])
adj.append([0 for i in range(m+3)])
a=[[0 for i in range(m+3)]for j in range(n+2)]
for i in range(1,n+1):
    for j in range(1,m+1):
        insert(i,j,i,j,adj[i][j])
for i in range(q):
    x1,y1,x2,y2,value=map(int,input().split())
    insert(x1,y1,x2,y2,value)
for i in range(1,n+1):
    for j in range(1,m+1):
        a[i][j]+=a[i-1][j]+a[i][j-1]-a[i-1][j-1]
for i in range(1,n+1):
    for j in range(1,m+1):
        print(a[i][j],end=" ")
    print()
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值