XN2025 集训记录 D2
又是摆烂的一天 , 感觉打模拟赛时候的自己和改题时的自己完全不是一个人 . 不过往好了想 , 至少足够的模拟赛量 , 意味着我的高效率时间虽然不多 , 但是还有 .
买了个usb转网线 , 破费 39.99 然后这里的网线是静态ip , 插上用不了 , 我.....
这后面的电脑只能彻底沦为背景图片播放器了 . . .

还是模拟赛 , 120/300 .
感觉状态整体来说还凑合 , 这两天的 T1 都大幅度可做 , 所以还是没那么平行地开完了 T1 才去完全思考 T2 和 T3 . 不过应该警醒一下不要对切 T1 又产生心理依赖了呃呃 .
T1 题意
\(n\times n\) 网格 , 其中 \(m\) 个染黑 , 无限次执行操作 :
- 如果一个点没有染黑 , 并且与至少两个黑点邻接 ( 四联通 ) , 可以把它也染黑 .
求最大黑色点数 . \(n,m\le 10^6\) .
这玩意一开始看上去像是个答案有限的简单题啊 , 大概就是联通原来的黑点的次数是 \(O(n)\) 的 , 而且看了眼样例 , 答案确实不大 (NOI2024D2T1的教训罢了) . 就觉得可以暴力找可以联通的点 .
( 这里是伏笔 . )
然后手玩一下发现 , 连通块的边缘处 , 只要出现了向内凹的位置 , 这个位置必然可以染黑 , 因此每个连通块能不断操作直至补成一个矩形 .
这样形式变好看了 , 相当于曼哈顿距离 \(\le 2\) 两矩形合并成最小包含矩形 , 缺点是刚才的次数分析就炸了 , 因为显然 , 矩形合并完全可以造出一个大矩形 .
这不是原题吗 ?
T1 思路
记得那还是寒假的时候 , 我打了一场 Acc 模拟赛 , 反正打的过程很摆 ( 省选之前一直是模拟赛状态摆 , 结果现在反过来了 ) . 当然还是努力去冲了 T1 , 大概意思是这样的 :
平面内给 \(m\) 个矩形 , 如果两个矩形有位置重合就合并成能包含它们的极小矩形 , 求合并后的所有矩形 .
这题一看上去挺纯良的 , 思路很清晰 , 逐一插入矩形 , 和所有重合矩形合并后 , 矩形变大 , 重复合并过程 , 直到无法合并 . 只要随便找点办法维护矩形查询并删除所有有重合位置的矩形 这东西就好了 .
然后有一些看上去纯良的分讨 , 但是总会丢情况 , 而这道题就越做越毒瘤了 .
那么回到一个 DS 上 , 这个就是最纯的树套树可持久化维护平面 , 一维扔线段树 , 一维随便扔给 treap 或者 std::set , 然后有一个经典的讨论 :
因为可持久化没有pushup操作 , 从根到底插入时又一路上都插入了点 , 相当于每个线段树节点维护子树信息 .
因此查询时对跑出的 \(log\) 个区间查询子树 , 就得到的所有与查询区间有交的信息..... 吗 ?
考虑到这样做覆盖查询区间的线段不会被计入 , 为了弥补 , 还要在查询时 , 查询一路上的节点对应的信息 , 当然这个信息不是子树信息 , 而是恰好落到这个节点的线段的信息 .
也可以分成两部分来看 :
- 插入时单点插入区间端点 \(L,R\) , 查询时查询区间内的这些端点 .
- 插入时覆盖 \([L,R]\) 对应的 \(log\) 个节点 , 查询时单点查询区间端点 \(L,R\) .
因为两条线段有交 , 至少会有一个线段的端点被另一个包含 , 因此这样分治是合理的 .
到这里这道题有了 \(n\log^2n\) 做法 , 还过不去 .
考虑内层树是否真的有必要 : 可以对内层树维护的维度 (例如内层树 \(x\) , 线段树 \(y\)) 进行扫描线 , 按照 \(x\) 从小到大插入 , 这样 , 对于同一个线段树节点 , 肯定是后插入 , \(x\) 大的矩形更容易和新矩形合并 , 优先被取出 , 用一个栈维护 , 复杂度变为 \(O(n\log n)\) .
这道 T1 的做法就一模一样了 . 当然这道题的条件是曼哈顿距离 , 具体讨论一下分成 \(3\) 种情况做矩形查询即可 .
本机测的时候在 \(m=10^6\) 的大样例上获得了 \(8s\) 的好成绩 !
后来发现是电源计划给 CPU 锁频了 , 调整了一下还是 \(4s\) , 也学不明白这么个巨大常数线段树 \(log\) 题要开 \(1e6 , 3s\) , 还要绑 subt , 最大的 sbut 还要放 \(55\) , 不甘心正解拿 \(45\) 卡了一个小时常也没卡明白就跑路了 .
还是挂到了 \(45\) , 有几个点后面调也死活不过 , 卡在\(3.9s\) 这里 .
看完 std 后乌鱼了 , 它真的觉得矩形合并执行次数很少 , 下数据点也证明 , 数据里的合并次数很少 ( 然而构造出大量合并的数据并不难 ) ,然后出题人 std 是个逆天讨论然后合并 \(2\) 步就完事 .
怪不得这么出 .
最后用下数据特判改过了 ( 真的是题有问题 ) .
然后是 T2 , 很有趣的 dp .
T2 题意

