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

[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 = 0mx = [0, 0, 0, 0]  # best,x,y,zpx = [0, 0]  # prex,xpy = [0, 0, 0]  # pre[x]-pre[y]for z, v in enumerate(a, start=1):p += vpx = 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] * mwhile 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->vd[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] * mwhile 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<-vd[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))

六、参考链接

相关文章:

  • 解决:微软在登录时总是弹出需要家长或监护人同意才能使用该账户并且不断循环?
  • Elasticsearch:检索增强生成 (Retrieval Augmented Generation -RAG)
  • Spring 事务和事务传播机制
  • 2023年第九届数维杯国际大学生数学建模挑战赛
  • 一文图解爬虫_姊妹篇(spider)
  • 推介会如何做好媒体宣传
  • alias linux 命令别名使用
  • 数字化转型具体包含哪些内容?
  • Golang: Store Query Result in a Map
  • Django学习日志07
  • ZYNQ_project:test_fifo_255X8
  • 基于JavaWeb+SpringBoot+Vue电子商城微信小程序系统的设计和实现
  • 第十章 : 如何使用MockMvc 快速编写Reslful API 测试用例
  • Mac 安装 protobuf 和Android Studio 使用
  • Linux(3):Linux 的文件权限与目录配置
  • 「前端」从UglifyJSPlugin强制开启css压缩探究webpack插件运行机制
  • Android优雅地处理按钮重复点击
  • CODING 缺陷管理功能正式开始公测
  • eclipse的离线汉化
  • Java面向对象及其三大特征
  • js算法-归并排序(merge_sort)
  • PHP 的 SAPI 是个什么东西
  • PHP的类修饰符与访问修饰符
  • SQLServer之索引简介
  • 从零到一:用Phaser.js写意地开发小游戏(Chapter 3 - 加载游戏资源)
  • 分布式任务队列Celery
  • 简析gRPC client 连接管理
  • 开放才能进步!Angular和Wijmo一起走过的日子
  • 聊聊directory traversal attack
  • 前端js -- this指向总结。
  • 前端之Sass/Scss实战笔记
  • 人脸识别最新开发经验demo
  • 学习笔记DL002:AI、机器学习、表示学习、深度学习,第一次大衰退
  • ​水经微图Web1.5.0版即将上线
  • # 学号 2017-2018-20172309 《程序设计与数据结构》实验三报告
  • $(function(){})与(function($){....})(jQuery)的区别
  • (2/2) 为了理解 UWP 的启动流程,我从零开始创建了一个 UWP 程序
  • (C++20) consteval立即函数
  • (C语言)深入理解指针2之野指针与传值与传址与assert断言
  • (附源码)计算机毕业设计SSM智能化管理的仓库管理
  • (五) 一起学 Unix 环境高级编程 (APUE) 之 进程环境
  • (一)Dubbo快速入门、介绍、使用
  • (转)总结使用Unity 3D优化游戏运行性能的经验
  • (最简单,详细,直接上手)uniapp/vue中英文多语言切换
  • .“空心村”成因分析及解决对策122344
  • .apk文件,IIS不支持下载解决
  • .Family_物联网
  • .java 9 找不到符号_java找不到符号
  • .Net - 类的介绍
  • .NET 3.0 Framework已经被添加到WindowUpdate
  • .NET gRPC 和RESTful简单对比
  • .net MVC中使用angularJs刷新页面数据列表
  • .net websocket 获取http登录的用户_如何解密浏览器的登录密码?获取浏览器内用户信息?...
  • .net 怎么循环得到数组里的值_关于js数组
  • .NET/C# 利用 Walterlv.WeakEvents 高性能地中转一个自定义的弱事件(可让任意 CLR 事件成为弱事件)