快速排序
一些边界的问题其实想的不是很清楚
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()