2月做题记录
2月做题记录
✩ trick
✯ 会大部分,要提示
✬ 会小部分/完全没想到,看了才会
◈ 脑电波
✡ 有某一算法的神秘通用性质
⊗ 待补
- 2月做题记录
- 【PR #14】安顿 ✩✯
- 【PR #14】狼抓兔子 ✯
- 【PR #14】字符串 ✡✩✬
- CF2045J Xorderable Array ✩
- P4704 ✩✯
- CF1693F
- CF1329E ✩✯
- CF1637H ✯✩
- CF1481F
- GYM101221A ✩✬
- AGC024E
- AGC041F ✩✬
- ARC093F
- ARC100F ✩✯
- qoj5367
- [ROI 2017] 学习轨迹 ✯✩
- ARC053D ✩✯
- [USACO24JAN] Merging Cells P
- P9318 [EGOI 2022] Lego Wall / 乐高墙
- P10432 [JOISC 2024] 滑雪 2 (Day1)
- P10197 [USACO24FEB] Minimum Sum of Maximums P
- 【NOIP Round #5】青鱼和区间 ✯
- 【NOIP Round #5】青鱼和怪兽/[ARC016D] 軍艦ゲーム ✩
- D2 - Club of Young Aircraft Builders (hard version)
- CF865D Buy Low Sell High ✩
- AT_wtf22_day2_c Jewel Pairs ✩✬
- ARC186A ◈✩
- ARC186B
- ARC186C
- ARC186D
- 字符串
- 树
【PR #14】安顿 ✩✯
我组合数化式子咋恁烂呢
令
区间异或和可以用前缀异或和差分一下表示,且显然前缀异或和数组一一对应了一组
相当于要求选出一个极长子序列,满足相邻俩元素的异或和不为
这个条件是比较严苛的,对于所有
对于一个长为
需要快速计算
设
当然对于这个段在两端的情况就概率那去掉一个
复杂度
【PR #14】狼抓兔子 ✯
最开始想的是显然狼的匹配肯定不会出现,
然后正解是维护
- 每走一步,要
- 如果当前是狼,若有
只,显然 - 若是兔子,有
只,不必全部放下去,则有
显然每一步都满足凸包性质,只需要支持加上一个
可以平衡树维护的
好像有反悔贪心的做法。。。?
【PR #14】字符串 ✡✩✬
首先有个显然的在
然后可以考虑用一些主元来表示所有的元素
注意到
???这怎么想到的啊
考虑怎么用主元表示所有
复杂度
CF2045J Xorderable Array ✩
对于限制,
所以变换一下,设
现在枚举
- 若当前位
为 ,则必须把 在这一位是 的放前面 - 若当前位
为 ,此时 在这一位不能有相同的值,无其余限制
我们称每一层还放到一起的那些数的集合为等价类
发现每一层的划分只和
进一步的,对于
所以可以一开始先确定前
此时把大小
考虑当前
- 存在
,此时 在这一位只能是 ,然后所有 中在这一位是 的就被扔了 - 都是
- 若
在该位是 ,那么 直接清空, 后面的位就随便填了 - 若
在该位是 ,那么 不变
- 若
若建一个
可以发现,这也代表着
那么方案数就是简单的了
视
P4704 ✩✯
显然直线和圆的交点会选在圆的两个结点的中心,然后和这条直线相交的线段是那些两个端点不在被该直线划分出来的两个弧的同一个弧的
发现对直线直接考虑怎么放不好做,转为考虑直线和圆的那些交点
显然对每条线段,被它划分的两个弧里都至少要有一个交点,发现只要满足这个条件,然后若点有
拆环为链,如果是序列,那么就是贪心,找到最前面的
这样是
但是可以做到线性的,考虑所有限制区间中最短的那个,设它的长为
总复杂度就
CF1693F
这道题比较经典吧
首先显然每次操作都会有
那么根据当前是
可以
当然也可以把前缀和存下来,然后实时维护一下
可以做到
CF1329E ✩✯
一开始一直在想构造的方式,但是并没有太多进展
这种就转换思路,考虑怎样的
,
剩下的就简单了,显然对于第二个条件,能得到
-
若
此时答案一定为
,取任意 ,因为 ,且 ,所以一定有 -
若
因为
,且当 就不合法了,所以对于每个点 ,都会有组限制 ,表示 和 至少要满足一个要求把所有二元组分成两组
和 ,使得 最小,显然可以按 排序后从大到小扫即可
复杂度
CF1637H ✯✩
考虑选出的位置集合是
有一个重要的性质,对于任意逆序对
考虑证明:
为方便描述,把
考虑每个部分在把
-
首先把
替换成 本身就有 的贡献 -
对于四个角,块
,显然无变化 -
对于这个十字形的部分,发现只有块
在 的部分和块 中不在 的部分产生的此时,我们采取这样的策略,一直把
往块 中在 的点跳, 一直往块 中不在 中的点跳,直到不能跳,此时把 替换成 一定不劣,然后再沿着这个跳的路径跳回来,再继续换显然这样就证得了我们的结论
有了这样一个结论后,再来考虑把总的贡献尽量拆分成
根据我们的性质,对于一个
这里能直接选前
复杂度
CF1481F
设树高
猜测其余情况就是
遍历每一层,设
GYM101221A ✩✬
我不会构造,玉玉
首先构造的
手摸可以发现答案是
最终有
考虑怎么构造,这个证明的方式也给我们提供了思路
显然实际有用的空位只有俩,那么现在就是 _ _ B A B A ... B A B A
,把最后一个 A B
放到前面去,变成 A B B A ...B _ _ A
,再把第五位和第六位拿到空位上,变成 A B B A _ _ ... B B A A
,对于中间的部分就可以递归处理了
AGC024E
发现每次插入的数,只要满足在它插入的位置后第一个和它的值不同的那个数的值小于它即可
又考虑到对于一段数值都相同的区间,任意顺序的插入会导致算重,所以钦定每次插到末尾
即我们只需要满足插入位置的后一个数值小于当前插入的这个树值即可
这种类型,显然考虑
设
把
AGC041F ✩✬
第一眼会想到要容斥,钦定
直接这样考虑没前途,发现对于
考虑每一个连续行,长度为
中的全都没被钦定, 中有被钦定的,
但是注意到只是这样是可能会存在
枚举
还是考虑每一个连续行,长度为
中的全都没被钦定, 中有被钦定的,
发现答案只与
trick,反过来算,原本是
,现在变成
把棋盘划分成类似树形的样子(即每个连续行为一块,相同的连续行自然可以合并起来),发现点
复杂度就是树形背包再加上代价的
ARC093F
直接计算很不好做啊,考虑容斥,钦定
朴素的
复杂度
ARC100F ✩✯
首先容斥,用所有的序列的权值-不合法的序列的权值,前者就是
对于后者,分为两个大类来处理:
-
若
中的元素互不相同 ,准确来说,是 中存在 的连续段使得区间内元素不相同,直接不用管了 ,注意到无论 的具体形态如何,答案都是一样的,那么直接算出所有不合法的序列中包含了多少 长度的连续段满足段内所有点的颜色都不同,这个直接 , ,分别表示当前长度为 ,最长满足元素两两不同的后缀的长度为 的方案数和权值和
-
若
中存在相同的元素此时,枚举
所处的位置,因为被 划分后空白的两段互不影响,所以直接先预处理 的值,最后弄一下就好
复杂度
这题主要就是要想到按
qoj5367
发现操作可以表示为,每次先操作
那么可以
复杂度
[ROI 2017] 学习轨迹 ✯✩
首先答案的下界是两个序列的和的
这说明,我们在两个序列中选的这两个子区间,至少有其中一个要满足它的区间和大于原序列和的一半,假设是
那么找到
这里很牛啊
现在对
复杂度
ARC053D ✩✯
首先显然会想到,设
转移有
发现当
发现我们的操作可以弄到图上,即一个网格图,左上角是
那么我们现在就在点
那么枚举
复杂度
[USACO24JAN] Merging Cells P
直接
复杂度
P9318 [EGOI 2022] Lego Wall / 乐高墙
根号分治啊
考虑以下两种做法:
容斥,钦定某些相邻的列不连通,这个复杂度
直接
平衡一下,总复杂度
P10432 [JOISC 2024] 滑雪 2 (Day1)
分析一手可以得到,会增加
一个点只要
那么说明有用的
当然这里可能有的实现把加入接口直接就立刻加入的话,可能可以做到只需要把
压入状态中即可
同高度的点显然只会取
复杂度
P10197 [USACO24FEB] Minimum Sum of Maximums P
考虑这样一个情况,若只钦定了
钦定
对于
再考虑到这样一个性质,所有相邻关键点的区间包含的点的值域(除了关键点),要么包含,要么不交
那么直接
复杂度
【NOIP Round #5】青鱼和区间 ✯
题目的要求等价于,对每个点
对于不合法的,即存在
这里我一开始一直在想区间
发现其实做麻烦了,原本的想法是,对于所有
这样我们的序列
复杂度
其实正解就相当于只保留了我原本想的那种
的最外层啊,还是要多想一下转移有没有弄复杂
【NOIP Round #5】青鱼和怪兽/[ARC016D] 軍艦ゲーム ✩
思路差不多,就用前面这个举例
转移设
转移
发现转移会在
复杂度
D2 - Club of Young Aircraft Builders (hard version)
对于
现在有些位置上的
发现设
那么
设
CF865D Buy Low Sell High ✩
反悔贪心经典题,比较简单吧,看到谁在发就看了一眼
考虑这样一个贪心,要求当前点
那么每次遍历到
复杂度
AT_wtf22_day2_c Jewel Pairs ✩✬
感觉太牛了,感谢来自假Op的推荐喵
首先
显然小点内部非同色点可以任意匹配,大点只能和部分非同色小点匹配
有一个显然的性质,我们肯定是优先把小点和大点之间匹配了再去考虑匹配剩下的小点与小点
那么现在来考虑匹配小点和大点,设大点的
把所有的点按
直接判断
直接这样不好做,主要是因为还有颜色的限制,但是注意到,如果我们反着来,即维护
所以有个很牛的转换,设
显然所有p及之前的大点
+所有p之后c是c_i的所有点
的数量
可以线性维护
再考虑小点怎么选,考虑求出
对于这个性质的证明:
考虑反证,也就是说,要使得
中的大点都能匹配上的所有匹配方案中,都有 小点在最大匹配中能匹配上但在这里匹配不上的点 如果该点后面还有匹配向非
小点的非 大点,显然能直接让该大点和该 小点匹配,显然总是能找到的(先不考虑答案优不优的情况)
设
-
若
若
,就扔一个点,现在就只考虑 的情况此时小点大点匹配完后,若某一颜色的数量
,显然能一步步调整成恰好 ,然后就可以恰好全部匹配上了 -
若
设
,那么最多的匹配对是 ,即有 个数无法匹配上
现在只用考虑怎么舍弃数最优,用舍弃大点类似的方式即可
复杂度
ARC186A ◈✩
放
还是太先进
首先如果一个点
考虑涉及到行、列的性质,如果是网络流/二分图之类的题,就可以上二分图了
参考这个做法,如果
上述的回路在二分图里也是以环的形式存在的,那么非环边的数量就是
考虑
复杂度
ARC186B
显然考虑连边
对于
那么现在就形成了一块一块的,考虑当前新加入的
最后是一个树形的,直接组合数即可
我用了
ARC186C
先把
显然
箱子数量不够的情况可以单独考虑
考虑最后肯定是剩了
复杂度
ARC186D
考虑合法的序列,就是满足:
,
后面这个可以转换成网格图走,然后不能碰到某一条线,简单的
枚举前缀和
总复杂度
字符串
CF1827C
对于偶回文串,若它有一个偶的回文后缀,那么这个偶回文串一定能拆成若干个偶回文串
那么对于一个好的串的划分,采取能划分就划分的方式,则是唯一的
所以对于每个后缀找到最小的回文后缀即可
用
CF1913F
考虑改变
考虑改变后的,增加的也是不以
可以最开始先处理一下,枚举回文中心
复杂度
P10716
对于
前面这个是
具体的过程类似链表维护,维护当前点的后一个点,显然可以并查集辅助
复杂度
P11150 ✩✯
要求
考虑去掉无用的
因此可以在
可以
对于
求出可能是答案的
视
树
[NOI2021] 轻重边
做法1 ✩
比较巧妙的做法,给每个点赋值,然后一条边是重边当且仅当其相连的两点的权值相同
做法2
称题目的重边为标记边
先轻重链剖分,我们维护重链上的信息,轻链的把信息挂到父亲上,即记录一个点的孩子的轻边中,哪些是被标记的边,显然至多俩
那么跳
做法3 ✡
用毛毛虫,然后
复杂度都是
《简单树剖练习题》
路径上的点的权值的变化就是
复杂度
[QOJ9638] 线段树与区间加
做法1
其实
发现操作就形如两条链,一个整体向左,一个整体向右,然后这两条链上的点除了最后一个,都要下传标记,且与链上的点(除了底部那个)相邻的点和链的底部的点都要打上
树剖一下
这个打标记,对于重链头,就可以标记给它的父亲,后面遍历到它的时候再传下来即可,注意帮左/右儿子打的标记要分别记录
考虑怎么维护下传标记,实际上可以直接找到所有标记点然后传下去即可,因为你注意到每次实际上真正打到点上的标记是
复杂度
做法2
同样还是只保留
考虑每次
那么给一个点的
对于每次操作,就是把完全被包含于
对于前面这个,注意到这样的点就是后面那俩链上的点的,不在链上的右/左儿子子树,考虑这样标号,对于一条重链,先把它链上的点都遍历了,再依次遍历其所有的左子树,再一次遍历其所有的右子树,这样就可以表示为一个区间了
复杂度
「GLR-R3」谷雨
用毛毛虫,但是端点处的点要特殊处理一下
复杂度
[集训队互测] 数据结构
毛毛虫升级版,也许可以叫猫猫虫
先标号一条重链,再依次标号距离该链长度为
复杂度
[CF1930H]Interactive Mex Tree ✯✡
令
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通