AcWing 单调队列优化DP问题 1088. 旅行问题

import sys
sys.stdin = open('data.txt', 'r')

'''
问题做一下转换,把环拆开,组成长度为原来两倍的序列,把每个车站的油量和下一步的距离的差值
作为数组元素的数值,对这个长度是2n的数组求前缀和序列,其实题目要求的就是所有长度是n的滑动
窗口里面前缀和的最小值和窗口开始位置前面一个前缀和的差值的最小值是不是小于0,如果小于0,
说明中间n次移动至少有一次出现了没有油的情况,顺时针和逆时针都做一遍单调队列求滑动窗口最小值
的流程,两次结果有一次是成功的,就可以从该位置绕一圈回到原点
'''


arr = []
n = int(input())
flag = [0] * n

l = []
for _ in range(n):
    a, b = map(int, input().split())
    l.append((a, b))
    arr.append(a-b)

arr =  arr * 2
for i in range(1, 2*n):
    arr[i] += arr[i-1]


# 求长度为n的滑动窗口中的极小值
from collections import deque

# 顺时针
que = deque()
for idx, val in enumerate(arr):
    base_val = arr[idx-n] if idx >= n else 0

    while len(que) > 0 and idx - que[0][0] >= n:
        que.popleft()
    while len(que) > 0 and val <= que[-1][1]:
        que.pop()

    que.append((id
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值