AtCoder abc140

C - Maximal Value

遍历比较一下相邻的值

D - Face Produces Unhappiness

反向思维,考虑不开心的点

字符串可以规约成RR...RLL...LRR...RL...L这样相间的情况

每次操作只有把整段的R或者L反向,才能减少不开心的点

有几种不同的情况

RLRLR

LRLR

RLRL

LRLRL

2.3两种情况是一样的

分情况考虑即可

python 复制代码
# -*- coding: utf-8 -*-
# @time     : 2023/6/2 13:30
# @author   : yhdu@tongwoo.cn
# @desc     :
# @file     : atcoder.py
# @software : PyCharm
import bisect
import copy
import sys
from sortedcontainers import SortedList
from collections import defaultdict, Counter, deque
from functools import lru_cache, cmp_to_key
import heapq
import math
sys.setrecursionlimit(50005)


def main():
    items = sys.version.split()
    if items[0] == '3.10.6':
        fp = open("in.txt")
    else:
        fp = sys.stdin
    n, k = map(int, fp.readline().split())
    s = fp.readline().strip()
    l, r = [], []
    last = '#'
    t = 0
    for i in range(n):
        if last != s[i]:
            if last == 'L':
                l.append(t)
            elif last == 'R':
                r.append(t)
            t = 1
        else:
            t += 1
        last = s[i]
    if last == 'L':
        l.append(t)
    else:
        r.append(t)
    if len(l) == len(r):   # LRLRLR or RLRLRL
        if k >= len(r):
            ans = n - 1
        else:
            c = max(0, len(r) - 1 - k) * 2
            ans = n - 2 - c
    elif len(l) == len(r) + 1:
        if k >= len(r):
            ans = n - 1
        else:
            c = max(0, len(r) - k) * 2
            ans = n - 1 - c
    else:
        if k >= len(l):
            ans = n - 1
        else:
            c = max(0, len(l) - k) * 2
            ans = n - 1 - c
    print(ans)


if __name__ == "__main__":
    main()

E - Second Sum

这类题目的通解是计算每个点能取到几个区间,将贡献和累加起来

记录位置列表为pos,即posa\[i] = i

需要维护一个双向链表,记录下每个位置的左边和右边。从小到大遍历数字i的位置,遍历完之后将i的位置删除。这样可以保证链表中每个位置代表的数字都比当前的数大。

比如例子 2 3 1中

pos1=3 pos2=1 pos3=2

1的位置是3,开始时3的左边比它大的位置是2,右边是位置4(边界)

因为当右边取边界之内的数字时(也就是只取到位置3)

左边可以取位置2,但是不能取到位置1,因为从小到大取的原因,位置1的数2比当前的数1更大。也就是只能取一次位置。

最后得到的位置列表是2,3,代表原始列表是3,1

python 复制代码
# -*- coding: utf-8 -*-
# @time     : 2023/6/2 13:30
# @author   : yhdu@tongwoo.cn
# @desc     :
# @file     : atcoder.py
# @software : PyCharm
import bisect
import copy
import sys
from sortedcontainers import SortedList
from collections import defaultdict, Counter, deque
from functools import lru_cache, cmp_to_key
import heapq
import math
sys.setrecursionlimit(50005)


def main():
    items = sys.version.split()
    if items[0] == '3.10.6':
        fp = open("in.txt")
    else:
        fp = sys.stdin
    n = int(fp.readline())
    a = list(map(int, fp.readline().split()))
    a = [0] + a
    lmax = [0] * (n + 2)
    rmax = [0] * (n + 2)     # link pos, bigger than current
    pos = [0] * (n + 2)
    for i in range(1, n + 1):
        lmax[i] = i - 1
        rmax[i] = i + 1
        pos[a[i]] = i

    ans = 0
    for i in range(1, n + 1):
        p = pos[i]
        l1, r1 = lmax[p], rmax[p]
        l2, r2 = lmax[l1], rmax[r1]
        c1 = max(0, (p - l1) * (r2 - r1))
        c2 = max(0, (r1 - p) * (l1 - l2))
        ans += i * (c1 + c2)
        rmax[l1] = r1
        lmax[r1] = l1
    print(ans)


if __name__ == "__main__":
    main()
相关推荐
凡人叶枫6 分钟前
Effective C++ 条款24:若所有参数皆须要类型转换,请为此采用 non-member 函数
linux·前端·c++·算法·嵌入式开发
洛水水8 分钟前
【力扣100题】87.只出现一次的数字
数据结构·算法·leetcode
HZ·湘怡8 分钟前
排序算法之希尔排序(2)--菜鸟先飞
数据结构·算法·排序算法·希尔排序
乐观勇敢坚强的老彭10 分钟前
2026全国青少年信息素养大赛(Python小学组)复赛复习讲义
python·算法·数学建模
林间码客19 分钟前
02数据挖掘:数据属性、类型与相似性度量
人工智能·算法·机器学习
阿标在干嘛20 分钟前
从“拍脑袋”到“数据驱动”:政策平台的A/B测试实践
大数据·人工智能·算法·ab测试
实在智能RPA24 分钟前
气象预警Agent等级判定算法:2026年AI驱动的概率集合预报与自动化闭环实践
人工智能·算法·ai·自动化
风筝在晴天搁浅1 小时前
LeetCode CodeTop 82.删除排序链表中的重复元素Ⅱ
算法·leetcode·链表
189228048611 小时前
NV114固态MT29F16T08EWLEHD6-MES:E
人工智能·算法·缓存·性能优化
Tairitsu_H1 小时前
[LC优选算法#4] 滑动窗口 | 串联所有单词的⼦串 | 最⼩覆盖⼦串
c++·算法·滑动窗口