01.03 CW 模拟赛 T2. game

news/2025/1/7 13:36:24/文章来源:https://www.cnblogs.com/YzaCsp/p/18650855

思路

先把赛时的思路搬一下


你发现确定两个人的起始点, 其实是可以确定 \(\rm{Alice}\) 的选点可能的, 考虑写个代码验证一下
具体的, 就是分成两个弧, \(\rm{Alice}\) 可以选择一个弧的优势(过半), 然后其他的劣势

感觉现在是猜结论, 全靠感性, 我也不知道怎么解释这个问题

那么这样枚举两个起始点, 好像是 \(\mathcal{O} (n^2)\) 的?

具体的

  • 两边都是奇数个 : 可以选择两种方式, 选取一边的超过一半和另外一边的少于一半
  • 两边都是偶数个 : 唯一情况分一半
  • 一奇一偶 : 唯一情况多吃一点

所以这样子打下来, 可以知道 \(\rm{Alice}\) 确定唯一占领时, \(\rm{Bob}\) 怎么选才能最大化自己, 然后就知道答案了

做到 \(\mathcal{O} (n^2)\) 唯一需要的是考虑环上的和怎么快速计算
首先是枚举两个分割点
如何把两边分开 : 断环为链拷两遍
如何计算和 : 前缀和
如何快速计算分一半 : 计算编号之差

我们细致一点方便写代码:
首先读入这个环的时候就将其断开复制两遍
枚举 \(\rm{Alice}\) 的起手点 ( \(\rm{subtask} \ 3\) 直接钦定为 \(1\) ), 对于这个点我们枚举 \(\rm{Bob}\) 的所有起手点, 然后我们可以找到这个起手点的两个位置, 显然的根据上面的分类讨论

  • 两边都是奇数个 : 可以选择两种方式, 选取一边的超过一半和另外一边的少于一半
  • 两边都是偶数个 : 唯一情况分一半
  • 一奇一偶 : 唯一情况多吃一点

还有一个问题 : 如何在链上找到两个起手点
其实很简单, 假设两个起手点 \(u < v\) , 直接找到 \(v\) 第二遍复制的位置即可

然后检查答案即可

注意同 \(\rm{Alice}\) 起手点之间取 \(\min\) , 不同之间取 \(\max\)


考虑优化到可接受的时间复杂度

因为你枚举 \(\rm{Alice}\) 的起手点已经 \(\mathcal{O} (n)\) 了, 那么你找到 \(\rm{Bob}\) 的起手点使得答案取 \(\min\) 一定要做到 \(\mathcal{O} (1)\)
这个看起来非常不可能啊, 但是实际上如果你更加理性是想得到的

考虑 \(\rm{Alice}\) 选择起手点之后, \(\rm{Bob}\) 能够做到怎样限制 \(\rm{Alice}\) 的选段
还是考虑上面的这些性质, 放到整体上来做

对于 \(\rm{Alice}\) 的一个起手点, 事实上我们可以找到 \(\lceil \frac{n}{2} \rceil\) 个连续的弧, 对于 \(\rm{Bob}\) 的所有起手点选择, 其实一定可以将其限制到这 \(\lceil \frac{n}{2} \rceil\) 个连续的弧中弧内和最小的一个, 具体的, 按照上面的规则反推即可


问题简化为, 对于每个点 \(i\) , 找到覆盖 \(i\) 的所有长度为 \(\lceil \frac{n}{2} \rceil\) 的弧中, 弧内和最小的一个

怎么解决?
可以预处理出所有长度为 \(\lceil \frac{n}{2} \rceil\) 的弧长, 然后队列维护即可, 不困难
对于枚举的所有点, 我们单调队列处理弧的情况, \(\rm{belike}\) :
pEpJWcV.png

但是你发现这和普通的队列枚举并不太相同, 即到了后面会加入最初被删除的线段
类似于断环为链, 事实上我们可以拷贝两份弧, 仅仅需要 \(\mathcal{O}(n)\) 的空间

考虑怎么维护这种神秘玩意, 你注意到就是一个滑动窗口, 那岂不是无敌了
当然你优先队列直接做应该更简单吧

实现

框架

我们细致一点方便写代码:
首先断环为链, 复制一份接到后面
然后跑弧长, 然后跑优先队列优化

代码

不打算这么困的时候挑战我的码力了

总结

这个题不给 \(\rm{subtask \ 3}\) 我可能会直接搞到正解, 也有可能一分不得???

暴力算法的优化往往需要更整体的思考
不行打表找规律

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/863553.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

1.3 可压缩流:喷管和机翼

