defmain(): n = int(input()) R = list(map(int, input().split())) A = float("-inf") B = float("-inf") for i,r inenumerate(R): A = max(A, r+i+1) B = max(B, r-i-1) P = (A+B+1)//2 print(P) if __name__ == "__main__": main()
defcan_stack(u, v): st = [] j = 0 for c in u: st.append(c) while st and j < len(v) and st[-1] == v[j]: st.pop() j+=1 if j == len(v): returnTrue returnFalse
defmain(): U = input() V = input() is_queue = can_queue(U, V) is_stack = can_stack(U, V) if is_queue: print("both") elif is_stack: print("stack") else: print("neither")
# 当前字符匹配不上,就往前退 while j>0and s[i]!=s[j]: j = pi[j-1] # 匹配成功 if s[i] == s[j]: j+=1 pi[i] = j # 利用 pi 求最小周期 period = n - pi[-1] if n%period == 0: return period else: return n
defmain(): n = int(input()) u = input().strip() p = list(map(int, input().split())) # 改成 0~n-1 p = [x-1for x in p] visited = [False] * n
ans =1
for i inrange(n): # 已经属于某个环了,就不用再找 if visited[i]: continue # 找到一个新的环 cur = i chars = []
defcheck(area, n, m, x): cnt = 0# 喷的次数 cover = 0# 覆盖范围
for i inrange(1,n+1): if i<=cover: continue if area[i-1] == 1: cnt +=1 cover = i+x-1 if cnt > m: returnFalse returnTrue
defmain(): T = int(input()) for _ inrange(T): n, m = map(int, input().split()) area = list(map(int, input().split())) if1notin area: print(0) continue # 已经确定 area 中至少有一个 1, # 所以 x 最小至少为 1 left = 1 right = n while left<right: mid = (left+right)//2 if check(area, n, m, mid): right = mid else: left = mid+1 # 二分结束时 left == right print(left)
defsolve(nums, min_length): """ 求一维数组中: 连续子数组长度 >= min_length 时的最大子数组和 """ n = len(nums) # 数组长度不足要求长度,无法形成合法区间 if n < min_length: returnNone # nums 前 i 个元素的和 prefix_sum = [0] * (n+1)
for i inrange(n): prefix_sum[i+1] = prefix_sum[i] + nums[i]
max_sum = float("-inf") # 当前允许作为区间左端点的最小前缀和 min_prefix_sum = 0 # 枚举区间右端点 for right inrange(min_length, n+1): max_sum = max( max_sum, prefix_sum[right] - min_prefix_sum ) # 下一轮开始时,新增一个合法左端点 left = right - min_length + 1 min_prefix_sum = min( min_prefix_sum, prefix_sum[left] ) return max_sum
defmain(): P, Q = map(int, input().split()) matrix = [] for _ inrange(P): matrix.append(list(map(int, input().split()))) ans = float("-inf") # 矩形高度是短边 # 固定上下边界,把二维问题压缩成一维列和问题 for top inrange(P): # 表示当前行区间内第 j 列元素和 col_sum = [0] * Q
for bottom inrange(top, P): # 扩展下边界,更新每列累计值 for c inrange(Q): col_sum[c] += matrix[bottom][c]
h = bottom - top + 1 max_sum = solve(col_sum, h) if max_sum isnotNone: ans = max(ans, max_sum * h) # 矩形宽度是短边 # 固定左右边界,把问题转为行方向处理 for left inrange(Q): # 表示当前列区间内第 r 行元素和 row_sum = [0] * P for right inrange(left, Q): # 扩展右边界,更新每行累计值 for r inrange(P): row_sum[r] += matrix[r][right] w = right - left + 1
max_sum = solve(row_sum, w) if max_sum isnotNone: ans = max(ans, max_sum * w) print(ans)
defmain(): w = input() st = [] ans = 0 for c in w: while st and st[-1] > c: # 如果无法连续就出栈,加一次次数 st.pop() ans +=1 if st and st[-1] == c: # 相同的跳过 continue st.append(c) if st: ans += len(st) # 补一下最后还在栈里的次数 print(ans) if __name__ == "__main__": main()
defmin_merges(arr): n = len(arr) pre = [0] for x in arr: pre.append(pre[-1] + x) # dp[i][j]: 前i个元素,最后一段j开头,分多少段 dp = [[0] * (n + 1) for _ inrange(n + 1)] ans = 0
for i inrange(1, n + 1): for j inrange(i): # 最后一段 cur = pre[i] - pre[j] # 整体作为一段 if j == 0: dp[i][j] = 1 continue # 找上一段 for k inrange(j): last = pre[j] - pre[k] if dp[j][k] and last <= cur: # 上一段有效划分 dp[i][j] = max(dp[i][j], dp[j][k] + 1)