[每日 C] Light Switches

前言#

虽然说看过题解的 C 没有自己做的必要
但是我没看懂啊

开了一个之前的时间胶囊, 其中 50% 的部分都没有实现, 汗
不过至少可以在学校控制自己
然后就是物理隔断很有用, 不知道怎么物理隔断 B

思路#

首先考虑一盏灯被点亮的区间, 不难发现形如
[ai+λk,(λ+1)k) , 其中 λ 为正偶数

问题转化为

i[1,n],[ai+λk,(λ+1)k) , 是否存在一个点 p , 使得所有区间包含 p

不难发现对于所有 i , 区间形如一些长度相同的段, 但是怎么处理

首先考虑什么情况之下无解
不难发现当 i,j s.t. |aiaj|k mod 2=1 时无解
但是如果你朴素做法, 判无解都超时


一如既往的润去看了 TJ , 今天睡这么久怎么还是困

模拟几组样例, 不难发现只有 maxai 往后的部分才是有用的
根据 2k 次一个周期, 我们可以 aiai mod 2k , 这样就把 ai 放缩到了一个小范围且不影响答案

仅仅这样还不够, 你稍微分析可以发现答案一定在 maxaimaxai+k 之间 (注意右边是开的)
具体一点, 你发现出了这个区间后面的都是循环的, 不考虑

所以现在, 问题转化为, 求 [amax,amax+k) 区间中, 第一个被 n 个区间覆盖的点
不难发现可以用差分处理, 假设当前的答案为 p , 那么我们只需要找到原串中第一个 amax+ans mod 2k=p 的点即可


总结一下, 首先注意到可以放缩

放缩完之后, 用差分快速处理覆盖, 随后 O(k) 做出变换后的答案
简单对应到原序列即可

更一般的, 你注意到事实上所有 amax+ans mod 2k=pans 都是符合要求的, 这是因为循环性, 而循环区间最大是 4k , 简单操作即可


进行一个复习

题意

给定一组 aia_i , 表示第 ii 个元素对应的区间为
Si=[ai+pk,ai+(p+1)k](p mod 2=0,p0)S_i = \bigcup \Big[a_i + pk, a_i + (p + 1)k\Big] \big(p \textrm{ mod } 2 = 0, p \geq 0\big)
求最小的 xx 使得 i,xSi\forall i, x \in S_i

  • 定义合法情况, 要求输出一组合法情况 / 合法情况的最值问题 / 求方案数
    • 列出合法情况需要满足的表达式, 在原序列中贪心选择最优情况
    • 构造: 先推性质, 不行打表
    • 找到不合法情况在什么时候出现, 通过对不合法情况的转化构造最优的合法情况
    • 先找到一组合法解, 然后在基础上进行调整
    • 找到所有情况统一的构造方案
    • 循环 / 同余类问题一般可以找到类似循环节的东西

画一下观察性质
pE3vBW9.png

不难发现如果存在, 一定会在 [maxai,maxai+k] 中取得一个最优解
想到枚举区间中的点, 转化成判定性问题

但是至少要 O(1) 判断不然我不炸了吗
考虑点 x 合法对应的性质

i,xaik mod 2=1

考虑快速维护 xaik , 不难发现在 [maxai,maxai+k] 中, i,Δ1
如果能够维护每个 i 对应的分割点, 即可简单约束答案

之前的做法多半是神经

总结#

循环类问题一定要将考虑范围缩小, 一般使用取余等方法

注意最后答案一定要映射回原串

posted @   Yorg  阅读(4)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
more_horiz
keyboard_arrow_up light_mode palette
选择主题
menu
点击右上角即可分享
微信分享提示