近期比赛的补题情况
牛客练习赛99
NP-Easy问题
solution
做法:
1 | //2022.5.27 by ljz |
相等距离
solution
做法:首先
1 | //2022.5.28 by ljz |
AtCoder Beginner Contest 253
We Love Forest
solution
题面:给出
做法:考虑直接算答案,设
1 | //2022.5.30 by ljz |
AtCoder Regular Contest 141
Non-divisible Set
solution
题面:一个集合被称为好集合,当且仅当里面的任意两个不同元素之间都是倍数关系。现给出
做法:
考虑所有奇数只有
任意大小的话就多个二分而已,那样时间复杂度是不变的。
1 | //2022.6.4 by ljz |
Codechef Starters 41
Parity Fun
solution
题面:合并两个数的方式是,若它们同奇偶,则合并为两数之差( 这样显然可能有两个 ),否则合并为两数之和。给
做法:那天晚上后来去吃 rng 的瓜了,今天候机时想了想发现不难。
首先注意到全偶数时,一定是一个减另一个,这个可以特判掉。若存在两个奇数,则可以让其中一个奇数加掉所有偶数,另一个奇数又可以减这个奇数,那么偶数的符号就是任意的了。若只有一个奇数,除了所有偶数的和不能减掉后,其他符号也是任意的。于是只用考虑全奇数的情况,经过手玩或者归纳法证明,可以发现奇数符号为正的是奇数个数除以二上取整,那么直接背包算出答案。注意到背包是只有 bitset
压个位,这里复杂度就是 bitset
优化,所以总复杂度就是
1 | //2022.6.3 by ljz |
Codeforces Round #792
Euclid Guess
solution
题面:对一个数对执行
1 | function Euclid(a, b): |
现给出长度为
做法:首先有个显然的想法是一步到位,即对一个
1 | //2022.6.25 by ljz |
Codeforces Round #803 (Div. 2)
Long Binary String
solution
题意:开局有一个长度为
做法:考虑将字符串看成模
稍微讲下如何做多项式乘法,考虑到 bsgs 的第二轮时是做一个
1 | //2022.6.29 by ljz |
2022 Hubei Provincial Collegiate Programming Contest
C. Potion(hard version)
solution
题意:有一个容量
做法:首先
接下来考虑
接下来只要算
1 | //2022.7.3 by ljz |
D. Transition
solution
题意:有两个操作,一是反转某位,代价为
做法:显然最小代价下交换操作只能交换相邻的,或者交换距离为
实际实现时可以发现没必要记录前两位的情况,直接枚举就行了,因为对
1 | //2022.7.3 by ljz |
G. Brick
solution
题意:给一个正整数数组
做法:首先能发现的是否高度相等仅仅等价于奇偶性是否相等。另一个重要结论,删去两个相邻的奇偶性相等的数不影响结果,这也是显然的。于是,剩下来的就是一堆奇偶间隔的东西了。如果有剩两个及以上,那显然无解。如果只剩一个或者没剩,那么肯定有解。接下来就是考虑答案是多少了。稍微想一想,我们能整出一个贪心手段,考虑每个凹形区域,显然凹的地方必须加二,然后相邻相等的位置显然可以直接消掉,必不会影响答案。用个 vector
维护这个过程即可,时间复杂度
1 | //2022.7.5 by ljz |
I. Latitude Compressor
solution
题意:求所有
做法:我们都很熟悉置换群,知道旋转
这东西就很显然了,随便转化下,就有
其中
所有
1 | //2022.7.6 by ljz |
M. Super Star Spectacle
solution
题意:收集器(华恋)在树的路径上巡逻,问确认树上没有很会润的 Star 最少需要几个收集器。
做法:首先题意要读懂,大概说的是一棵树,有一个可以光速润的东西,你可以卡住某些口让他不能经过,然后你的人也可以动,去搜寻他。
首先能注意到链是最舒适的,因为一条链只用一个人搜一下就行。但如果几条链有个根呢?容易发现,这样的答案显然为
这样的话,我们考虑一个叶子到根的路径,这个路径上所有有分支的节点都占住一个人,然后叶子占了一个人。这个叶子上的人可以迅速搜到第一个分支节点处,然后把这个节点的其他几个分支全搜寻完。然后再让这个分支上的人往上搜到下一个分支处,然后它占住另一个位置,再让叶子上的这个人去照葫芦画瓢地搜完接下来的东西,以此类推,我们肯定能搜完所有节点。
但是,这仅仅叫能搜完,并不是最优解。为什么会这样呢?我们仔细考虑到底是不是必须要每个分支的节点都住一个人,发现不是必须的。容易发现,比如
1 | 22 |
我们能发现当最开始的时候就选择最大的那个分支后,我们同时往回走,那么这就可以保证这个分支不被入侵了,也就意味着可以省下一个人。实际上,这题确实还是可以
The 19th Zhejiang Provincial Collegiate Programming Contest
D. The Profiteer
solution
题意:给定
做法:
K. Dynamic Reachability
solution
题意:给定
做法:
2022 Jiangsu Collegiate Programming Contest
B. Prime Ring Plus
solution
题意:将
做法:
D. Finding Pairs
solution
题意:给定一个序列和一个数
做法:本来以为想出了
我的想法是直接分治的,然后把经过中点的询问算一下,考虑此时右端点递增,然后左端点维护个后缀 dp 值,这样计算每个询问的时候,复杂度就是
实际上,直接回滚莫队就行,不过很难写罢了,时间复杂度一致的。
代码我写的回滚莫队,要注意多类讨论,比如分块点处向右
1 | //2022.7.13 by ljz |
E. Playing Cards
solution
题意:给定两个序列
做法:
G. GCD on Bipartite Graph
solution
题意:将
做法:
H. Super Gray Pony
solution
题意:求长为
做法:
“蔚来杯”2022牛客暑期多校训练营1
B. Spirit Circle Observation
solution
题意:给定长度为
做法:注意到此刻的
注意
1 | //2022.7.20 by ljz |
C. Grab the Seat!
solution
题意:二维平面,屏幕是
做法:这题没做就离谱,纯纯的签到题。
题意等价于有
1 | //2022.7.18 by ljz |
E. LTCS
solution
题意:定义一棵带点权的有根树
做法:考虑一个暴力 dp,设
1 | //2022.7.20 by ljz |
F. Cut
solution
题意:给定
做法:考虑类似 ODT 那样的想法,这里是把有序区间看成一个连续段,然后每个连续段用权值线段树维护,注意到连续段都是有序的,所以很凑巧,权值线段树的下标也正好是有序的,然后所有连续段用一棵大线段树维护信息。考虑询问的东西,发现可以 dp,然后经典的 dp 转成矩阵形式,于是就可以维护了。排序操作等价于线段树分裂再合并,虽然我一直不理解线段树合并的复杂度,不过听说是看总结点数,那这个就简单了,势能分析下就可以知道拆分的次数是
代码实现上我加了个节点回收,不想算空间了。
1 | //2022.7.20 by ljz |
H. Fly
solution
题意:
做法:考虑数位 dp,设
其实细细想来就是常系数线性递推的魔改,只是把快速幂魔改成了数位 dp。
1 | //2022.7.20 by ljz |
I. Chiitoitsu
solution
题意:初始手牌有
做法:首先把题意读对,我上来就以为和 ZJOI 那道题一致,直接卡了一年的时间。于是最优策略显然是若到手的牌已经有一张,那就随便丢弃一张单的,否则丢弃这张到手的。这样的话,实际上初始情况只有
1 | //2022.7.18 by ljz |
J. Serval and Essay
solution
题意:有一张
做法:设 set
维护入点情况。不过启发式合并下就
题解还有个做法是考虑随机合并这些节点,可以证明期望复杂度是
代码是启发式合并的。
1 | //2022.7.18 by ljz |
2022“杭电杯”中国大学生算法设计超级联赛(1)
D. Ball
solution
题意:在
做法:sb 分类讨论题。
考虑先曼哈顿转切比雪夫,然后枚举中位数的那两个点,发现剩余的就是二维数点,两个大正方形的和减去小正方形的两倍,好像很简单?
错误的!首先容易发现距离相同的点对会算两遍,三条边都相同的更是会算三遍,而且当减去小正方形两倍的时候,边界上的点就直接没有算进去了,怎么都不对。于是,我们先将减法部分改成减去完整的小正方形和小正方形的内部,即去掉边界。另一方面,距离相同的点对我们考虑容斥,对每个点直接暴力算出和它距离都为