老规矩偷懒 .
T2 思路
这个题比较显然的 dp .
考虑对于一个移动过程 , 如果不考虑左右限制 , 结果只会是所有位置向左/右平移了若干位 .
而有了这个限制后 , 首先能确定出从第一轮开始有些位置就输了 , 然后有些点因为左边的阻挡会和 \(1\) 合并起来 , 其余仍然是整体移动的现象 .
考虑如果整体移动是右移的话便样衰了 , 因为无限轮后所有点一定不断右移然后掉下去 .
考虑左移或不动 . 首先那些没有合并起来的点显然可以 , 而那些合并起来的点 , 在下一轮时仍然处在会被合并的位置上 , 所有也可以 , 因此考虑 dp 出所有情况下的整体移动 , 那些位置掉下去了 , 以及哪些位置与 \(1\) 合并了 . 也就是一个前缀会被这个序列贡献 .
具体地 , 设 \(f_{cnt,i,j,k}\) 表示考虑前 \(cnt\) 步 , 起始的位置 \(1\) 来到了位置 \(i\) , 前 \(j\) 个数和 \(1\) 合并在一起 , 前 \(k\) 个数还没有掉下去 . 转移是容易的 , 最后遍历所有状态 , 每次给前缀贡献 , 差分一下就好了 , 复杂度 \(O(n^3m)\) .
考虑优化状态 , 但是发现 \(j,k\) 代表的是一个历史最值的形式 , 是难以替代的 , 考虑换个角度看 .
考虑直接对每一个点算贡献 .
首先如果这个点没有被合并 , 那么只要它一轮后没掉下去 , 而且左移或不动 , 根据刚才的分析 , 直接贡献给这个位置 .
然后如果被合并了比较难办 , 因为合并后的点 , 满足要求的 , 不一定是左移 , 也有可能被合并的这个位置带得向右移 . 我们发现在这种情况下 , 点最后会到达一个不动点 \(k\) 处 , 而 \(k\) 就是作为合并的一个点 , 恰好走到了原位 , 考虑用 \(k\) 在做前缀贡献前面的所有右移但是合法的点 , 当然还有一些合并点仍然左移 , 直接统计即可 .
这样的复杂度是 \(O(n^2m)\) 的 , 这是为什么呢 .
对整体计算不可避免两个最值形式的状态 , 然而 , 对于单独一个点来说 ,掉下去和合并 (合法状态) 只可能发生其中一个 , 因此 dp 时相当于只对其中一维做了记录 (事实上掉下去的状态都被直接扔掉了 ) . 然而单点处理不好做的是判断右移的点是否会到达一个不动点 , 通过刚才的整体分析 , 用不动点前缀更新的方式就解决了 .
真的很有意思的好题 .
T3 题意
T3 题解
这题解说的是人话吗 😰
盯了一晚上题解和std ( 太颓了啊真的是 ) 算是大概口胡出来这个题在干什么了 .
首先建虚树是正常操作 , 考虑数连通块数量 , 可以通过数有多少条边存在来算连通块个数 . 这里的边是原树上一堆边的合并 , 它存在的条件是对应的区间包含于 \([L,R]\) . 这是一个简单的二维偏序 .
然而这里有问题 , 因为建虚树的时候加入了一些不应该贡献的虚点 , 我们考虑把它们的贡献减下去 .
要剪掉的就是所有只包含虚点的连通块个数 . 考虑这样的连通块个数会在以下情况下改变 :
- 一个虚点连通块合并了一个实点 .
- 两个虚点连通块合并起来了 .
前部分是容易的 , 考虑一段实点一端虚点的边 , 它只会影响这个虚点的贡献 .
考虑对于一个虚点 , 在扫描线的过程中 , 不断有这样的边加入 , 可以尝试替换当前把这个虚点和其他实点合并的边 , 也是简单的偏序问题 .
难点在于后面 , 因为这一下 , 两个虚点之间的边不能独立地贡献其中某个虚点了 , 题解的惊世智慧告诉我们要通过构造点分树的形式 , 来钦定出哪个虚点负责贡献 .
因此两端都是虚点的边加入时 , 把贡献算在深度较大的那个点身上就好了 .
但是还有更麻烦的事情 , 深度较大的那个点相连的实点仍然有可能贡献 , 相当于把这些贡献转移给了深度较小的点 . 不过通过均摊分析 , 这些转移边之间存在的偏序关系使得实际区间数可接受 , 所以直接在点分数上处理出可能贡献的区间 .
越想越晕了这个题 .
结果就是又在模拟赛和摆一下午中度过了一天 , 不管怎么说这些题目怪有意思的还是 .
饭还挺好吃的 , 中午有肉夹馍 , 晚上有羊血粉丝 , 都不错 .
因为用热点的缘故不得不省着用流量了 , 只好翻来覆去听走之前下载的 Vessels 这张专 , 结果发现整专听歌好舒服 , 因为有前后衔接情绪流很足 , 有一些单听根据没那么抓耳的歌 , 放进一起一下好听了 .
不管怎么说应该还是有收获的吧 . 连着两次模拟赛 , 发挥不算差 ( 然后突然发现忘了苍穹计划了 ) , 如果能把赛事状态不断拿出来 , 感受和调整 , 也是挺有意义的. 就是还是觉得非赛时这题改着改着就半天过去 , 盯一个题解盯一晚上 , 做题也云起来了 ,真的矛盾 .
不管怎么说用一天消化一套模拟赛也算是有点意义了 . 明天做专题才是最狂野超乎想象的颓废 .
突然好想念 lx 老师 , 曹队 , 还有 23 年跟着去北京的高二学长们 . 从 24 年冬天集训那一趟开始就时常怀旧 , 这次更是特别明显 . 好怀念以前啊 .