""" 枚举n太复杂,枚举t,枚举每棵树的位置(按顺序)然后不断更新 ans和上下距离 ans和水平距离 """ n = int(input()) t = int(input()) tree = [] tree.append([-1,-1]) # 占位 for i inrange(1,t + 1): a, b = map(int,input().split()) tree.append([a, b])
tree.append([0, 0]) tree.append([0, n + 1]) tree.append([n + 1, 0]) tree.append([n + 1, n + 1]) t += 4# 四个顶点插入树 树的个数要加上
""" for i inrange(1, t + 1): d, u = 0, n + 1 for j inrange(i + 1, t + 1): x, y = tree[j] a, b = tree[i] if x - a - 1 > u - d - 1: break ans = max(ans, x - a - 1) if y >= b: u = min(u, y) if y <= b: d = max(d, y)
tree.sort(key=lambda x: x[1]) for i inrange(1, t + 1): l, r = 0, n + 1 for j inrange(i + 1, t + 1): x, y = tree[j] a, b = tree[i] if y - b - 1 > r - l - 1: break ans = max(ans, y - b - 1) if x >= a: r = min(r, x) if x <= a: l = max(l, x)
""" dfs 先找到val的答案的个数 然后找val的左子树(x)的答案的个数 再找val的右子树(val//x)的答案 用@cache 变为记忆化搜索 """ classSolution: defnumFactoredBinaryTrees(self, arr: List[int]) -> int: s = set(arr) @cache defdfs(val): ans = 1 for x in arr: if val % x == 0and val // x in s: ans += dfs(x) * dfs(val // x) return ans returnsum(dfs(x) for x in arr) % (10 ** 9 + 7)
# 递推 用f表示这个点作为根节点的时候有多少种情况 用idx反向查询这个点的下标 classSolution: defnumFactoredBinaryTrees(self, arr: List[int]) -> int: arr.sort() idx = {x: i for i, x inenumerate(arr)} f = [1] * len(arr) for i inrange(len(arr)): for j inrange(i): val = arr[i] x = arr[j] if val % x == 0and val // x in idx: f[i] += f[j] * f[idx[val // x]] returnsum(f) % (10 ** 9 + 7)
classSolution: defminTrioDegree(self, n: int, edges: List[List[int]]) -> int: g = [[0] * n for _ inrange(n)] degree = [0] * n
for x, y in edges: x, y = x - 1, y - 1 g[x][y] = g[y][x] = 1 degree[x] += 1 degree[y] += 1
ans = inf for i inrange(n): for j inrange(i, n): if g[i][j] == 1: for k inrange(j, n): if g[i][k] == g[j][k] == 1: ans = min(ans, degree[i] + degree[j] + degree[k] - 6) return -1if ans == inf else ans
classSolution: defcountKSubsequencesWithMaxBeauty(self, s: str, k: int) -> int: c = Counter(s) if k > len(c): return0 Mod = 10 ** 9 + 7 mx = -1 ans = 0 keys = list(c.keys()) defdfs(i, count, add, mul): nonlocal mx, ans if count == k: if add > mx: mx = add ans = mul elif add == mx: ans += mul ans %= Mod return if i + k - count > len(keys): return dfs(i + 1, count + 1, add + c[keys[i]], mul * c[keys[i]] % Mod) dfs(i + 1, count, add, mul) dfs(0,0,0,1) return ans
# 数学 # 求出出现频率前k高的字母 最大的美丽值就在这里面 需要注意的是 最后一个出现频率(k-1位)可能有多个字母(这样组成的子序列美丽值都相同且最大 ) 所以需要再次计算 算出重复的字母数量 然后进行组合计算C(n,k)n为相同的字母的个数 c为可以选的个数(前k个里面 去掉大于的 还要在等于的里面选c个 凑k子序列) classSolution: defcountKSubsequencesWithMaxBeauty(self, s: str, k: int) -> int: c = Counter(s) if k > len(c): return0 else: from math import comb Mod = 10 ** 9 + 7 values = sorted(c.values(), reverse=True) ans = 1 c = 0 for i inrange(k): if values[i] > values[k - 1]: ans *= values[i] ans %= Mod elif values[i] == values[k - 1]: c += 1 ans *= values[i] ans %= Mod return ans * comb(values.count(values[k - 1]),c) % Mod
# 主要是看一下这个写法 s = set(nums1) & set(nums2) 直接取出1 2 中的相同的数字 classSolution: defminNumber(self, nums1: List[int], nums2: List[int]) -> int: ret = 0 a = min(nums1) b = min(nums2) if a > b: a, b = b, a ret = a * 10 + b
s = set(nums1) & set(nums2) ifnot s: return ret returnmin(s)
# 计算有几个L几个M 然后算有几个L不在前面 有几个M不在中间 然后至多需要交换这么多次 才能换好 但是当错位的L和M互换时 两次就只需要一次了 所以说取min(l,m)(这就是LM相互错位的个数)减掉就行 nums = list(input().strip()) n = len(nums) cl, cm, cs = 0, 0, 0 for i, x inenumerate(nums): if x == 'L': cl += 1 elif x == 'M': cm += 1 elif x == 'S': cs += 1
wl, wm, lm, ml = 0, 0, 0, 0 for i inrange(cl): if nums[i] != 'L': wl += 1 if nums[i] == 'M': lm += 1 for i inrange(cl, cl + cm): if nums[i] != 'M': wm += 1 if nums[i] == 'L': ml += 1
# 求一个数,他的约数的个数(同一个约数可能出现很多次)最多,遍历1~n,ans[j] += len(cs[i])。因为i的所有倍数上的点,都满足条件。所以把每个ans[j] 都加上i的个数。遍历到n的时候,就把所有的数都加上了 import collections defsolve(): n = int(input()) a = list(map(int, input().split()))
cs = collections.defaultdict(list) for i, x inenumerate(a): cs[x].append(i) ans = [0] * (n + 1) m = len(cs) for i inrange(1, n + 1): j = i while j <= n: ans[j] += len(cs[i]) j += i
q = deque([i for i, x inenumerate(in_deg) if x == 0]) how = [] while q: pre = q.popleft() numCourses -= 1 how.append(pre) for cur in graph[pre]: in_deg[cur] -= 1 if in_deg[cur] == 0: q.append(cur)
classSolution: defcheckIfPrerequisite(self, numCourses: int, prerequisites: List[List[int]], queries: List[List[int]]) -> List[bool]: # 拓扑排序的思路仍然是先建图 存储入度 循环找点 不同的是 (有向图) 这次0-1-2-3 不仅0-1连通 0-3也连通 要反映这样的一种关系 需要建立一个二维数组表示他们的连通关系 每次pop取出一个点 这个点是x连向的所有点 即列表graph[x] 遍历里面的每个元素 (入度减一等操作) 遍历每一个numCourse的点 如果他跟x有连接 或者跟y有连接就为True (h-y or h-x-y) # Toposort graph = defaultdict(list) in_deg = [0] * numCourses for pre, cur in prerequisites: graph[pre].append(cur) in_deg[cur] += 1 ret = [[False] * numCourses for _ inrange(numCourses)] q = deque([i for i, x inenumerate(in_deg) if x == 0]) while q: x = q.popleft() for y in graph[x]: in_deg[y] -= 1 ret[x][y] = True for h inrange(numCourses): ret[h][y] = ret[h][y] or ret[h][x] if in_deg[y] == 0: q.append(y) return [ret[a][b] for a, b in queries]
# Floyd的思路 边权为True 建好图之后直接循环 # Floyd graph = [[False] * numCourses for _ inrange(numCourses)] for pre, cur in prerequisites: graph[pre][cur] = True
for k inrange(numCourses): for i inrange(numCourses): for j inrange(numCourses): graph[i][j] = (graph[i][k] and graph[k][j]) or graph[i][j]
// 通过索引找值 再通过值找索引 并且实现交换 主要是两个数组 一个是原数组 一个是pos数组 注意每次交换的时候两个数组都要交换 知道值a pos[a]即为索引 那a的前一个数就是pos[a] - 1 然后交换 #include<iostream> usingnamespace std; constint N = 1e5 + 7; int s[N]; int f[N]; int w[N]; intmain() { int n, m, k; cin >> n >> m >> k; for (int i = 1; i <= n; i++) { cin >> s[i]; f[s[i]] = i; w[i] = (i - 1) / k + 1; } longlong ret = 0; for (int i = 1; i <= m; i++) { int x; cin >> x; ret += w[f[x]];
# 二分答案 最小化能够抢到的最大值 类似的表述就是二分答案的套路 # 二分偷取的钱数(得到最小值) 当偷盗的房子数满足k的时候 就可以成为一个答案 本解还有贪心 只要遇到可偷的就立即偷 classSolution: defminCapability(self, nums: List[int], k: int) -> int: minn = min(nums) maxn = max(nums) res = -1 while minn <= maxn: mid = (maxn + minn) // 2 cnt = 0 vis = False for num in nums: ifnot vis and num <= mid: cnt += 1 vis = True else: vis = False if cnt < k:
minn = mid + 1 else: res = mid maxn = mid - 1 return res
# 也可以用二分+动态规划 状态表示为从0~i可偷的房间数为f[i] 状态计算为f[i] = max(f[i - 1], f[i - 1] + 1) classSolution: defminCapability(self, nums: List[int], k: int) -> int: defsolve(mx: int) -> int: f0 = f1 = 0 for num in nums: if num <= mx: f0, f1 = f1, max(f1, f0 + 1) else: f0 = f1 return f1 return bisect_left(range(max(nums)), k, key=solve)
classSolution: defcollectTheCoins(self, coins: List[int], edges: List[List[int]]) -> int: n = len(coins) graph = [[] for _ inrange(n)] for a, b in edges: graph[a].append(b) graph[b].append(a)
deg = list(map(len, graph)) q = deque() res = n - 1# 总边数 # 先把没有金币的叶子节点存入数组(相当于拓扑排序的放入入度为0的点 for i, (d, c) inenumerate(zip(deg, coins)): if d == 1and c == 0: q.append(i) # 删除所有没有金币的叶子节点 while q: x = q.popleft() res -= 1# 每次循环都会删掉一条边 for y in graph[x]: deg[y] -= 1 if deg[y] == 1and coins[y] == 0: q.append(y)
# 删除最下面两层结点(叶子结点和叶子节点的父节点)(此时的叶子节点是含金币的因为不含的已经删除) for i, (d, c) inenumerate(zip(deg, coins)): if d == 1and c == 1: q.append(i) # 这一层的所有含金币的叶子都被删除了 那么这些线就不用走了 删除的总数就是len(q) res -= len(q)
# 接下来删除叶子节点的父节点(叶子在上面已经删除) for x in q: for y in graph[x]: deg[y] -= 1 if deg[y] == 1: res -= 1
for p, i insorted(zip(people, range(len(people)))): while j < len(time) and time[j] <= p: s += diff[time[j]] j += 1 people[i] = s
return people
# 或者更简单的 直接计算第i分钟的花的数量 用第i分钟开花的数量减去第j分钟开花的数量 对开花时间和结束时间排序获得start和end数组 通过二分寻找开花数和凋谢数 classSolution: deffullBloomFlowers(self, flowers: List[List[int]], people: List[int]) -> List[int]: start = sorted(s for s, _ in flowers) end = sorted(e for _, e in flowers) return [bisect_right(start, p) - bisect_left(end, p) for p in people]
classSolution: defsumDistance(self, nums: List[int], s: str, d: int) -> int: n = len(nums) for i inrange(n): f = -1if s[i] == 'L'else1 nums[i] += f * d nums.sort()
ans = 0 s = 0 for i inrange(n): ans += i * nums[i] - s s += nums[i] return ans % (10 ** 9 + 7)
classSolution: deftopStudents(self, positive_feedback: List[str], negative_feedback: List[str], report: List[str], student_id: List[int], k: int) -> List[int]: score = defaultdict(int) for w in positive_feedback: score[w] = 3 for w in negative_feedback: score[w] = -1 a = sorted((-sum(score[w] for w in r.split()), i) for r, i inzip(report, student_id))
classSolution: deftupleSameProduct(self, nums: List[int]) -> int: mp = defaultdict(int) n = len(nums) ans = 0 for i inrange(n): for j inrange(i + 1, n): mp[nums[i] * nums[j]] += 1 m = len(mp) for x in mp.values(): ans += x * (x - 1) * 4 return ans
""" # Definition for a Node. class Node: def __init__(self, val: int = 0, left: 'Node' = None, right: 'Node' = None, next: 'Node' = None): self.val = val self.left = left self.right = right self.next = next """
classSolution: defconnect(self, root: 'Node') -> 'Node': if root isNone: return root """q = deque([root]) while q: s = len(q) pre = None for i in range(s): x = q.popleft() if pre: pre.next = x pre = x if x.left: q.append(x.left) if x.right: q.append(x.right) return root""" cur = root while cur: dummy = Node() pre = dummy while cur: if cur.left: pre.next = cur.left pre = pre.next if cur.right: pre.next = cur.right pre = pre.next cur = cur.next cur = dummy.next return root
classSolution: defmaxProduct(self, words: List[str]) -> int: mp = dict() maxret = 0 n = len(words) for i inrange(n): mask = 0 l = len(words[i]) for c in words[i]: mask |= (1 << ord(c) - ord('a')) if mask in mp andlen(words[i]) > mp[mask]: mp[mask] = l elif mask notin mp: mp[mask] = l if i == 0:continue for m, v in mp.items(): if mask & m == 0and v * l > maxret: maxret = v * l return maxret
defbfs(q: List[Tuple[int, int]]) -> (int, int, int): d = [[-1] * m for _ inrange(n)] for i, j in q: d[i][j] = 0 ti = 1 while q: t = q q = [] for i, j in t: for k inrange(4): ni, nj = i + dx[k], j+ dy[k] if0 <= ni < n and0 <= nj < m and grid[ni][nj] == 0and d[ni][nj] < 0: d[ni][nj] = ti q.append((ni, nj)) ti += 1 return [d[-1][-1], d[-1][-2], d[-2][-1]]
man, m1, m2 = bfs([(0,0)]) if man < 0: return -1
fire_pos = [(i, j) for i, row inenumerate(grid) for j, x inenumerate(row) if x == 1] fire, f1, f2 = bfs(fire_pos) if fire < 0: return10 ** 9
d = fire - man if d < 0: return -1
if m1 != -1and m1 + d < f1 or m2 != -1and m2 + d < f2: return d return d - 1
/*-------------------------------------------*/ int n, m; constint N = 3e5 + 10; vector<int> a(N), b(N), ca(N), cb(N); boolcheck(int x) {
int p = -1, q = -1; for (int i = 0; i < m; i++) { if (a[i] == x || b[i] == x) continue; else { p = a[i]; q = b[i]; break; } } int va = 0, vb = 0; for (int i = 0; i < m; i++) { if (a[i] == x || b[i] == x || a[i] == p || b[i] == p) va++; if (a[i] == x || b[i] == x || a[i] == q || b[i] == q) vb++; } if (va == m || vb == m) returntrue; else returnfalse; }
voidsolve() {
cin >> n >> m; for (int i = 0; i < m; i++) { cin >> a[i] >> b[i]; } if (check(a[0]) || check(b[0])) puts("YES"); else puts("NO"); } intmain() { // clock_t st = clock(), ed; ios::sync_with_stdio(0); cin.tie(0); // cout << setprecision(15) << fixed;
#include<iostream> #include<algorithm> usingnamespace std; int nums[100010]; int ret[100010]; intmain() { // 请在此输入您的代码 int n; cin>>n; for (int i = 1; i <= n; i++) { cin>>nums[i]; ret[i] = nums[i]; } sort(nums + 1, nums + n + 1); int ans = -1; int j = 0; for(int i = 1; i <= n && ans == -1; ) { j = i++; while (i <= n && nums[i] == nums[i - 1])i++; int l = j - 1, r = n - i + 1; // cout<<l<<" "<<r<< " "<<nums[j]<<endl; if (l > r)ans = nums[j]; elseif (l < r)continue; else ans = nums[j] + 1; } // cout<<ans<<endl; for (int i = 1; i <= n; i++) { int x = 0; if (ret[i] < nums[j])x = ans - ret[i]; cout<< x <<" "; }
voidsolve() { int a[3][2]; for (int i = 0; i < 3; i++) for (int j = 0; j < 2; j++) cin>>a[i][j];
int ans = 8; for (int i = 0; i < 3; i++) for (int j = 0; j < 3; j++) if (i != j) for (int k = 0; k < 3; k++) if (i != k && j != k) for (int ii = 0; ii < 2; ii++) for (int jj = 0; jj < 2; jj++) for (int kk = 0; kk < 2; kk++) { if (a[i][ii] == a[j][jj] || a[i][ii] == a[k][kk]) { ans = min(ans, 6); if (a[j][jj] == a[k][kk]) ans = min(ans, 4); } if (a[i][ii] == a[j][jj] + a[k][kk]) { ans = min(ans, 6); if (a[j][1 - jj] == a[k][1 - kk]) ans = min(ans, 4); } } cout<<ans<<endl;
} intmain() { int T; cin>>T; while(T--) solve(); return0; }