【模拟总结】2020ICPC 区域赛南京
A
菜是原罪,确实是做不出来。
构造可以看 知乎 solution
B
做法不保真。因为是我自己的做法……因为这几天没有键盘,写不了代码
一眼扫描线,那就要维护每个时刻的每个后缀的排名,然后上个二维数点。
但是每个时刻每个后缀的排名知不道,大概的结构就是扫到 r 长度为 i 的后缀和长度为 j 的后缀有一个长度为 r-i+1 的 lcp,但是添加 s[r+1] 之后他俩就得交换排名了。
后缀数组咋做的这个来着,是不是倍增看看 lcp?那咱把倍增的结构全给他存下来,每个 的指数的 rk 都存一把。然后对于每个询问 (l,r,k),设 len=r-k= 我都去 rk[t_i] 里面找到有几个 p 满足 这你好好排序,类似 dfn 就行,然后还上个二维数点。
这时候二维数点的左右端点就有讲究了,每个 都判断一下是不是存在截止到 r 会导致长度不够但是截止到 n 还满足 lcp 的。这个也是二维数点。长度足够的后缀的区间是容易定位的
你说后缀数组的倍增是一个一个跳的,但我这个是一个一个 ?我觉得dfn序+主席树一视同仁。
C
这套 ABC 主打一个早知道就死磕了的难度。
可以将坐标进行正负取反和 xy 颠倒之后将最优解可化为如下形式:先向左走到 ,再向右走到 ,再上下收割
设 的 , 的 。现在要对于每个 求出来 最后这个 可以拆开变成维护 和 分别的最小值
如果我不负责任的话我确实是应该说这是比较明显的二维数点。使用 KD-Tree 或者可持久化线段树感觉上都没啥问题。
比如对于一个 而言,对于那些 的 ,我们应当维护 来搞定第一个,维护 来搞定第二个。
D
随便拉一个生成树出来,找到这个生成树上度数大于 的点 ,显而易见的贪心思路就是找到端点在 不同子树里面的边并把和 相连的边断开。枚举所有的非树边即可。
有个问题就是可能有一个儿子 在这个过程结束后连接的边数大于 ,但是另外注意到,一个和 边断开的点的度数一定是小于等于 ,因为有 个点有至少一度, 有 度,承包这个儿子的点至少 度(承包就是断开 时和 在环上相邻的另一个点),就不给他剩下更多了。
那么先做一遍朴素贪心,找到非法的儿子 (如果存在),然后提前把 边断开即可。
E
vp的时候 gjk 是大力分类讨论的,虽然很快也过去了,但是好像题解方法非常简洁:
可以证明存在一种答案,使得相同的方向是连续排在一起的(按原字符串中有 1/2/3/4 种字母进行分类讨论)。枚举 UDLR 的 24 种排列即可。每个排列都是先把一个方向冲完再想别的方向。
F
最优策略一定是制作若干个烟花然后一起释放。不妨假设做了 个,列式计算发现代价是
401rk8 知道这是个单峰函数所以折腾了两下枚举了一段就跑过去了,题解说可以求二阶导。
G
维护每个白格子属于哪个白格子连通块,维护每个白色连通块周围有多少空格子。
两个 case:黑色变成白色/白色变成黑色。
第一个考虑四联通意义上他救活了哪些连通块,周围如果有 有气的连通块也有没气的连通块,那么没气的连通块被救活,如果都有气那么对答案增量为 1,如果都没气那么对答案增量为 0
第二个 case 我们研究了一下可能一个白格子阻断了两个大坨的联通,这时候 gjk 来了一个圆方树的想法。考虑圆方树每个子连通块有多少气,有气拿他没啥办法,没气的直接没了,那么统计没气的白格数量,不用维护,dfs 的时候一算就完事。父亲方向的连通块也好算,
这题圆方树都出来了应该是要硬着头皮写一下的。只不过大家四个小时之后都打卡下班了。
H
特判。
不难发现如果 则必然会出现合法矩形。因为除了包含 之外还有至少两个 这样的对子,可以直接输出
否则你发现 很可以 dfs!写一个能剪枝的 dfs 就行了,注意还是要记忆化,而且记忆化记得写对。
I
纯纯逆天,下次 vp 我一定先开计算几何!
可以发现如果不选择贴着obstacle的端点走,那么在相同的时间( 恒定不变)就要付出更多的横移,所以最优解满足沿着端点爆冲。
将 加入点集并计算所有点之间是不是可以直接到达(枚举所有线段,判断当前的这对点的路径上是不是有其它线段)
然后二分答案,判断一个点和 是否可达的条件是存在某一速度使得他在以 方向该速度行驶时可以不撞到障碍物上。 个点计算创上每条线段的速度区间,如果这些区间取并包含了 那就没辙了。可以预处理每个点的区间,复杂度是
其他的点之间如果连线满足能用 的 的横移速度到达的话就连一条边,然后判断底线是不是能到顶线用 D F S / B F S
J
使用势能线段树维护区间 xor 和,现在就变成了求有多少个 i 满足 xor[l,r]^ s[i] ^t=0 挪一挪变成 xor[l,r]^ s[i]<s[i] 这个等价于看 xor[l,r] 的第一位是不是被 s[i] 包含,于是维护每个数每位的信息即可
两个 log
K
k=0 无解。k=1 的时候你发现 p[i]=i 即可,再注意到 gcd(x,x-1)=1,于是然后发现把前 k 个 shift 一下就行了
L
输出两个蓝球之间有多少个红色的球即可。
M
什么点都不删除,那么答案是根的权值加上 2* 剩下的点的权值
直接根据定义进行树形 即可。背包每个点子树里面多少点没被使用魔术方法,如果父亲和儿子都没有使用魔术方法,需要在父亲处加一个儿子的权值
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律