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))
posted @ 2025-04-26 08:28  L1xxer  阅读(25)  评论(0)    收藏  举报