#以Bi为固定点,在A中查找插入位置m,则A中比Bi小的有m个,
#这表示符合条件的三元组(i,j,k)i的数量有m个,同样的K有len(C)-n个
N=int(input())
A=list(map(int,input().split()))
B=list(map(int,input().split()))
C=list(map(int,input().split()))
A.sort()
C.sort()
import bisect
ans=0
for j in B:
m=bisect.bisect_left(A,j)
n=bisect.bisect_right(C,j)
ans+=m*(N-n)
print(ans)
2.修改数组
参考文章https://blog.csdn.net/weixin_45445598/article/details/122499260
# 并查集 用于处理元素分组 管理一些不相交的集合 如血姻关系
#查找祖先
def find(x):
global fa
if fa[x] != x:
fa[x] = find(fa[x])
return fa[x]
N = int(input())
A = [int(temp) for temp in input().strip().split()]
# 首先创建数组大小的并查集序列 自循环
fa = [i for i in range(1000001)]
for i in range(N):
# 找到A[i]元素父亲
# 如果A[i]元素没有找到 则返回A[i]的值 同时将下一次查到A[i]值指向A[i]值得下一位
# 如果A[i]找到 则继续增加
# 2 1 1 3 4
# 首先2 的父亲是2 并同时把父亲数组中A[i]位置元素修改为3
# 其次为1 1的父亲是1 同时把父亲数组中1位置元素修改为2
# 获得 1 1的父亲此时为3 输出3 并将3的父亲修改为4
# 获得3 3的父亲此时为4 输出4 并将此时3的父亲修改为5
# 获得4 4的父亲此时为5 输出5 并将此时5的父亲修改为6
A[i] = find(A[i])
fa[A[i]] = find(A[i] + 1)
for i in range(N):
print(A[i], end="")
if i != N - 1:
print(" ", end="")
3.方格分割
count=0
vis=[[1]*7 for i in range(7)]
dir=[(-1,0),(1,0),(0,-1),(0,1)]
def dfs(x,y):
global count
if x==0 or y==0 or x==6 or y==6:
count+=1
return
# 当前点和对称点都标注访问,这样使得可以对称平均分割
vis[x][y],vis[6-x][6-y]=0,0
for i in range(0,4):
# 新坐标
newx=x+dir[i][0]
newy=y+dir[i][1]
if vis[newx][newy]:
#这个格子没有被访问,就访问,标记访问,并对其邻居做同样的操作
dfs(newx,newy)
vis[x][y],vis[6-x][6-y]=1,1
dfs(3,3)
print(count//4)
4.付账问题
首先将每个人带的钱从小到大排序,遍历,如果第i个人带的钱小于部分平均数(此时的平均数等于减去前i-1个人支付的钱,再除以剩下未支付的n-i个人),就将所有的钱都用于支付;如果此时带的钱大于等于部分平均数,则及其和剩下的n-i-1个人都大于平均数,则拿出平均数的钱数即可。总体平均数 s 用于求标准差,部分平均数 ss 用在遍历上在未遇到大于它的钱数时做减法,所以复制一份总体平均数作为部分平均数的初值
import math
n,s=map(int,input().split())
ss=s
a=list(map(int,input().split()))
a.sort()
ans=0
ave=s/n
for i in range(n):
if a[i]<ss/(n-i):
ans+=(a[i]-ave)**2
ss-=a[i]
else:
ans+=((ss/(n-i)-ave)**2)*(n-i)
break
ans/=n
print("{:.4f}".format(math.sqrt(ans)))
5.乘积最大
mo=int(1e9+9)
def mod(x):
if x<0:return -((-x)%mo)
return x%mo
n,k=map(int,input().split())
a=[]
for i in range(n):a.append(int(input()))
a.sort()
l,r=0,n-1
ans=1
sign=1
if k%2:
ans=a[r]
r-=1
k-=1
if ans<0:sign=-1
while k:
x,y=a[l]*a[l+1],a[r]*a[r-1]
if x*sign>=y*sign:
ans*=x
l+=2
else:
ans*=y
r-=2
ans=mod(ans)
k-=2
print(ans)