CF1849
氵
在吃了五次罚时后,我终于放弃了卡常优先队列,并发现:把余 \(0\) 看作余 \(k\),答案就是余数从大到小排列的,每种余数内部又按照下标排序。
我为什么没想到哈希?自我检讨:见到关于字符串判定相等/不同个数时,一定要尝试用哈希!!!
记前缀 \([0,i)\) 的哈希值为 \(f_i\),全为 \(1\) 的前缀 \([0,i)\) 的哈希值为 \(g_i\),\([0,i)\) 中 \(1\) 的个数为 \(h_i\)。
设排序的区间为 \([l,r)\),则新哈希值为 \(f_n-f_r+f_l+g_r-g_{[r-(h_r-h_l)]}\)。
用 std::set 维护即可。
非哈希做法:
对每个位置求出它左边(包括它)的第一个 0 和右边(包括它)的第一个 1。存在两个数组 \(lf,rg\) 里面。
对于一个修改区间 \([l,r]\),它真实改动的部分其实是 \([rg_l,lf_r]\)。如果这两个元素设定为不存在,那么就没有修改。
把每对 \((rg_l,lf_r)\) 用 set 维护。
贪心法:先有一个错误但是有启发性的贪心:先把所有 \(2\) 涂黑,然后标记所有 \(2\) 边上的,再把剩下的涂黑。
这是错的,比如 0 2 1 2 0,把第一个 \(2\) 涂黑之后可以传递过去。
于是想到把一段连续非 0 的数合并为一个块。 这一段只需要一个硬币。
如果一个块内有 \(2\),这个块左右两边的两个都能被涂黑;如果只有 \(1\),那只有一个能被涂黑。
模拟即可。
dp 法:
\(dp_i\) 表示涂黑前 \(i\) 个的最小硬币数。
基本的,\(dp_{i+1}=\min(dp_{i+1},dp_i+1).\)
若 \(a[i+1]=1\),\(dp_{i+2}=\min(dp_{i+2},dp_{i}+1)\)。
若 \(a[i+2]=1\),\(dp_{i+2}=\min(dp_{i+2},dp_{i}+1)\)。
若 \(a[i+1]=1\),\(dp_{i+2}=\min(dp_{i+1},dp_{i}+1)\)。
若 \(a[i+1]=2\),\(dp_{i+2}=\min(dp_{i+2},dp_{i}+1)\)。
若 \(a[i+2]=2\),\(dp_{i+2}=\min(dp_{i+3},dp_{i}+1)\)。
答案为 \(\min(dp_n,dp_{n+1}).\)
朴实无华的题面:有多少个区间最大值在最小值右边。
先单调栈求出每个数左右两边第一个比他大/小的位置。
记 \(a_i\) 左边第一个比它大的位置是 \(l_i\),右边第一个比它大的位置是 \(r_i\),左边第一个比他小的位置 \(s_i\),右边第一个比它小的位置 \(t_i\)。
按套路,枚举每个 \(a_i\) 作为区间的最大值。
有两种方法计算这种区间的个数:
枚举 \(j:l_i\le j<i\),求出 \(j\sim i-1\) 的最小值 \(p\),要求在这个区间内 \(i\) 的右边不允许有比 \(p\) 小的。(否则最大值 \(i\) 就在最小值左边)即右端点 \(\ge t_p\) 就不合法,总个数减去不合法个数。
枚举 \(j:i<j\le r_i\),求出 \(i+1\sim j\) 的最小值 \(p\)。同理,只要左端点 \(\le s_p\) 就合法。
注意以上两种方法都需单独考虑 \(i=j\) 的情况。
我们枚举 \(a_i\) 时,根据 \(i-l_i,r_i-i\) 的大小选择复杂度较低的方法。便可通过此题。
但是感觉时间复杂度不太对啊?
如果按最大值从大到小枚举,每次在循环 \(x\) 时如果是重复循环,区间长度至多是上一次循环 \(x\) 时的一半。
为什么呢?假设上一次循环 \(x\) 时是枚举到 \(a_i\),这次是 \(a_j\)。(不妨 \(x\) 是左端点)
显然应该 \(j<i\),不然因为我们从大到小枚举,有 \(a_i>a_j\),那枚举 \(a_j\) 的左端点不应该枚举到 \(x\),因为此时 \(x\) 在 \(i\) 的左边,违反了上面的方法。
那么就有 \(x<j<i\),注意因为从大到小,所以 \(r_j\le i\)。
我们选择了用枚举左端点的方法,说明 \(j-l_j\le r_j-j\le i-j\).
那也就说明 \(j\) 这个位置应该在 \([l_j,i]\) 的左半部分,而 \(x\in [l_j,j]\),上次 \(x\) 被枚举到是和 \(i\) 一起,显然应该有 \(j-x\le \dfrac{i-x}{2}\).
那每个数被枚举到,区间长度至少除以 \(2\),因此复杂度 \(O(n\log n)\).
随机推荐
- 一套前后台全部开源的H5商城送给大家
博主给大家推荐一套全部开源的H5电商项目waynboot-mall.由博主在2020年开发至今,已有三年之久.那时候网上很多的H5商城项目都是半开源版本,要么没有H5前端代码,要么需要加群咨询,属实恶 ...
- 每天学五分钟 Liunx 111 | 存储篇:NFS
NFS NFS(Network File System,网络文件系统),它可以通过网络让不同操作系统,不同机器共享彼此的文件. NFS 分为服务端和客户端.服务端提供共享的文件目录,客户端将该目录挂载 ...
- 使用vs插件进行远程调试linux服务器
魔改Raspberry Debugger插件实现linux远程开发 本插件是在树莓派的远程调试下修改实现并未全部本人实现 插件基本使用: 插件目前只能在.net core 3.1到.net 6的框架下 ...
- Java21 + SpringBoot3集成easy-captcha实现验证码显示和登录校验
目录 前言 相关技术简介 easy-captcha 实现步骤 引入maven依赖 定义实体类 定义登录服务类 定义登录控制器 前端登录页面实现 测试和验证 总结 附录 使用Session缓存验证码 前 ...
- 30-组合可编程逻辑器件-PLD
组合可编程逻辑器件 1.PLD的结构 1.1 结构 1.2 表示方法 实心点表示连接,但是不可编程 ×点表示连接,但是可以编程 2.编程技术 2.1 熔丝工艺 每个输入线连接二极管和保险丝 2.2 电 ...
- ONVIF网络摄像头(IPC)客户端开发—ONVIF介绍
1.前言: 网上已经有很多关于ONVIF开发的资料,这里概括介绍一下ONVIF协议以及介绍一下我自己在开发ONVIF网络摄像头的一些流程和经验,做个开发记录和经验总结,以备将来查看,也可供他人参考 ...
- scikit-learn.datasets 机器学习库
scikit-learn是一个用于Python的机器学习库,提供了大量用于数据挖掘和数据分析的工具.以下是对这些函数和方法的简要描述: clear_data_home: 清除数据集目录的内容. dum ...
- 重写SpringCloudGateway路由查找算法,性能提升100倍!
如果你也在做SpringCloudGateway网关开发,希望这篇文章能给你带来一些启发 背景 先说背景,某油项目,通过SpringCloudGateway配置了1.6万个路由规则,实际接口调用过程中 ...
- [转帖]OceanBase v4.2新增字符集GB18030_2022说明
OceanBase v4.2新增字符集GB18030_2022说明 https://open.oceanbase.com/blog/7698399520 1. 概述 GB18030 标准作为信息技术 ...
- [转帖]《Linux性能优化实战》笔记(22)—— 网络丢包问题分析
所谓丢包,是指在网络数据的收发过程中,由于种种原因,数据包还没传输到应用程序中,就被丢弃了.这些被丢弃包的数量,除以总的传输包数,也就是我们常说的丢包率.丢包率是网络性能中最核心的指标之一.丢包通常会 ...