当前位置: 首页 > article >正文

[acwing周赛复盘] 第 94 场周赛20230311

[acwing周赛复盘] 第 94 场周赛20231118

    • 总结
    • 5295. 三元组
      • 1. 题目描述
      • 2. 思路分析
      • 3. 代码实现
    • 5296. 边的定向
      • 1. 题目描述
      • 2. 思路分析
      • 3. 代码实现
    • 六、参考链接

总结

  • 好久没做acw了,挺难的。
  • T1 模拟
  • T2 前缀和以及优化。
  • T3 贪心
  • 在这里插入图片描述

5295. 三元组

链接: 5295. 三元组

1. 题目描述

在这里插入图片描述

2. 思路分析

  • 设a=sum(0,x),b=sum(y,z)。那么best=a+b-(s-a-b)=2(a+b)-s。
  • 那么其实是找最大的a+b。用前缀和来处理这个事情。
  • 即pre[x] + (pre[z] - pre[y]),注意其实可以用左闭右开写法。
  • 由于数据量5000,可以枚举y和z,记录y之前的最大x即可。

  • 也可以优化成O(n),有点类似状态机DP。

3. 代码实现

def solve():
    """
    best = (0~x)+(y~z) - (s-(0~x)-(y~z)) = 2((0~x)+(y~z)) - s
    因此是 找最大的两段和, pre[x] + pre[z] - pre[y],其中x<=y<=z,
    记录y之前最大的pre[x],z之前最大的pre[x]-pre[y]即可
    """
    n, = RI()
    a = RILST()
    p = 0
    mx = [0, 0, 0, 0]  # best,x,y,z
    px = [0, 0]  # prex,x
    py = [0, 0, 0]  # pre[x]-pre[y]
    for z, v in enumerate(a, start=1):
        p += v
        px = max(px, [p, z])
        py = max(py, [px[0] - p, px[1], z])
        mx = max(mx, [p + py[0], py[1], py[2], z])       
    print(*mx[1:])


def solve1():
    n, = RI()
    a = RILST()
    pre = [0] + list(accumulate(a))
    mx = [0, 0, 0, 0]
    pm = [(i, v) for i, v in enumerate(pre)]
    for i in range(1, n + 1):
        if pm[i][1] <= pm[i - 1][1]:
            pm[i] = pm[i - 1][:]
    for y in range(0, n):
        for z in range(y, n):
            mx = max(mx, [pre[z + 1] - pre[y] + pm[y][1], pm[y][0], y, z + 1])
    print(*mx[1:])

5296. 边的定向

链接: 5296. 边的定向

1. 题目描述

在这里插入图片描述

2. 思路分析

貌似很难,但其实贪心能过。
  • 最大访问数就是尽量向外延伸,把所有访问到的边都朝外指。
  • 最小访问数就是遇到的边超里指,只走本来就有的有向边。
  • 代码实现时,建图记录边的id,遇到时判断当前方向和输入方向是否一致决定方向。
  • 注意有的边可能不会遇到,可以是任意方向。

3. 代码实现

def solve():
    n, m, s = RI()
    g = [[] for _ in range(n + 1)]
    edges = []
    for i in range(m):
        t, u, v = RI()
        edges.append((u, v, t))
        g[u].append((v, i))
        if t == 2:
            g[v].append((u, i))

    q = deque([s])  # 把遇到的边都变成正向
    vis = {s}
    d = [0] * m
    while q:
        u = q.popleft()
        for v, i in g[u]:
            if v not in vis:
                vis.add(v)
                q.append(v)
                if edges[i][2] == 2:  # 如果是无向边,让他u->v
                    d[i] = '+' if u == edges[i][0] else '-'
    print(len(vis))
    ans = []
    for x, (_, _, t) in zip(d, edges):
        if t == 2:
            ans.append(x if x else '+')
    print(''.join(ans))

    q = deque([s])  # 把遇到的边都变成负向
    vis = {s}
    d = [0] * m
    while q:
        u = q.popleft()
        for v, i in g[u]:
            if v not in vis:
                if edges[i][2] == 1:  # 有向边必须走
                    vis.add(v)
                    q.append(v)
                else:  # 无向边不走,u<-v
                    d[i] = '-' if u == edges[i][0] else '+'
    print(len(vis))
    ans = []
    for x, (_, _, t) in zip(d, edges):
        if t == 2:
            ans.append(x if x else '+')
    print(''.join(ans))

六、参考链接


http://www.kler.cn/a/132902.html

相关文章:

  • C++builder中的人工智能(27):如何将 GPT-3 API 集成到 C++ 中
  • 力扣题目解析--括号生成
  • web浏览器环境下使用window.open()打开PDF文件不是预览,而是下载文件?
  • Python数据分析:分组转换transform方法
  • 【论文复现】STM32设计的物联网智能鱼缸
  • torchvision库在进行图片转换操作中报antialias参数没有显式设置会导致不同图片后端中的值不统一的警告信息
  • 一文读懂:testcafe框架和页面元素交互
  • 小程序如何刷新当前页面
  • MATLAB 状态空间设计 —— LQG/LQR 和极点配置算法
  • 23111706[含文档+PPT+源码等]计算机毕业设计SSM框架网上书城全套微信支付电商购物
  • SpringBoot 统一功能处理
  • 阿尔法狗的算法解析-增强学习和蒙特卡洛树搜索算法
  • 如何使商城系统达到高并发?
  • 学习c#的第二十天
  • Spring学习③__Bean管理
  • 大语言模型|人工智能领域中备受关注的技术
  • 汽车ECU的虚拟化技术初探(三)--U2A虚拟化辅助功能分析1
  • 反转字符串中的单词
  • buildadmin+tp8表格操作(1)----表头上方添加按钮和自定义按钮
  • C#WPF中的实现读取和写入文件的几种方式
  • unity unityWebRequest 通过http下载服务器资源
  • Mysql -常见函数
  • 人生阶段总结
  • 2023年11月11日~11月17日周报(基于matlab生成模拟数据、批量修改文件名、重写dataset)
  • 所见即所得的动画效果:Animate.css
  • 梦想编织者——Adobe Dreamweaver