Pthon常用语法糖与基础算法
输入 输出
a = list(map(int, input().strip().split()))
print(f'a:{a}')
元组 字典
a={}
a["3"] = 32
print(a["3"])
日期
import datetime as dt
date1 = dt.datetime(2019, 7, 26, 15, 35, 10)
date2 = dt.datetime(2020, 8, 1, 18, 30, 20)
Days = (date2 - date1).days
print(Days)
随机数
import random
random.random()
数组
# 定义一维数组a[],并初始化
a=[1,2,3,4,5]
print(*a) # 打印:1 2 3 4 5
print(a[0]) # 打印:1
# 定义二维数组b[][]
b=[[1,2],[4,5],[7,8]] # 定义一个3行2列的二维数组,并初始化
print(*b) # 打印:[1, 2] [4, 5] [7, 8]
print(b[1][0]) # 打印:4
# 定义三维数组c[][][],例如表示三维坐标c[x][y][z]
c=[[[0 for _ in range(2)] for _ in range (3)] for _ in range(4)]
c[3][2][1] = 9 #对某个三维坐标赋值
print(*c) # *c表示只打印c的第一维,即c[0]、c[1]、c[2]、c[3]
print(c[3]) # 打印:[[0, 0], [0, 0], [0, 9]]
print(c[3][2]) # 打印:[0, 9]
print(c[3][2][1]) # 打印:9
defaultdict
defaultdict(int) # 会为每个不存在键的值初始化为0
defaultdict(list) # 会为每个不存在键的值创建一个空列表
defaultdict(lambda: (0, 0)) # 会为每个不存在键的值初始化为(0, 0)
综上,defaultdict 参数的是“一个用于生成默认值的工厂函数”。
队列
from collections import deque # 默认从右端进出的双端队列
q = deque()
q.append(1)
q.append(2)
q.append(3)
len(q) # 3
print(q) # deque([1, 2, 3])
print(q.popleft()) # 1
print(q) # deque([2, 3])
print(q.pop()) # 3
print(q) # deque([2])
q.clear()
print(q) # deque([])
import heapq # 默认是最小堆的优先队列,放相反数可以实现大根堆
h = []
heapq.heappush(h, 3)
heapq.heappush(h, 1)
heapq.heappush(h, 2)
print(len(h)) # 3
print(h) # [1, 3, 2] 内部结构是堆,不保证完全有序
print(heapq.heappop(h)) # 1 每次弹出最小值
print(h) # [2, 3]
h.clear()
print(h) # []
并查集
# https://www.luogu.com.cn/problem/P1551
N = 5010
rt = [ _ for _ in range(N)]
def find(x): # 查找
if x != rt[x]:
rt[x] = find(rt[x])
return rt[x]
def merge(x, y): # 合并
x = find(x)
y = find(y)
if x != y:
rt[x] = rt[y] # y成为x的上级,x的集改成是y的集
def main():
n, m, p = map(int, input().split())
for _ in range(m): # 合并
x, y = map(int, input().split())
merge(x, y)
for _ in range(p): # 查询
x, y = map(int, input().split())
if find(x) == find(y):
print("Yes")
else:
print("No")
if __name__ == "__main__":
main()
排序
s1 = [('b', 'A', 15), ('c', 'B', 12), ('e', 'B', 10)]
s1.sort(key=lambda e: e[2]) # 按第3个排序,默认升序
print(s1)
s2 = "hello world"
s3 = sorted(s2, reverse=True)
s3 = ''.join(s3)
print(s3)
二分
# https://www.luogu.com.cn/problem/P2678
def check(x):
cnt = 0
j = 0
for i in range(1, n + 2):
if a[i] - a[j] < x:
cnt += 1
else:
j = i
return cnt <= m
l, n, m = map(int, input().split())
a = [0 for _ in range(n + 2)]
for i in range(1, n + 1):
a[i] = int(input())
a[n + 1] = l
a.sort()
lt, rt = 0, l # 二分答案,即最短跳跃距离的最大值
while (lt <= rt):
mid = (lt + rt) // 2
if check(mid):
lt = mid + 1
else:
rt = mid - 1
print(rt)
DFS
# https://www.luogu.com.cn/problem/P1238
def vl(x, y):
return x >= 0 and x < n and y >= 0 and y < m
def dfs(x, y):
if x == tx and y == ty:
global flag
flag = 0
for i in range(len(S) - 1):
print(f'({S[i][0] + 1},{S[i][1] + 1})->', end='')
print(f'({S[-1][0] + 1},{S[-1][1] + 1})')
return
for i in range(4):
cx = x + dx[i]
cy = y + dy[i]
if vl(cx, cy) and not vis[cx][cy] and a[cx][cy] == 1:
vis[cx][cy] = 1
S.append((cx, cy))
dfs(cx, cy)
vis[cx][cy] = 0
S.pop()
dx = [0, -1, 0, 1]
dy = [-1, 0, 1, 0]
flag = 1
S = []
n, m = map(int, input().split())
a = [[0 for _ in range(m)] for __ in range(n)]
vis = [[0 for _ in range(m)] for __ in range(n)]
for i in range(n):
a[i] = list(map(int, input().split()))
sx, sy = map(int, input().split())
tx, ty = map(int, input().split())
sx -= 1
sy -= 1
tx -= 1
ty -= 1
vis[sx][sy] = 1
S.append((sx, sy))
if a[sx][sy] == 1:
dfs(sx, sy)
if flag:
print('-1')
Dijkstra
# https://www.luogu.com.cn/problem/P1144
import heapq
import sys
input = sys.stdin.readline # 加快输入速度
INF = int(1e10)
n, m = map(int, input().split())
e = [[] for _ in range(n + 1)]
cnt = [0] * (n + 1)
dis = [INF] * (n + 1)
vis = [False] * (n + 1)
def add(x, y):
global e
e[x].append(y)
e[y].append(x)
def dijkstra(s):
dis[s] = 0
cnt[s] = 1
Q = [(0, s)]
while Q:
d, u = heapq.heappop(Q)
if vis[u]: # 弹出冗余,避免环路
continue
vis[u] = True
for v in e[u]:
if dis[v] > dis[u] + 1:
dis[v] = dis[u] + 1
cnt[v] = cnt[u]
heapq.heappush(Q, (dis[v], v))
elif dis[v] == dis[u] + 1:
cnt[v] = (cnt[v] + cnt[u]) % 100003
for i in range(m):
x, y = map(int, input().split())
add(x, y)
dijkstra(1)
for i in range(1, n + 1):
if (dis[i] == INF):
print(0)
else:
print(cnt[i])
Prim
# https://www.luogu.com.cn/problem/P3366
import heapq
import sys
input = sys.stdin.readline
INF = int(1e10)
n, m = map(int, input().split())
res = 0
e = [[] for _ in range(n + 1)]
vis = [False] * (n + 1)
def add(x, y, z):
global e
e[x].append((y, z))
e[y].append((x, z))
def prim(s):
global res
Q = [(0, s)]
while Q:
d, u = heapq.heappop(Q)
if vis[u]:
continue
vis[u] = True
res += d
for (v, w) in e[u]:
if not vis[v]:
heapq.heappush(Q, (w, v))
for i in range(m):
x, y, z = map(int, input().split())
add(x, y, z)
prim(1)
flag = 1
for i in range(1, n + 1):
if not vis[i]:
flag = 0
print(res if flag else "orz")
线段树
import sys
input = sys.stdin.readline
n, m = map(int, input().split())
a = list(map(int, input().split()))
tree = [0] * (4 * n + 5)
lazy = [0] * (4 * n + 5)
ans = 0
def build(cur, l, r):
if l == r:
tree[cur] = a[l - 1]
return
mid = (l + r) >> 1
build(cur << 1, l, mid)
build(cur << 1 | 1, mid + 1, r)
tree[cur] = tree[cur << 1] + tree[cur << 1 | 1]
def pushdown(cur, l, r):
mid = (l + r) >> 1
tree[cur << 1] += (mid - l + 1) * lazy[cur]
tree[cur << 1 | 1] += (r - mid) * lazy[cur]
lazy[cur << 1] += lazy[cur]
lazy[cur << 1 | 1] += lazy[cur]
lazy[cur] = 0
def update(cur, l, r, L, R, val):
if L <= l and r <= R:
tree[cur] += val * (r - l + 1)
lazy[cur] += val
return
if lazy[cur]:
pushdown(cur, l, r)
mid = (l + r) >> 1
if R <= mid:
update(cur << 1, l, mid, L, R, val)
elif L > mid:
update(cur << 1 | 1, mid + 1, r, L, R, val)
else:
update(cur << 1, l, mid, L, mid, val)
update(cur << 1 | 1, mid + 1, r, mid + 1, R, val)
tree[cur] = tree[cur << 1] + tree[cur << 1 | 1]
def query(cur, l, r, L, R):
global ans
if L <= l and r <= R:
ans += tree[cur]
return
if lazy[cur]:
pushdown(cur, l, r)
mid = (l + r) >> 1
if R <= mid:
query(cur << 1, l, mid, L, R)
elif L > mid:
query(cur << 1 | 1, mid + 1, r, L, R)
else:
query(cur << 1, l, mid, L, mid)
query(cur << 1 | 1, mid + 1, r, mid + 1, R)
build(1, 1, n)
for _ in range(m):
op, *rest = map(int, input().split())
if op == 1:
x, y, k = rest
update(1, 1, n, x, y, k)
elif op == 2:
x, y = rest
ans = 0
query(1, 1, n, x, y)
print(ans)
埃氏筛
n = 100
v = [0] * (n + 1) # 0表示素数,1表示合数
def init(n):
for i in range(2, n + 1):
if not v[i]:
for j in range(i, (n // i) + 1):
v[i * j] = 1
init(n)
for i in range(2, n + 1):
if not v[i]:
print(i, end=' ') # 打印素数
python math
print(pow(3, 3, 5)) # 3^3 mod 5
import math
print(math.factorial(5)) # 5的阶乘
print(math.gcd(12, 18)) # 最大公约数
print(math.lcm(12, 18)) # 最小公倍数
print(math.isqrt(16)) # 整数平方根
print(math.isqrt(15)) # 浮点数平方根
print(math.comb(5, 2)) # 组合数C(5, 2)
print(math.perm(5, 2)) # 排列数P(5, 2)
背包
# 01背包
n, V = map(int, input().split())
v = [0 for _ in range(n)]
w = [0 for _ in range(n)]
f = [0 for _ in range(V + 1)]
for i in range(n):
v[i], w[i] = map(int, input().split())
for i in range(n):
for j in range(V, v[i] - 1, -1):
f[j] = max(f[j], f[j-v[i]] + w[i])
print(f[V])
# 完全背包
n, V = map(int, input().split())
v = [0 for _ in range(n)]
w = [0 for _ in range(n)]
f = [0 for _ in range(V + 1)]
for i in range(n):
v[i], w[i] = map(int, input().split())
for i in range(n):
for j in range(v[i], V + 1):
f[j] = max(f[j], f[j-v[i]] + w[i])
print(f[V])
线性DP
# B3637 最长上升子序列
n = int(input())
a = list(map(int, input().split()))
f = [1] * n
for i in range(n):
for j in range(i):
if a[i] > a[j]:
f[i] = max(f[i], f[j] + 1)
print(max(f))
# P1115 最大子段和
n = int(input())
a = list(map(int, input().split()))
res = max(a)
f = 0
for i in range(n):
if a[i] + f > 0:
f = a[i] + f
res = max(res, f)
else:
f = a[i]
print(res)
# P1439 最长公共子序列
n = int(input())
a = list(map(int, input().split()))
b = list(map(int, input().split()))
f = [[0 for _ in range(n + 1)] for __ in range(n + 1)]
for i in range(1, n + 1):
for j in range(1, n + 1):
if a[i - 1] == b[j - 1]:
f[i][j] = f[i - 1][j - 1] + 1
else:
f[i][j] = max(f[i - 1][j], f[i][j - 1])
print(f[n][n])
贪心
# B3637 最长上升子序列
import bisect
n = int(input())
a = list(map(int, input().split()))
res = []
for i in range(n):
j = bisect.bisect_left(res, a[i])
if j == len(res):
res.append(a[i])
else:
res[j] = a[i] # 替换了一个“更小”的数
print(res)
print(len(res))

浙公网安备 33010602011771号