省选模拟赛(Ⅱ)
冲刺省选2月8日第十二场
\(t1\) 写出斜率优化式子后没有深入考察性质,对于陌生的条件没有有效转化
\(t2\) 一直没有突破 \(O(n)\) 次数的询问
\(t3\) 确定容斥思想后没有折半以及对 \(dp\) 的优化
A. 数列
转移的条件是 \(max(a[j,i])=max(a[j],a[i])\)
但是考虑如果存在 \(k\) 满足 \(a[k]>a[j]\&\&a[k]>a[i]\),那么 \((a[j]-a[i])^2<(a[j]-a[k])^2+(a[k]-a[i])^2\)
也就是不合法的转移不优,一定不会这样转移
只要特判最后一段即可
题解的做法其实也比较巧妙:
首先建立笛卡尔树,那么 \(j<i\) 的条件体现为在其祖先或祖先(包括自己)的左子树
\(max\) 的限制体现在只能选择祖先和左子树中的节点
从根到当前的凸包二分/倍增维护,子树内凸包启发式合并实现
思想是非常妙的,但是出题人没有仔细考察价值函数的性质反而弄巧成拙
B. 差量
首先发现如果随意确定两个数,则每次询问都会产生两个可能值,非常不好判断
于是考虑将这两个数选为极值,则每次询问就不会产生歧义了
极差是可以通过一次全局询问出来的,考虑通过二分来确定一个极值的位置,每次询问前缀看极值是否改变即可
对于剩下的数,此时发现所有的数与极值的差是独特的,即值与位置一一对应
那么可以利用这一特点对位置进行二进制分组查询,那么可以知道值对应的位置这一位是否为 \(1\)
于是所有位置的差知道以后就可以找到另一个极值的位置,再花两次来判断是最大值还是最小值即可
二分一个 \(log\),差两个(需要去除自身的点对差集合),满足条件
冲刺省选2月10日第十三场
考场倒序开题,因为发现 \(t3\) 看上去比较可做
连续跳跃的操作一下想到了点分树上很方便的统计,但是一直没有想到一个很形式化的答案统计方式
后来想着对于原来的树边双向分别判断连边后所点看入度为零的边,但是是假的
\(t2\) 二维的 \(dp\) 的状态很好想,但是优化方向一直是用数据结构优化 \(dp\) 转移
\(t1\) 试过二分图,但是没有仔细分析入度和出度的关系
A. 一般图带权多重匹配
如果不考虑的奇数点,可以想成类似欧拉回路一样,一个点一定出度和入度一样的
那么就可以拆成左右两种点,连边 \((i,j)\) 相当于左边的 \(i\) 向右边的 \(j\) 连边
如果出现奇数点,允许出入度差一,且所有点的出入度抵消为零
那么状压完再跑网络流即可
B. 排序
一个节点的上升序列用 \([l,r]\) 就可以表示出来
一个重要的思想:对于包含关系的区间,直接去除较大的区间,这样以后每个节点的区间左右端点分别呈单调排列,次数可以发现合法的区间最多是子树内 \(\sum m_i\) 的
考虑一种暴力的合并:确定了当前的左端点,然后记录一个状压的状态,那么每次加入一个子树的线段时贪心地选取第一个满足条件的即可
这样的复杂居然是对的!因为区间数一直是和较小的子树相关的
C. 传染
正确的暴力是建立完全图,连边表示感染关系,那么缩点后取入度为零的即可
考虑直接求解出需要选的点,即没有能感染到它的点
这个是不好求的,一个非常巧妙的方式是对于每个点先把能到的点的序列存下来再 \(reverse\)
举个栗子:
假如本来的序列是这样的:\(a-b-c-d\)
由于枚举点时不知道顺序,可能先找到 \(d-c\)(经过逆序处理),接着是 \(b-a\),然后 \(reverse\) 一下,变成 \(a-b-c-d\)
如果一开始就枚举到 \(a\),本来是 \(d-c-b-a\),翻过来还是对的
这个找点的过程在点分树上跳即可,每个节点上的路径按距离排好序后开始指针扫一下即可
冲刺省选2月12日第十四场
\(t1\) 很明显是区间 \(dp\),但是状态看起来必须得三维,而转移也至少有个 \(n\),没有想到优化的方法
\(t2\) 在Cyber_tree 的引导下发现了答案为一条边和最小生成树的结论,于是 \(multiset\) 维护出来
\(t3\) 以为是组合数可以搞定的,没有设计好状态
A. 好
首先题目条件形式化来讲是以 \(1\) 为递增/减单峰的
关键之处就在于这里的以 \(1\) 递增
考虑状态转移合并时一定同时选择了左右端点,那么只要再枚举出峰顶,其实就已知了这一段整个的长度了,因此省去一维状态
其余的就是处理出区间内上升序列的最大贡献,以及最后做一个一维 \(dp\) 来体现可以不选
C. 乐
设前缀 \(i\) 的答案为 \(f[i]\)
肯定要容斥,转移方程为:
原理就是 \(dp\) 的状态保证了当前的 \(border\) \(j\) 是极长的,因此只需要计算中间的贡献即可
把前缀积表示出来就可以做到 \(n^2\)
在 \(v\) 相等的情况下结合前缀和可以做到 \(O(n)\)
正解卷积咕掉
冲刺省选2月14日第十五场
发现 \(t1\) 居然只要判定出来就有 \(40\) 分之多,于是开始想 \(dp\),成功观察出了一个线性 \(dp\)
但是往方案数上转化的时候并不能很好地处理重复问题
\(t2\) 一直在想整体 \(SG\),没有想到用分别的 \(SG\) 函数异或求得
\(t3\) 没想正解,直接开始调退火,不知当时为啥那么智障会先二分答案再判定……
考完发现 \(t1\) 挂了 \(5\) 分,给 \(CT\) 调代码才发现居然三个数是倒着添加的!
\(t3\) 没卡好时,改成直接判断后就可以过 \(70\) 了
A. 开心消消乐
首先一定是两个两个加入,\(dp\) 出此时的前缀后面加入 \(0/1\) 可变成的集合是什么的方案数,模拟转移即可
B. 树上的棋局
把一个点看做一个游戏,那么一个点的 \(SG\) 为子树深度,用归纳法即可证明,答案为所有点函数值的异或和
但是发现换根操作是会改变子树信息的,但是发现只有当前点到根节点路径上的点变成了子树外的部分,其余点都还是子树内的信息
那么对于每个点维护出其子树内深度与子树外离得最远的点即可
发现子树外的那个点一定是直径的端点之一
为了方便,把直径中点作为原树根,可以很方便地求出最大值
那么开两棵树剖线段树来维护所有点以及外边的距离信息即可
一些坑点:
由于直径长度可能为偶数,这种情况下应时刻保持警觉来特判根节点上的情况,新的根在另一个中点的子树内时根节点此时只能取 \(len/2-1\)
注意子树操作是相对于当前根节点而言的,需要找到当前根到树根的最后一个点然后除了这个子树进行修改
C. 社会黄油飞
首先类似于分数规划的移项,变为 \(\sum - |S|lim>-lim\)
此时把点权看作 \(-lim\),边权看作 \(1\),选出最大的子图即可
这其实是一个最大闭合子图问题,选择一条边必须选择两只点
直接跑一个点也不选会是最优的,那么需要对于每个点都强制选它分别跑一遍
强制选相当于这条路径不流,暴力做法是不建边,可以直接在上一版本中把这条边的流量退回去,然后限制改为零,就保证了这条边不流了
冲刺省选2月16日第十六场
\(t1\) 看上去比较可做,于是开始大力分类讨论,直到心态爆炸转写暴力
\(t2\) 并不会,写了个填满的和五色的,赛后发现五色假得很
\(t3\) 一直在构造 \(n\le 2\) 的方案,但是发现并没有很有序地进行分类讨论,导致最后一样是心态爆炸而告终
对于分类讨论题一定要保持头脑清醒,尽可能模型化问题,并从大往小依次清晰分类进行
对于线性基的题目要仔细分析性质,许多想到的情况都是不可能存在的
A. 数学题
关键在于是否降秩取决于是否拼凑出 \(2^i\)
即使线性基上这一位有数,但是如果不能拼凑出 \(2^i\),那么说明这个数是可以用来更新后面的一位的
分类讨论:
- 如果在线性基中
- 可以拼凑出 \(2^i\),增秩
- 否则,不变
- 如果不在线性基中
- 这个数可以由线性基外的数替代
- \(2^i\) 不能拼凑,增秩
- 否则,不变
- 如果 \(2^i\) 的拼凑需要用到这个数,降秩
- 这个数可以由线性基外的数替代
B. 构造题
正确的解法是按一维坐标排序后进行 \(bfs\) 调整
这里 的图画的很清晰
C. 网格图构造题
一个性质是如果想要把一条路封死,那么必须把一整行或一整列都铺上不能通行的格子
可以发现,在这样的条件下是不允许两种模式同时进行的
于是分开考虑,把二维问题压缩到一维
问题转化为一些位置已经强制放联通,一些区间限制至少一个不连通,相邻两个最多一个不连通
设 \(f[i][0/1]\) 表示最后一个是什么,最靠右的不连通在哪儿
需要注意的是全是联通限制条件的情况需要额外构造
冲刺省选2月17日
\(t1\) 甚至没往高精度上想,而是一直挖掘 \(2\) 的次方的性质
\(t2\) 终于对上样例后没打出所有的暴力,只是判断了 \(n-1\) 的所有情况
\(t3\) 列出暴力 \(dp\),再结合模数一看就是 \(FWT\),跳过跳过
A. 最短路
好吧,显然这种经典问题是不可能改造算法的,以后不要再这样尝试了
\(dij\) 的框架不会变,直接考虑维护距离的大小比较和加法即可
考虑把二进制的每一位放在线段树上,那么大小比较直接线段树上二分出第一个不相等的位置即可
加法操作相当于找到后面最后一个零的位置,执行区间赋零和单点加
区间赋零可以通过抹去儿子来实现
注意不能进行暴力一位一位修改,不满足均摊性质
B. 集合
神神奇奇结论题~
结论:最终答案大于等于 \(n-3\)
观察发现,后面的阶乘都是成对出现的,只要把 \(\frac{n}{2}\) 搞掉即可
如果 \(\frac{n}{2}\) 为奇数,得再删去一个 \(2\) 来保持配对
如果 \(n\) 为奇数,直接删去 \(n\) 即可
冲刺省选2月18日第十七场
看到 \(t1\) 好奇怪诶,首先想到了二分来满足大小关系的错误做法,之后根本无法处理,打出表后没有任何规律
\(t2\) 没有想到可用的算法,于是直接上退火,一通调参后比较稳定(交上去转了半天,说明子任务A了不少)
\(t3\) 直接想容斥但是优化不了指数复杂度,考虑 \(dp\),但是考场上一直没有缕清概率的关系,以为转移还需要乘概率,然而不会求,于是没有写
发现 \(t1\) 降智写得大意了……
A. 进制转换
好吧,又是一道乱搞性质的题
对于题中的两个限制条件,显然大于的条件是好满足的,可是数位的限制却无从下手,因为其分布过于杂散
那么考虑先满足这个条件
设 \(\sum a_ib^i=y\),最高位为 \(m\)
可以发现,当 \(b\) 比较大时,\(a_mb^m>>a_{m-1}b^{m-1}\)
因此考虑列出较紧的取值范围,可以发现:
即所有位为 \(9\) 时的情况
按照这个范围解出来的 \(b\) 合法区间不大,但是对于 \(b\) 较小的情况需要暴力枚举以节省时间
C. 張士超你昨天晚上到底把我家鑰匙放在哪了
好玄学的计数题
考虑其答案的本质是 一种找钥匙方案的概率* 满足条件的放钥匙的方案数
因此转移时始终考虑找钥匙的概率即可,放钥匙是没有概率的
但是选取是有 \(\le a_i\) 的限制的,考虑用容斥处理
选取一个集合 \(S\),这个集合中的都不满足条件,以 \((-1)^{|S|}\) 为系数进行容斥
写出来式子会出现形如 \(\binom{n+m-1}{m-1}\) 的部分,其中 \(m\) 是一定的,而不同的集合方案中有许多是有着相同的和 \(n\) 的
于是以值域为下标进行 \(dp\),来统计和为这个的方案数,注意此时是带权的,既要带 \(-1\) 的权也要带概率的权
设 \(f[i][x][y][t]\) 表示前 \(i\) 个集合和为 \(x\) 的放入选择集合,和为 \(y\) 的放入选择集合,且目前选择了 \(j\) 个位置的值,也就是说前面是钥匙,后面是位置
枚举这个位置找到和没找到,收没收到钥匙进行 \(4\) 种状态的转移
之后就是统计方案数的工作的
前面的 \(dp\) 相当于是把整个 \(m\) 个位置分成 \(t\) 和 \(m-t\) 两组,并设 \(n1=n-x,n2=N-(x+y)\)
那么此时要求前 \(m1\) 个位置至少有 \(n1\) 个钥匙即可满足条件
这个方案可以这么求:
枚举第 \(n1\) 把钥匙的位置,然后前后分别计算
即
这个式子的妙处在于把原先应当枚举值域的和式转化到枚举位置上
另外,题目中给定了共同约数 \(d\) 这个条件,那么 \(dp\) 的时候只保存是 \(d\) 的几倍即可
此时 \(dp\) 变成了 \(100^4\) 的
感觉是在一派胡言,欢迎指教~
冲刺省选2月19日
A. 游行
这样奇奇怪怪的问题一定是网络流了,并且可以看出是最小路径覆盖,但是确实没能合理转化变化的 \(C\) 的问题
考虑一条路径额外的花费,不妨把这个融进点的贡献中去
那么路径上就有一个点不算,不妨设为起点,这样同时也符合了最小路径贡献的计算方式
于是进行最小路径覆盖,每个被覆盖到的点会产生 \(C\) 的贡献
考虑费用流的过程,在这张图上是每次以流量为 \(1\) 进行扩展的,再本质一点就是每次选取一条新的边,把两个端点合并,这样一定会使得一个还未覆盖过的点被覆盖到(因为本质上是在二分图匹配,此时一定还处于未选状态)
费用流每次产生的贡献是单调不降的,那么可以拿上 \(C\) 在这个序列中二分,较小的部分用路径覆盖,否则用 \(C\) 选点
冲刺省选2月20日第十八场
赛时都在做 \(t1\),火候欠佳
A. 货币
重点在于复杂度分析
每次的本质是将一些 \(dp\) 值相等的区段划分成不等的区段,每次分裂至少产生一个不等段,最短新合并一个不等段,这样总复杂度还是 \(O(n)\) 的
C. 字符串
其核心在于找根
根的特征就是其儿子都指向自己
如果出现了一个大于 \(3\) 的度数的这样的点就找到了
否则形成了一条链,那么对于一个旁边点一直跳 \(fail\) 就可以找到一个很小的根可能出现的范围了
对于确定根的树,只需要用并查集沿着 \(fail\) 指向的位置顺着 \(trie\) 树往上爬即可
可能是数据较水不写倍增并查集也可以过
注意跑完了以后要验证 \(trie\) 树的不等儿子性
至于为什么跑完了一定不会在 \(fail\) 树上出现更深的指针而导致不同构还没想明白
冲刺省选2月21日第十九场
花费了太多的时间在 \(t3\) 上,一直写到九点半的回滚莫队由于过大的常数被卡成暴力分
\(t1\) 只胡了一个至今正确性未明的做法
\(t2\) 时间不够,列出莫反的 \(dp\) 来没来及写换根,还因为数组开小挂了 \(20\)……
还是太菜了……
A. 排队
正解是求前后方案数验证
B. 树论
莫反后换根即可,处理逆元会好写一些
C. 麻烦的杂货店
把前缀和看成高度,合法序列一定是凹陷部分
维护单调栈序列,倍增出最远的最高的两个柱子,对答案取 \(max\)
冲刺省选2月22日
A. End Sky II
首先一定是按位贪心,然后考虑 \(dp\) 出满足条件的数们能否凑成合法的 \(k\) 个
一定是选得越多越好,那么 \(f[i]\) 表示最靠右能到多少
如果暴力做的话可以更新单调栈中相邻元素
其实可以直接处理出单调栈中左边和右边第一个满足条件的位置,直接更新,因为更靠后的位置是不优的
B. Hill of Sunflowers
首先枚举出全排列,表示最后的序列次序,然后考虑合法的排列方式
由于是排列,对于单向小于的需要通过改变其后面的限制变成小于等于
之后就变成了第 \(i\) 列最高到 \(a_i\),最后到达 \((n+1,inf)\) 的问题
设 \(f[i]\) 表示到达 \((i,a[i])\) 的方案,容斥转移即可
C. Wonderful Everyday
由于题目中没有零,这个关键信息使得加法变得特殊
如果最高位是进上去的,那么两个串都是 \(|T|-1\) 的,这个好判断
如果最高位原本就有,那么另一个一定是 \(|T|-lcp\) 或 \(|T|-lcp-1\) 的
注意这个性质在有零的条件下是不成立的!
据说卡哈希?于是直接拿出六哈希~
冲刺省选2月23日第二十场
不知道为啥今天好困啊,全程属于离线状态……
\(t1\) 一直无法造出为啥 \(leaf-1\) 不对,赛后好久才悟
\(t2\) 觉得应该在 \(dfs\) 树上搞事情,然而一直没弄懂这个度数为 \(3\) 咋用,居然是针对答案的……
\(t3\) 没去想答案的上限,只构造出 \(|S|=1/2\) 的,但是边角特判着实太烦了
看来模拟以及分类讨论还是着实欠缺啊……
A. 定位系统
确实,一个节点的儿子中最多只能有一个不放,但是每个小子树都留出了 \(1\) 的空间,因此加起来可能会少得多
如果想要暴力计算的话可以直接去看每个叶节点是否有度数大于 \(3\) 的父亲进行分配即可
B. 签到题
如果度数不超过 \(3\),那么答案也不会超过 \(3\),考虑分类讨论
在连通块内,桥分割出答案为 \(1\) 的,只要求出答案为 \(2\) 的即可
先跑出 \(dfs\) 树,那么情况分为两类:
- 一条树边+一条返祖边
此时必须只有一条返祖边经过自己,用随机值异或判断即可 - 两条树边
此时是形如这样的: \(x-y-z\),且 \(x-z\),那么 \(y\) 这个连通块就可以拿出来了
注意到 \(y\) 中可能还会有划分,那么对于一条链上的按照深度排好序后取尽量小的间隔,一样用异或判断
C. 卷王
最关键的是答案 \(\le 3\),所以不要失去对特判的希望……
注意对各种平凡的不合法解的特判
冲刺省选2月24日
A. 礼物
又是一道最短路合并形式的题(又忘了)
考虑两点间最短路的表达式:\(min(|i-j|,dis(i,k)+dis(j,k)+1)\),其中 \(dis(i,j)\) 表示点 \(i\) 到颜色 \(j\) 的最短路
发现 \(dis(j,k)\) 值域太大了,不能很好地表示,进一步转化
处理 \(g(i,j)\) 表示颜色 \(i,j\) 之间的距离
此时 \(dis(i,j)=g(s_i,j)+\{0,1\}\)
这样就可以状压起来,一类数一起进行处理了
C. 排列
算是一个新的 \(trick\) 吧
对于这类需要维护形如 \(max-min-(r-l+1)\) 的题,维护以当前节点为右端点的所有信息
开两个单调栈,在弹栈的过程中来区间更改 \(max\) 和 \(min\) 的值即可
注意这道题由于是离线去做,需要加一个表示存在时间的懒标记
最后的答案就是是时间乘个数了
冲刺省选2月25日第二十一场
造成了非常不好的做题体验……
\(t3\) 因为 \(deg\) 写成 \(siz\) 导致跑得贼慢彻底失去信心,式子还给抄错了……
前两题白看了两个小时
C. 祖先
首先如果按照题解来写的一点好处就是可以不担心取模问题,在 \(unsigned\) 状态下计算完除以 \(2\) 即可
题解里的树剖估计还是挺难写,其关键在于维护轻儿子信息,并且修改轻儿子需要记录拆开括号后的一堆信息
冲刺省选2月26日第二十二场
成功推出 \(t1\) 性质,但是 \(dp\) 状态设的不好 \(dp\) 变得非常不方便
\(t2\) 看成子串写完发现看错题……
\(t3\) 花了一小点时间手模几个贪心都不对
A. 排队
\(t1\) 的 \(dp\) 最好设计成对于数 \(i\) 放在 \(j\) 位置的方案数,这样可以保证最后一个位置的成功就位
相比之下 \(dp\) 较大序列更方便,不必考虑繁琐的“已出现”问题
对于组合数的直接计算,也是基于较大序列的
相当于是一个不能接触 \(x=y\) 的路径问题,用类似卡特兰数的公式解决即可
B. 论文查重
一直觉得是字符串,结果经典套路又忘了……
转化 \(dp\) 形式,设 \(f[i][j]\) 表示 \(T\) 的 \(i\) 位置答案为 \(j\) 时 \(S\) 串最前匹配到了哪里
预处理出每个位置每个字符下一次出现的位置即可