NOIP 集训 考试记录
7.24 数据结构
4089: 大嘴乌鸦
4090: 艾莎
设选择区间为 \(S=[l,r]\),试把它分裂成两半 \(S_1=[l,x],S_2=[x+1,r]\).
有 \(S\) 的平均数 $$ave_S=\frac{ave_{S_1}(x-l+1)+ave_{S_2}(r-x+1)}{r-l+1}$$
显然 \(ave_{S_1}\) 和 \(ave_{S_2}\) 至少有一个 \(\ge ave_S\).
事实上肯定是一个大于等于 \(ave_S\),一个小于等于 \(ave_S\).
如果能选择一个合适的分割点,使得 \(S_1,S_2\) 的长度都大于 \(1\).那么对于任意的 \(S\),都可以找到比它更小的区间的组合来表达它,并使得答案不会更劣.
考虑边界情况,只有长度为 \(2,3\) 的区间不能再分.
然后我们得出结论:存在一种答案区间的长度 \(\le 3\).
4091: 沙奈朵 .
奇怪的分块.
其实还是自由度的问题(大概).
假设每次询问的颜色 \(x\) 固定.考虑已知两个子区间 \(L,R\) 的答案,如何合并.
首先有 \(ans=ans_L+ans_R\).然后考虑过区间中点的答案.
一个有贡献的过区间中点的子区间形如 \(L\) 中由 \(x\) 颜色出发的一个后缀和 \(R\) 中一个前缀的拼接.容易想到预处理两块然后直接乘法原理统计答案.
记 \(Val(F)\) 表示子序列 \(F\) 的贡献:\(\sum_{i\in F} [a_i\neq a_{i+1}]\).
对于区间 \(S\),记
跨区间答案即为
那么,如何更新 \(A,B\)?
有
如果单独拿出一种颜色,这个信息还是容易维护的.容易使人迷惑,也是使得线段树在此题上不好维护的关键在于询问颜色不定.
这里是我的一些思考
考场上第一次看到这道题的时候,之所以没有去想如何维护一种颜色的答案信息,有一定的原因在于被误导意图直接维护所有颜色的答案.
所以对于这种询问自由度较高的题目应尝试思考固定一些限制的解题方法.可能对写题有帮助.
那么分块然后套用上面的方式维护所有颜色的答案即可.
4092: 绒绒鸹
恶心树剖题.
对于每条重链维护当前处于这条重链的元素.
当某一个元素摆脱当前重链的时候暴力更新.考虑一条链经过的不同重链条数至为 \(\log\) 条.这个操作的总次数不超过 \(n \log n\).
然后问题就转化成了一个链上问题.
假设在 \(T\) 时刻查询节点 \(u\) 的答案.考虑 \(u,v\) 属于重链 \(C\).\(v\) 上的一个元素跳上 \(C\) 的时刻为 \(T'\).那么其 \(T\) 时刻在 \(u\) 上的判定为:
显然移项:
可以每个重链开一个桶.
然后最后元素可能会跳到环上.
对于环上的判定需要改动一下:
其中 \(Ord\) 是给环上的节点按转圈的顺序标上一个序号.在变一变:
好好好.
7.25 数据结构优化 DP?
4101: OIL
把式子中的枚举断点提到前面来.
然后式子就变成了
预处理
易得
接下来就是重头戏:如何计算 \(F_i\).
-
LXL 的均摊:
扫描 \(r\),那么从 \(i\) 开头的前缀可以分成两部分:\(x=[i,brk],y=[brk+1,r]\).其中 \(x\) 为\(mxpre_{i,r}\).那么 \(y\) 需要满足 \(\forall y\in[brk+1,r],(\sum_{j=brk+1}^r a_j)<0\).
那么加入 \(r\) 后,如果发现对于某一个 \(i\),\(y+a_r>0\),那么使 \(x+y+a_r\rightarrow x, 0\rightarrow y\).
发现将 \(y\) 相同的归位一类即可.每对于两类不同的 \(y\) 进行一次上述的操作,在之后的状态中它们的 \(y\) 会一直相同.故这种操作的总复杂度是 \(O(n)\) 的. -
考场的奇怪做法.
记 \(prs_{i}=\sum_{j\le i}a_j\).
考察新添加 \(r\),\(mxpre_{i,r}\) 会如何变化:新加入 \(prs_{r}-prs_{i-1}\).
看一下会发现 \(mxpre_{i,r}=\max_{j\in[i-1,r]}(prs_{j}-prs_{i})\).那么 \(prs_i\) 的更新范围是一个区间:
嗯.从右往左看第一个比它大的 \(prs\) 和之前的位置,用它来更新肯定是不优的.单调栈加线段树维护覆盖-求和.
7.25 图论
#3. 7.26 包围(besiege)
对原图建出最短路 DAG.
考虑转化题意:是否删去任一点 \(u\in[2,n-1]\),\(DAG\) 仍然联通.
若存在 DAG 不联通,则肯定至少被分成两块,不妨设 \(1\) 号点在的块为 \(B\).
若 \(u\notin B\),则等价于 DAG 上的入度不超过 \(1\).
假设 \(v_1 \rightarrow u,v_2\rightarrow u\in DAG\).如果不删 \(v_1,v_2\),则一定有 \(u\in B\).否则若删 \(v_1\),存在 \(1\rightarrow v_1\rightarrow u\) 联通.反之亦然存在 \(1\rightarrow v_2\rightarrow u\).
特殊情况:若存在 \(1\rightarrow u\),则 \(u\in B\).
#4. 7.26 武器(weapon)
不会匈牙利.
不会匈牙利.
不会匈牙利.
把 \(a_i\) 降序排序后贪心匹配求出来的最大匹配就是最大权匹配.这是这个二分图的特殊性质:只有一部的点有权.
假如点 \(u\) 可以匹配,并且 \(u\) 之后的点 \(v\) 通过 失去 \(u\) 的匹配 加入最大匹配中:这肯定是相较于舍去 \(v\) 不优的——匹配数量不变,但权值变小.
故在这题中最大权匹配其实是幌子.只需要考虑 KM 的过程就可以了.在 KM 中匹配成功的次数不超过 \(n\) 次.每次匹配结束后预处理每个左部点是否存在一条增广路经过它.可以做到跳过不必要的尝试匹配.
总时间复杂度为 \(O(n^3+m\log m)\).
7.27 图论(树)
4043: 7.27 病毒(virus)
给 \(x\) 排序后,答案为对于每个 \(x_i(i>1)\),\(x_{i-1}\) 为 \(x_{i}\) 的祖先的概率的乘积.
我们认为 \(x\) 中的点为关键点,我们需要使所有关键点串在一条链上.设 \(F_i\) 是 \(i\) 满足 \(i\) 和之前的关键点串在一条链上的概率.有 \(ans=F_{x_k}\).
有
设
那么有
如何算 \(G\)?
再尝试把两个关键点连起来:
大功告成~
4045: 7.27 合作(cooperate)
结论:存在解当且仅当每个联通快的边数为偶数.
必要性易得.以下通过构造方法证明充分.
对于一个连通块考虑其任意一颗 DFS 树 \(T\).自底向上考虑每个节点.对于返祖边任意规定(指向自己的返祖的父亲或指向自己).
树边在指向的儿子上规定:
若 \(u\) 当前的入度为偶,父边指向父亲.否则父边指向自己.
对于 \(T\) 按这样规定,根以外的所有点入度均为偶数.但根没有父亲.
端点不在根的边显然都考虑完毕.没有规定指向的边显然都和根相邻.
\(\huge{把它们都指向根就行}\)
因为已经规定,且不指向根的边都仅会贡献到根的子树中某一个入度上.所以这种边的条数为偶数.那么其他的边都指向根,总条数也是偶数.
4046: 7.27 激光炮(jgp)
- 拆分贡献
- 长剖贪心优化 DP.
如果我们需要保护一个位置 \(i\),可以放置防护的位置形成一个区间.
可以发现如果在 \(j\) 这个位置放置防护可以保护 \(i\),那么 \([i, j]\) 区间内的位置显然都可以被保护.
贪心的策略
每个位置尽量选取靠右的点进行防护.
会发现一件事:选取一个点设置防护后,可能会保护到若干个位置.
具体的,对于每个位置考虑区间 \([i,r_i]\),其中 \(r_i\) 表示 \(i\) 这个点选取最右端的能保护它的设置防护的位置.那么在 \(j\) 位置设置防护对 \(i\) 有用当且仅当 \(j\in [i,r_i]\).感觉其实把上面的话重复了一遍.但是这是本题很重要的一个性质.
如果 \([i,r_i] \cup [j,r_j] \neq \empty\) 会发生什么?肯定有 \([i,r_i] \in [j,r_j]\).证明不难.
那么我们可以根据区间的包含关系建树,转化的题意就变成了这样:在树上选择 \(k\) 个点,覆盖根到它的路径,求最大化被覆盖的点权和.
长链剖分优化 对树进行带点权的长链剖分,优先选前 \(k\) 大的链即答案.
7.28 DP
\(\Large 100+100+60+72=332\quad rk1\)
怎么说这个部分分.
4051: 网格行走
由于异或在不同位互相独立.故可以拆位考虑.
然后可以计数了.
时间复杂度为 \(O(n^2\log w)\).
4052: 树
考虑在序列构成路径的 LCA 处统计答案.
时间复杂度为枚举点对:\(O(n^2)\).
4054: 序列
学到了数位 DP 的新技巧.
考虑数位 DP 如何满足 \(\sum a_i=m\) 的条件:
设计状态 \(F_{i,j}\) 表示考虑了前 \(i\) 位,和同 \(m\) 的前 \(i\) 位相等.并且和向 \(i+1\) 进位 \(j\) 个 \(1\) 的方案数.\(G_{i,j}\) 为状态条件同 \(F\) 相同的异或和的加和.
然后我们转移 \(F\) 的同时使用 \(F\) 辅助转移 \(G\) 即可.
思想:
贡献被拆成独立可加的两部分:\(a,b\).
合并两部分贡献的方式:
通俗的说:对于其中一个部分的某一种状态,统计其参与拼接的种数.
4053: 酒馆
设 \(F_{l,r}\) 表示仅考虑区间被 \([l,r]\) 包含的人,通过选择 \([l,r]\) 的点能获得的最大收益.
考虑我们能确定的东西:对于一个区间中级别最高的酒馆,选择范围覆盖了它的游客一定会选择它.那我们就枚举这个酒馆是哪个.
有转移方程:
然后 \(num(l,r,i)\) 可以预处理.关键在于如何快速地找出决策点 \(k\).
这是一个斜率优化的弱化形式,即决策单调性.
对于一个酒馆 \(i\),现在我们要对于一个人数 \(num\) 能快速得出 \(k\) 最大化 \(k\times num-C_{i,k}\).
它满足每个决策点最优的位置为一个区间.可以用单调栈预处理.
7.29 数学
\(\Large 100+100+70+100=370\ rk7\)
第三题被卡常数了,把 long long 换成 int 就过了.
一些以前的数学知识的补
数论
费马小定理
证明:
引理:对于 \(a< p\),\(a\times i(i<p)\mod p\) 互不相同.
考虑若存在 \(i,j<p,\ ai\equiv aj\).这样会有 \((j-i)a\equiv p\).那么 \(j-i\) 和 \(a\) 至少存在一个 \(\bmod\ p\) 同余 \(0\).
欧拉定理
Lucas 定理
特殊形式:若 \(p=2\),那么对于 \(n,m\) 的每一个二进制位:
若存在 \(k\) 使得 \(n\) 的 \(2^{k}\) 位上为 \(0\),而 \(m\) 为 \(1\).那么结果就是 \(0\).否则结果为 \(1\).由此我们可以得到组合数奇偶性判断的方法:\(\binom{n}{m}为奇数\leftrightarrow n\&m=m\)
数论函数
记 \(n\) 的唯一分解为 \(\prod{p_i^{k_i}}\).
\(\color{red}{不完全积性}\) 因数函数 \(d(n)\)
考虑组合意义即可.
\(\color{red}{不完全积性}\) 欧拉函数 \(\phi(n)\)
结论 1:
枚举 \(\displaystyle i\le n\),将 \(i\) 归入分类 \(\displaystyle\{\frac{i}{n}\}\).
将分类合并:把 \(\displaystyle \{\frac{x}{y}\}\) 计算入 \(\displaystyle \{\frac{p}{q}\}(p,q互质)\).那么合并之后分类的分母集合是 \(n\) 的所有因数.每个类的大小就是 \(\phi(d)\).
结论 2:
这两个放在一起记.
对于 \(n\) 的质因数分解:和它互质的数要满足在膜 \(n\) 的每一个质因数个数下都不同余于 \(0\).
记 \(p_1p_2\cdots p_m=B\).
我们只需要找到所有 \(\le B\) 的和 \(n\) 互质的数的个数 \(num\).那么 \(\displaystyle \phi(n)=num\frac{n}{B}\).这显然是对的.
有
考虑构造一个数 \(x\le B\) 满足这样一组同余方程:
对于每个 \(b\) 任取一个非 \(0\) 的数,一组选法在 \(\bmod\ m\) 意义下唯一对应一个解:就是 \(x\).参见 中国剩余定理 CRT.
故 \(num\) 等于每个 \(b\) 选法的乘积.
那么就有
\(\color{red}{不完全积性}\) 因数和函数 \(\sigma(n)\)
没啥公式.线性筛的时候要预处理 \(\sigma(p^k)\).然后把一个数的最小质因数暴力扒干净.
组合数学
错排
考虑意义:对于 \(i\),枚举将它放在位置 \(j<i\).\(j\) 可以放在 \(i\),剩下的方案为 \(F_{i-2}\),\(j\) 也可以不放在 \(i\),这样的方案等价于 \(F_{i-1}\).
7.30 字符串
\(\Large50+100+0+40=190\quad rk11\)
模拟赛题
4129: 字符串谷
乍一看不是很可做.
对于每个串 \(i\) 规定一个值 \(\displaystyle f_i=\frac{1}{2}\sum_{j\neq i}lcp(i,j)\).
然后我们把 Alice 选择的串的 \(f\) 的和减去 Bob 选择的串的.发现一个很奇妙的事情:若 \(i\) 串被 Alice 选择而 \(j\) 串被 Bob 选择,在计算的时候刚好加上一个 \(\frac{1}{2}lcp(i,j)\),减去一个 \(\frac{1}{2}lcp(j,i)\).而当 \(i,j\) 一起被某一个人选择,则 \(\frac{1}{2}lcp(i,j)\) 刚好被加上了两次.
将 \(v_i\) 加上 \(f_i\).那么两个人选择的过程就独立了.
这个 trick 博弈里感觉应用可能很广泛啊.要好好记一下.
字符串
意图同步更新到 字符串算法(自动机无关) 系列中.
扩展 kmp(z 算法)
感觉没什么用啊.有什么事写二分+哈希可以.
用处
- 求出 \(S\) 的每一个后缀和 \(S\) 的 lcp.
- 求出另一个串 \(T\) 的每一个后缀和 \(S\) 的 lcp.
算法流程
首先先考虑第一个问题.记 \(suf_i\) 表示 \(S\) 从 \(i\) 开头的后缀.设 \(z\) 数组,\(z_i\) 表示 \(S\) 和 \(suf_i\) 的 lcp 长度.然后我们从前往后扫,求出数组 \(z\).
当扫描到 \(i\) 时,维护 \(l=j,r=z_j(j\le i)\) 满足 \(z_j\) 最大.考虑 \(z_{i+1}\).
若 \(i+1>r\),则使得 \(0\rightarrow z_{i+1}\).否则使得 \(\min(r-i+1,z_{i-l+1})\rightarrow z_{i+1}\).
这样赋值之后尝试暴力更新 \(z_{i+1}\) 直到不能更新即可.然后我们尝试使用 \(i+1,z_{i+1}\) 去更新 \(l,r\).
然后第二个问题的求解方法和上述流程基本一样.以至于存在一种偷懒的方法是将两个字符串添加一个特殊字符然后拼起来.然后对整个大串求 \(z\) 数组.
算法复杂度分析
考虑每一次暴力更新 \(z_{i+1}\),都会使得 \(r\) 向右扩展.故暴力扩展的次数上界是 \(O(|S|)\) 的.
一些闲言碎语.感觉跟什么 manacher 很像.
7.31 图论和动态规划
\(\Large100+100+100+100=400\quad rk1\)
模拟赛题
4130: 星树
二分一个 \(\lambda\).考虑如何判断答案是否不小于 \(\lambda\).
我们把 \(1\sim k\) 的数分成两部分:\(\ge \lambda\) 的和 \(<\lambda\) 的.把它们看做黑色和白色.
那么题意可以看成这样:一个点如果是叶子,可以把它们填成黑色或白色.黑色的数量存在个数限制.一个点如果是非叶子,按如下规则决定它的颜色:如果存在超过一半的子节点是黑色的,它就是黑色;否则它是白色.
我们需要判断根节点是否可以变成黑色.
设计 DP 状态 \(f_u\) 为将 \(u\) 变成黑色,需要至少将子树中的多少叶子设置成黑色.转移非常的朴素:选取儿子中最小的一半 \(f\) 加起来.
在叶子处需要进行一些特判.
然后我们检查根节点的 \(f\) 是否小于等于我们可以填的黑色数量即可.
4132: 千叶树
按 TOPO 顺序考虑每一个点.
设 \(f_{i,j}\) 表示前 \(i\) 个点将其花费成 \(j\) 个集合的方案数.
考虑点 \(i+1\),可以选择将其放入已有的 \(j\) 个集合中(但这个集合不能是其祖先所在的集合),或者放入新建的一个集合.
那么存在转移方程:
笔者在实现这个 DP 后尝试优化但是失败了.后来发现数据范围仁慈地允许 \(n^2\) 的 DP 通过了.
一些图论
树的直径
性质:
- 从树上的某一个点出发,距离它最远的点一定是直径端点之一.
- 树上的两条直径一定存在交点.
- 将两个树通过一条边连接起来,新的大树的直径端点一定是原来的四个直径端点中的两个.
杂题记录
P3574 [POI2014] FAR-FarmCraft
设计 \(F_u\) 表示以 \(u\) 为起点遍历完子树的最小化的 \(\max(c_i+t_i)\).然后这的 \(t_i\) 从到 \(u\) 开始计时.
然后我们对于点 \(u\),只需要找到一个最优的遍历所有儿子的方式即可.对于这样的题目,有一个常用 trick 就是考虑交换相邻两个相邻元素.
考虑判断交换的两个相邻元素能否更优相当于判断 \(max(f_i,f_{i+1}+2siz_i)>max(f_{i+1}, f_i+2siz_{i+1})\).左右两边同时减去 \(2siz_i+2siz_{i+1}\),相当于在判断 \(max(f_i-2siz_i,f_{i+1})>max(f_{i+1}-2siz_{i+1},f_i)\).发现 \(f_i,f_{i+1}\) 是必须要计入贡献中的.所以其实只需要判断 \(f_{i}-2siz_i>f_{i+1}-2siz_{i+1}\) 即可.
虽然我们知道了相邻两个元素交换什么时候更优.但好像对全局规划没有什么帮助.
事实上我们存在结论:直接将元素按 \(f_i-2siz_i\) 升序排序就能得到最优序列.
对于一个序列 \(a\),定义一次操作 \((i)\) 表示交换两个相邻元素 \(i,i+1\),其代价是 \(a_i-a_{i+1}\).我们对 \(a\) 降序排序后得到最优序列 \(a_{mx}\).可以证明,对于任意对 \(a\) 重排的序列 \(a'\) 一定可以构造出一种全都为负代价的操作序列从 \(a_{mx}\) 操作到 \(a'\).
事实上,考虑对 \(a'\) 使用 冒泡排序 操作到 \(a_{mx}\).事实上,每一个操作都是正代价的.然后我们考虑由倒着之前的操作过程回退到 \(a'\).然后每个操作都是负代价.
还有一些理性愉悦,虽然和这题没什么关系:我们规定一个序列的势能是 \(\sum_ia_i\times i\).那么可以证明:任意两个 \(a\) 的重排序列,通过任意不同的操作序列在它们之间互相转化,操作代价的和都相等,并都等于势能差.
上面的论述让我的贪心有了理性的证明.
我可是一个贪心的女孩哟.
8.1 搜索
\(\Large 100+60+0+60=220\quad rk14\)
模拟赛题
4111: KAKURASU
剪枝和优化搜索策略:
- 倒着枚举.先确定较大的贡献,这样可以在搜索树不太深的时候阻绝不必要的尝试.
- 使用背包确定当前位置填完后是否仍存在可行性.具体地,预处理 dp 数组 \(f_{0/1,i,j}\) 表示使用前 \(i\) 行/列,是否可以拼凑出和 \(j\).在搜索中如果有当前行或列在操作完后不存在可行策论,则直接放弃继续搜索.
笔者认为 1. 比 2. 更考验搜索的经验.因为 2. 优化的思考其实较为顺其自然,而 1. 就有一种神来之笔的感觉,这种对搜索顺序调整的思想在优化搜索策略中还是很重要.
4112: 卡特兰
不太懂.
但是我们的 kernel_panic 存在一种非常好的构造方法.
4113: 完全回文数
考虑去搜索一个长度为 \(Len\) 的数字.设当前前 \(i\) 位形成的数字为 \(S\),后 \(i\) 位形成的性质为 \(T\).
那么当前可能被搜出来的数字形如 \(S*T\).\(*\) 表示一个长度为 \(Len-2i\) 是数码串.
从 \(S\) 的方面考虑,平方出来的数字坐落在区间 \([S^210^{2(Len-i)},(S+1)^210^{2(Len-i)})\).从 \(T\) 的方面考虑,平方出来的数字后 \(i\) 位一定是 \(T^2\) 的后 \(i\) 位.
由于这个平方串理应是回文的.我们考虑判断从 \(S\) 考虑正着看和从 \(T\) 考虑反着看的两个区间是否存在交即可.
这就是这题的一个恶心的剪枝.
8.2图论+数据结构
\(\Large 100+100+90+0=290\quad rk1\)
模拟赛题
4122: 最短路径
直接最短路(如果在红灯时就暴力停下来)是最优方案.在 Dijkstra 中判断等待即可.
4124: 跳棋盘
动态规划即可.
设 \(f_{i,x,y}\) 表示第 \(i\) 步走到 \((x,y)\) 的最小代价.首先这个合法状态数是 \(O(n^2)\) 的.因为只有在 \(i=a_{x,y}\) 的时候状态才合法.
先只考虑从左上方转移到位置 \(x,y\) 的点,存在 \(f_{i-1,x',y'}+x-x'+y-y'\rightarrow f_{i,x,y}(x'\le x,y'\le y)\).维护二维前缀 \(\min(f_{i-1,x,y}-x-y)\) 可以高效找到最优转移.然后二维树状数组即可.再考虑别的方向.把坐标轴旋转三次转移其它方向即可.
时间复杂度为 \(O(4n^2\log^2n)\).然后存在一种扫描线的做法为 \(O(4n^2\log n)\).少了一个 \(\log\)?
4123: 树
容斥+树上莫队.代码巨难写.
树上莫队的分挂了,写了跟写了一样.
4125: 树树树
神仙题.崇拜 bear!
考虑如何选取几个关键点约束住 \(u_1,u_2,u_3\) 的选取.
首先由于 \(u_1,u_2,u_3\) 产生的中点可能在边的中间,我们可以在每个边的中间额外塞进去一个点保证中点坐落在点上.
记 \(M(u)\) 表示 \(median(d(u_1,u),d(u_2,u),d(u_3,u))\).给树上的边定向:令 \(M\) 较大的边指向 \(M\) 较小的边.然后设 \(u_1,u_2,u_3\) 两两路径覆盖的 \(Y\) 字形图案的交点为 \(x\).记 \(d_1\) 表示 \(d(x,u_1)\).\(d_2,d_3\) 定义相似.不妨设 \(d_1\le d_2\le d_3\).那么定向的情况可以分为两种:
- \(d_1<d_2\le d_3\).

- \(d_1=d_2\le d_3\).

其中用紫色圈标起来的点是所谓 汇点,即没有出度,所有临接边都指向的点.
发现这些点对于约束 \(u_1,u_2,u_3\) 的选取非常有利.
dfsf
- \(d_1<d_2\le d_3\).
考虑
通过 2 次 dfs 的代价处理出每个点是否可以成为 \(u_1,u_2,u_3\).然后统计答案.
- \(d_1=d_2\le d_3\).
有 \(M(Mid(u_1,u_2))=d(u_1,Mid(u_1,u_2))\).然后同样暴力搜索统计答案即可.
不知道是什么题选讲
CF1654E Arithmetic Operations
是使用分治数据结构:根号分治!
设值域大小为 \(M\).
设公差为 \(\delta\).
- 当 \(\delta\le\sqrt M\),我们暴力枚举在等差数列的首项和公差.统计复杂度为 \(O(M\sqrt M)\).
- 当 \(\delta > \sqrt M\),我们以每个点为起点暴力查看前后 \(\sqrt M\) 位,检查哪一种 \(\delta\) 在枚举范围中出现的次数最多即可.
CF1555F Good Graph
图必须是一个仙人掌.
考虑存在两个环 \(R_1,R_2\) 有边相交,显然存在简单环 \(R_3=R_1+R_2-R_1\cap R_2\).那么 \(R_3\) 的权值为 \(R_1\) 和 \(R_2\) 权值的异或和.由于 \(R_1,R_2\) 必须满足要求,则 \(R_3\) 一定不满足要求.
然后什么的就是用线段树维护链上异或和即可.注意到每个点是否在环上仅会被标记一次,所有可以暴力标记.
8.3 综合模拟
\(\Large 100+100+72+29=301\quad rk3\)
模拟赛题
4145: 闪电
正常的想法是对 \(y\) 排序然后前缀和优化.时空复杂度达到 \(O(n^2)\).但是出题人卡了我们空间,该怎么办呢?
然后我们整一些不正常的活:按 \(x\) 排序 DP.通常来说,闪电的 \(y\) 第降显然会给转移带来很好的拓扑结构.但一次考察闪电上的顺序的每一个点,其实 \(x\) 坐标也存在很强的约束性.
我们设 \(F_{i,0/1}\) 表示考虑从 \(i\) 出发,第一次向 左/右 偏折的闪电个数.那么加入点 \(i\) 的时候,它只能成为闪电中的第一个点或第二个点.然后就比较好转移了.
4146: 三
一个感觉十分有用的处理三元组的思考方向.考虑有用二元组的数量:如果这个数量不多,那么可以转化为二元组问题.
比如这道题,考虑三元组 \(i,j,k\),若 \(i,j\) 中间存在 \(x\),如果满足 \(a_x\ge a_i\), 则 \(x,j\) 作为二元组更优.如果满足 \(a_x\ge a_j\),则 \(i,x\) 作为二元组更优.这两部分结合:发现将肯定不优的二元组剔除后,总共的二元组数量是 \(O(n)\) 个的.
8.4 综合模拟
\(\Large 100+100+90+95=385\quad rk1\)
4150: 正方形
枚举正方形的左上和右下两个顶点:它们肯定在同一条斜率为 \(-1\) 的斜线上.
那我们枚举每条斜线.在上面做扫描线.
4151: 逆序对
奇怪的 DP?搜索剪出来 95 分.
注意到 \(a\) 的一个前缀,将其投射到值域上会形成若干段连续段.然后我们对于每个连续段记录选择了几个数就可以转移了.
具体来说.
假设有一个排列为 \(5,2,3,1,4\),然后第 \(3\) 个前缀 \(5,2,3\) 在值域上的投射为 \(0,1,1,0,1\).在转移到第 \(4\) 个前缀 \(5,2,3,1\) 的时候,我们只关心之前的连续段 \(0,(A)\{1,1\},0,(B)\{1\}\) 之中选择的数有多少即可:并不需要知道它们具体是多少.
这样做可以减少大量的状态.

浙公网安备 33010602011771号