1.3 可压缩流:喷管和机翼 前言 劳张、劳江必看,劳高请随缘。 超音速喷嘴 基本 对于等熵流动,给出速度变化和管道截面面积变化的关系式: \[\begin{equation}(M^2-1)\frac{dV}{V}=\frac{dA}{A} \end{equation} \]对该公式分3种情况讨论:低速、亚音速,M<1:此时\(M^2-1&l…

C++程序运行的三种方式

1、源代码的注释,2、c++运行方式一、例程 编一个程序,计算机随机产生一个整数(1至5),自己输入一个整数,若两数相同,则输出“恭喜你,中奖了!奖金10元”,否则输出“没中奖,请付费2元”;同时公布中奖号码。 #include <iostream> #include <cstdlib> …

25.01.03

-1喜欢我 \(O(n^2 \log^2 n)\) 过 \(2e5\) 吗😋_ _ _ _ _ _ Ciallo~(∠・ω< )⌒★A 有解的一个必要不充分条件是: 设 \(L_i\) 表示 \(l \le i\) 的左端点数量,\(R_i\) 表示 \(r < i\) 的右端点数量,对于每个位置 \(i\) 满足 \(L_i \ge i \wedge R_i < i\)。 意…

MES 包装 称重 测试备忘

称的功能都差不多,需要MES适配不同品牌的称。 串口输出2中模式:可以调节 精度:精度0.1g 精度是0.001kg 第一种(默认):不停的串口输出。 输出速度很快,容易导致程序死掉。 第二种模式:重量稳定输出。 下面是重量稳定输出模式截图: ------ erwa.cn 二娃测试备忘

深度学习基础理论————训练加速(单/半/混合精度训练)/显存优化(gradient-checkpoint)

主要介绍单精度/半精度/混合精度训练,以及部分框架(DeepSpeed/Apex) 不同精度训练 单精度训练(single-precision)指的是用32位浮点数(FP32)表示所有的参数、激活值和梯度 半精度训练(half-precision)指的是用16位浮点数(FP16 或 BF16)表示数据。(FP16 是 IEEE 标准…

使用学生优惠创建 Azure Database for MySQL 数据库

文章首先强调了需要一个已通过学生认证的 Azure 账户,然后详细讲解了从登录 Azure 门户页面、选择免费服务、配置服务器和网络等步骤,最终成功创建并部署 Azure Database for MySQL。前言 在此之前,你需要拥有一个已通过学生认证的 Azure 账户。关于通过 Azure 学生认证,网…

【Windows】修改虚拟内存位置

这篇文章详细介绍了如何在 Windows 系统中将虚拟内存文件(pagefile.sys)从 C 盘移动到其他盘。步骤包括查看文件位置、检查和关闭 C 盘加密、修改注册表、设置新的虚拟内存位置并重启电脑,最终实现文件转移。问题:系统优化中,希望将pagefile.sys文件(即虚拟内存)移动到其…

ex7.3

import numpy as np from scipy.interpolate import lagrange import matplotlib.pyplot as plt import matplotlib yx = lambda x: 1/(1+x**2) def fun(n): x = np.linspace(-5, 5, n+1) p = lagrange(x, yx(x)) # n次插值多项式 return p x0 = np.linspace(-5, 5, 100) plt…

【hashMap扩容】关于hashMap扩容以后,新下标的理解

首先我们知道hashMap在存取元素的时候的下标算法是这样子的 根据当前元素(e)的hash值((e.hashCode()) ^ (e.hashCode() >>> 16))去与上当前hashMap的容量减一(Cap-1) put和get都是如此 put get所以在扩容算法中,元素的坐标也应是用这种方式存的,看一下代码我们会发现…

【自动化测试基础】Pytest前后置处理

Pytest的前后置(固件、夹具)处理 有一些初始化配置和测试之后的收尾,只需要处理一次,这个时候我们就要用到夹具。 Pytest提供了以下几种setup和teardown方法:setup_function 和 teardown_function: 用于每个测试函数 setup_method 和 teardown_method: 用于每个测试方法(…

进阶大模型开发框架LangChain

本文来自博客园,作者:王竹笙,转载请注明原文链接:https://www.cnblogs.com/edeny/p/18650785

【unity】学习制作类银河恶魔城游戏-6-

碰撞检查 控制面板定义变量射线功能创建射线实体分配射线实体调整射线编辑碰撞代码 创建地面和墙面的层判断是否碰撞到了地面这行代码的作用是:从groundCheck的位置开始,向下(Vector2.down)投射一条射线,距离为groundCheckDistance,只检测whatIsGround指定的层上的物体。…