【省选模拟】3 月
3.3
昵称
方案数可能爆
long long
但只需要知道是否 \(>\) 某个数时可以时刻对 \(10^{18}\) 取 \(\min\)
按数位填数:枚举长度+不允许前导 \(0\iff\) 长度 \(\max\)+允许前导 \(0\)(注意输出)
帝国防卫
考场做法是 \(O(n\log n\log^{2}x)\) 的线段树维护 bfs 序(不过是在线的)
另一个做法是整体二分每个点变为合法的时间,修改可以给 \(\log\) 级祖先打标记(注意减掉同一次修改父亲对儿子的影响),询问跳 \(\log\) 级祖先求和。为了解决下取整后相加,每个点要维护 \(\log\) 个标记,时间复杂度 \(O(n\log n\log^{2}x)\)
使用虚树可以做到 \(O(n\log n\log x)\),但并不会
3.4
出俩板子啥意思啊
过路费
70pts:枚举第 \(k\) 大边的权值 \(x\),那么要求走 \(\ge k\) 条权值 \(\ge x\) 的边,其余边权值看做 \(0\),跑分层图最短路即可。时间复杂度 \(O(m^{2}k\log m)\)
考场打表发现谷很少,写了随机化三分,但没卡好时 T 了。赛后调参通过
正解:考虑优化掉分层图。可以把所有边权 \(-x\) 并与 \(0\) 取 \(\max\),然后正常跑最短路,用最短路 \(+kx\) 更新答案。分 \(x\) 与最终答案中第 \(k\) 大边的大小关系易证答案不会更小。
通过不合法情况不优规避掉判断合法性。在判断合法性成为瓶颈时要往这方面想,可能对直觉和证明技巧要求较高
3.5
小 G 的约数
赛时使用打表猜出了结论,但采用了最劣的 \(O(2^{\omega(n)})\) 容斥实现
条件 \(3\) 可以转化成:\(\forall i<j,d_{i}\nmid d_{j}\),问题即为求 \(n\) 约数集合的最长反链长度
记 \(f(x)\) 为 \(x\) 分解质因数后指数和,\(g(x)=\sum_{d|n}[f(d)=x]\)。使用 Dilworth 定理转化为最小链划分数,答案为 \(\max g=g(\lfloor\frac{f(n)}{2}\rfloor)\)
\(g(\lfloor\frac{f(n)}{2}\rfloor)\) 显然为答案下界,只需要构造一种方案。证明可以看官方题解
实现上可以对质因子指数背包,也可以直接贪心地最小链覆盖(每次取是当前链尾倍数、未覆盖的最小因子加入当前链。显然新开链不优,否则划分到哪个链都一样)
约数有关问题从质因子角度
打表考虑归纳
⼩ G 的连通图
考虑取 \(L=\prod_{p\in\mathbb{P},p<n}p\),那么除了 \(L+1\) 都连通了。
找一个 \(>\sqrt{n}\) 的质数 \(a\mid L+1\),让 \(L+1\) 和 \(L+a+1\) 连边,这样 \(L+a\) 可能又不连通了。让 \(ka+1\) 也是质数且 \(ka+1\mid L+a\),即可让 \(L+a\) 和 \(L+(k+1)a+1\) 连边(\(a>\sqrt{n}\) 是为了让 \(L+a^{2}\) 不在区间内,这样 \(L+xa,1<x<a\) 可以通过 \(p\mid x\) 连通)
实际上取 \(k=2\),在 \(n\ge35\) 的时候都是找得到这样的 \(a\) 的(不会证明),对于 \(n<35\) 暴力打表即可
求 \(L\) 采用暴力 CRT,这样只需要写高精乘低精
code
for(int i = ceil(sqrt(n)); ; ++i)
if( !vis[i] && !vis[2*i+1] ) { a = i; break; } // vis[prime] = 0
ans = 1, mod = 2ll*a*a+a; // L = -1 (mod a), L = -a (mod 2a+1)
Rep(i,1,n) if( !vis[i] && i != a && i != 2*a+1 ) (mul *= i) %=mod, ans = ans * i;
for(LL now = mul; now != mod-3*a-1; ckadd(now,mul), ++cnt); // CRT
ans = ans * cnt;
ans.write(); // 只有 ans 为高精
小 G 的 DAG
套路题,但考场上愣是没想到根号重构
分组处理询问。使用 bitset
\(O(1)\) 查询两点是否可达。对于操作一,每根号次 \(O(n)\) 重构(按时间倒序操作,每个点只被覆盖一次);有效的操作二为询问点最后一次被覆盖到当前时间之间的,对操作时间分块求最小值。时间复杂度 \(O(\frac{n^{2}}{\omega}+n\sqrt{n})\)
3.6
高维游走 \(\star\)
设第一阶段在 \(m\) 维上走了 \(a_i\) 步,那么疲劳度为 \(\sum i\times a_{i}\),方案数为 \(\displaystyle{t_{0}\choose a_{1},\cdots,a_{m},t_{0}-\sum a}\prod{t_{i}\choose a_{i}}\)
由库默尔定理得模 \(2\) 意义下方案数不为 \(0\) 要求 (t[0]&a[i])==a[i], (a[i]&a[j])==0, (t[i]&a[i])==0
。考虑构造 \(31\times m\) 的 \(0,1\) 矩阵 \(b\),\(b[i,j]=1\) 当且仅当 \(j=0\) 或 \(a_j\) 的第 \(2^i\) 位可以为 \(1\)。问题转化为给矩阵每一行选一个 \(b[i,j]=1\) 的 \(j\),贡献 \(2^{i}j\) 疲劳度,求有多少种疲劳度的方案数为奇数
考虑 DP for DP。将疲劳度进位到 \(i+1\) 位(\(0\sim i\) 位始终为 \(0/1\),\(0\le\) 第 \(i+1\) 位 \(<m\))。设 \(f[i,s]\) 为前 \(i\) 行,\(i+1\) 位取值集合为 \(s\) 的疲劳度种数(\(s\) 为状压,第 \(j\) 位为 \(1\) 代表疲劳度的 \(i+1\) 位可以为 \(j\),“可以”代表方案数 \(\equiv1\pmod2\))
转移枚举第 \(i\) 位选的数并进位,使用异或完成方案数模 \(2\)
预处理转移即可做到 \(O(T2^{m}m\log t)\)
写之前一定要理清思路,非常绕
过山车 (bzoj4261)
棋盘问题,每个点与四连通点匹配:黑白染色, 往网络流上想
\(w=0\) 只需要判断是否存在合法路径,观察到每个点的度数为 \(2\),使用二分图匹配分配度数即可
费用与当前格的轨道有关。考虑新建两个虚点,分别代表与左右连边、与上下连边,那么流量分别流到两个虚点代表弯道,流到同一虚点代表直道,但网络流中无法对分散的流量计算费用,因此补集转化为算直道的最小费用。
该点向两个虚点分别连 \((1,w_{i,j}),(1,0)\) 的边,由于是最小费用流,流量流到不同虚点一定走费用为 \(0\) 的边,与题意相符
由于图是四分图且边权范围很小,dinic 显著快于 EK(求助:本题 SPFA 的 SLF 是负优化)
费用流不好直接计算费用时考虑算补集
木棍 \(\star\)
把给定区间右端点 \(-k\) 变为对木棍左端点的限制。显然若存在方案,木棍左端点坐标可以为整数
梳理一下限制:
- 区间 \([l,r]\) 中最多 \(\lceil\frac{r-l}{k}\rceil\) 根木棍
- 区间 \([l,r]\) 中至少 \(f(l,r)\) 根木棍。\(f(l,r)=\sum[l\le a_{i}][b_{i}\le r]\)(注意连这类边只需要 \(O(n^{2})\) 二维前缀和,不要像我一样 naive 地写 \(O(n^{2}\log n)\) 扫描线)
- 区间 \([x_{i},y_{i}]\) 中最多 \(c_i\) 根木棍
记 \(s_i\) 为左端点坐标 \(\le i\) 的木棍数,则可以把限制表示成对 \(s\) 差分约束。使用 hall 定理可以推出这些限制是充要条件,当且仅当出现负环无解
点数高达 \(10^{9}\),合理猜想只需要判断给定区间左端点 \(-1\)、右端点(称为关键点,第 \(3\) 类边的端点一定都是关键点)的导出子图即可,点数降为 \(O(n)\)
证明:如果负环上出现相邻的第 \(1/2\) 类边可以直接合并,不会使权值增加。然后考虑负环上一个非关键点,其左右一定分别为第 \(1,2\) 类边,向第 \(1\) 类边的另一端点移动至第一个关键点不会使权值增加(第 \(2\) 类边权值不变)。
朴素求解时间复杂度 \(O(n^{3})\)(边数 \(O(n^{2})\)),卡时可以通过(本题 SLF 优化效果显著)
正解是用线段树优化转移,时间复杂度 \(O(n^{2}\log n)\)
卡时判负环(可能可以加上 SPFA 优化)
利用关键点的导出子图来减小规模(不会证明可以猜想)
3.7
分裂
不难发现把球全分裂成 \(n\) 后共有 \(n!\) 个球
记 \(m=\min\{x|x!\ge n\}\)。先把球分裂成若干个 \(m-1\) 和若干个 \(m\),此时的球数 \(n-m<sum\le n\),由于 \(m\le20\),因此差距并不大,考虑据此调整。对于 \(x+1\) 个编号 \(x\) 的球,可以变为 \(1\) 个 \(x-1\) 和 \(x+1\) 个 \(x+1\),总球数 \(+1\)。对编号 \(m-1,m,m+1\) 的球进行类似的调整即可。
这三个位置上的球数有 \(O(m!)\) 个,只需要 \(O(m^{2})\) 个就能结束调整,因此 \(n\) 较大时一定有解。实际上精度很高,除了 \(1\) 和无解的 \(3,5,8\) 都不需要特判
构造方法:先快速逼近答案,再微调
未来 \(\star\)
用 \(s[i]\) 表示 \(i\) 次操作后的矩阵
把颜色映射为 \(0,1,2\),则题目所述的变换可以表示为 \(s[i,j]\equiv-s[i-1,j-1]-s[i-1,j]\pmod3\)
这个形式使得 \(s[i-1,j-1],s[i-1,j]\) 之间独立开了,考虑直接算 \(s[0]\) 对 \(s[m]\) 的贡献。转移路径为倒置的杨辉三角,不难发现 \(s[0,i]\) 对 \(s[0,j]\) 的贡献系数为 \({m\choose i-j}\)(\(i,j\) 均为模 \(m\) 意义下)
由于是在模 \(3\) 意义下进行,可以对 \(m\) 三进制分解。这样每次要算 \(s[0]\) 对 \(s[3^{i}]\) 的贡献,由 Lucas 定理得对于 \(s[3^{i},j]\),只有 \(s[0,j],s[0,j+3^{i}]\) 的系数不为 \(0\),\(O(1)\) 即可
时间复杂度 \(O(n\log m)\),非常优秀
回忆
强调一下 \(nm\le40\),不妨设 \(m\le n\),则 \(m\le6\)
考虑插头 DP。状态除了要记录轮廓线,还要记录当前出现的最大连通块大小、轮廓线上各连通块大小(最多 \(4\) 个,因此采用 \(8\) 进制最小表示法)。转移看当前格会和哪些连通块合并,更新大小即可
并不会算复杂度,不过跑起来松松松
明显是某种算法但不会算复杂度时:
敢写敢 AC暴搜估算
3.8
我 \(\star\)
不难想到把操作化为有向边。问题转化为操作一条有向边会使起点的权值转移到终点,求所有边操作至少一次后最多多少点有权值
对于一个点,操作其一条出边后可以紧接着操作其他出边,后面的操作不会引起权值合并,因此只需要将每个点操作一次
对于一个 SCC:若其中有点无初始权值,那么一定存在方案使得操作完该 SCC 中所有点并不发生合并,且可以指定最后空出的点;否则一定存在只合并一次的方案。因此 SCC 与点并无本质不同,可以使用 tarjan 缩点成 DAG
可以使用最小链覆盖求解,也有更简单的做法:
- 对于有权值且有出边的点,连边 \((S,i,1)\) 表示至少操作一次;建虚点并连边 \((i',i,\inf),(i',T,1)\) 代表该点被操作后就空出来了(拆点是为了避免直接 \(S\rightarrow i\rightarrow T\))
- 对于无权值的点,连边 \((i,T,1)\) 代表可以无合并地接纳一个权值
- 对于原图中的边连流量 \(\inf\),表示可以操作任意次
流量流到 \(T\) 相当于权值转移到本来无权值的点,最大流即最多多少权值不被合并
基环树做法不一定能直接迁移到图上,但可以通过环的性质来思考 SCC
想不出
本题中 \(E=2V-n\),使用欧拉公式 \(R=E-V+2\) 转化为最大化交点个数
斜率为 \(\sqrt{3}\),因此不存在交点为射线端点的情况,对坐标稍作变化可以把射线方向转化为向左/向下
考虑相对关系为 左上 右下 的两点,要么左上的点向下、右下的点向左,要么同向。否则调整为第一种情况不会影响原来的交点,且这两条线增加了一个交点。因此可以得到若 \((x,y)\) 向左,\(\forall x'>x,y'<y,(x',y')\) 向左,向右也有类似的结论
据此不难得到一定存在一条分界线,该线左上的点向下、右下的点向左。可以贪心地确定分界线:若左上的点多就向下,否则向左。正确性可以感性理解。使用 BIT 可以做到 \(O(n\log n)\)
题目名称
鸽
3.9
鱼死网破
纵坐标相同显然可以差分。问题是可能出现多个墙挡在一个鱼头胖士兵与一点之间,因此需要去重(只保留最上面的并)。\(O(nk)\) 做法类似括号匹配,不过 \(O(nk^{2})\) 也可
防水墙很少因此可以以防水墙端点为中心,用射线对一个半平面差分。射线的权值为 \(1/-1\),极角排序后二分找到某点左侧的射线
本题不卡精,但实际上所有操作可以用整数实现
漏网之鱼
删数更好维护 mex ,因此不断左移右端点。由于 mex 单调,取 min 转化为区间覆盖
历史版本和有两种思路:强行懒标记维护,记录每个区间和需要累加多少次到历史和;把时间也当做一维,每个区间加存在的时间为一段区间
浑水摸鱼
讲过的题不会做/kk
暴力为把每个后缀的最小标号插入 trie
另一个常见部分分为 \(A_{i}\le30\) 且随机,那么可以认为较长的区间是两两不同的,对较短的暴力即可
考虑用 SA 的方法求本质不同子串,最小标号与相同颜色的位置有关,因此转化哈希方式即可使用二分+主席树 \(O(n\log^{2}n)\) 求 LCP,再用 stable_sort
(比较不是 \(O(1)\) 时快于 sort
)做后缀排序即可
// 不存长度查询 hash 值
uLL qry(int ql,int qr,int u,int l=1,int r=n) {
if( !u ) return 0;
if( ql <= l && r <= qr ) return t[u].h;
int mid = l+r>>1;
if( qr <= mid ) return qry(ql,qr,ls(u),l,mid);
if( mid < ql ) return qry(ql,qr,rs(u),mid+1,r);
return qry(ql,mid,ls(u),l,mid)*base[qr-mid] + qry(mid+1,qr,rs(u),mid+1,r);
}
3.11
卷王
每次修改造成的影响为空间上一段区间、时间上一段后缀,因此考虑设 \(f[i,s]\) 为倒数 \(i\) 时刻能否翻转灯集 \(s\)。预处理 \(O(n^{2}2^{n})\),回答 \(O(n)\)
赢王
对 \(a\) 做前缀和 \(s\),那么区间 \([l,r]\) 合法等价于 \(s[l-1]=s[r]\),且 \(f(a_{l}\cdots a_{r})=\sum_{i=l}^{r}\min(s[i]-s[l-1],k-(s[i]-s[l-1]))\)。讨论一下 \(s[l-1],s[i]\) 的差值,只需要求一段区间内一段值域的数和/个数即可快速求出,主席树/离线 BIT 均可
进一步思考,若 \([l,mid],[mid+1,r]\) 均合法,那么 \(f(a_{l}\cdots a_{r})=f(a_{l}\cdots a_{mid})+f(a_{mid+1}\cdots a_{r})\),因此只需要计算极小的合法区间,共 \(O(n)\) 个
稳王 \(\star\)
最优决策显然是能杀死 boss 时一回合打出所有牌
一个 trick 是答案可以转化为 \(1+\sum\) 第 \(i\) 回合打不死 \(boss\) 的概率,等于所有赢不了的抽牌序列的概率和 \(+1\)
先说一下暴力:除了拿到 \(n\) 张复读/毒药的情况,否则 \(n\) 回合一定结束了。特判这两种情况然后枚举 \(n\) 张牌为哪些即可
分 \(7\) 种情况讨论拿到了哪些种类的牌(具体分析见官方题解)。这里以拿到毒药+火球为例,令第一张毒药有伤害同时 boss 血量 \(+1\)。设 \(f[i]\) 为造成 \(i\) 点伤害的概率,答案为 \(\sum_{i=1}^{n}f[n]\),转移为 \(f[i]=\frac{1}{3}f[i-1]+\frac{1}{3}f[i-3]\)。但这样会算上全拿到毒药/火球的情况,容斥掉即可
3.12
T1
按位考虑贡献,发现 \(f\) 的取值个数等于按位或的取值个数。另一个性质是只需要两个数就能或出 \(n\) 个数能或出的所有取值,证明考虑找到最高不同位,\(a_{i}\) 该位为 \(0\) 且 \(a_{j}\) 为 \(1\),把低位的 \(1\) 全转移到 \(a_{i}\) 即可。然后变成了 AGC15D,根据最高位取值分类讨论即可
T2
四元划分相当于 \(a,b\) 和 \(c,d\) 路径无交,一棵树的答案即为 \({n\choose 4}\)(三度树)。根据 \(|A\Delta B|=|A\cup B|-|A\cap B|=|A|+|B|-2|A\cap B|\),求两棵树交集大小即可。
一个想法是枚举分开这两条路径的点/边,但这样会算重。采用树上经典容斥:答案 \(=\) 断边的方案数 \(-\) 断点的方案数。枚举第一棵树的断开位置并染色,DFS 第二棵树统计即可,时间复杂度 \(O(n^{2})\)
一个比较精巧的实现是边化点,这样只需要考虑断点的情况了
T3 \(\star\)
好题,断断续续改了很久,直接看官方题解吧
拼接字符串的出现次数 \(=\) 在原串中出现次数 \(+\) 跨过拼接处出现次数
与斐波那契相关的尝试找规律/循环节
3.13
跑步
考虑修改 \(a_{x,y}\) 后第 \(x\) 行变化位置一定是区间 \([y,r_{x}]\),考虑对下一行的影响,下一行的变化位置仍是区间 \([l_{x+1},r_{x+1}]\) 且 \(l_{x}\le l_{x+1},r_{x}\le r_{x+1}\),证明显然。
只需要维护当前行的 \(l,r\) 并单调向右移,BIT 维护每个位置,时间复杂度 \(O(n^{2}\log n)\)。所以变化量为 \(\pm1\) 是用来钓鱼的
看到修改只有 \(n\) 次就应该想到单次修改可以枚举行了,确实不应该没想到
对 DP 的决策点打个表,可能会有惊喜
算术
先考虑 \(k=2\):随机选取质数 \(p\),若 \(\exists x^{2}=n\),那么 \(n\bmod p\) 一定存在二次剩余;否则有 \(\frac{1}{2}\) 的概率存在,随机 \(20\) 个判定即可
可以直接推广到 \(k>2\),取质数 \(p=ak+1\),则有 \(x^{ak}\equiv 1\pmod p\Rightarrow n^{a}\equiv 1\)
求和
3.14
神必的集合 \(\star\)
理解还不太深刻,先贴 zsy 的题解
法阵 (loj3153)
显然 \(y-x\) 越小,可选的 \(z\) 越多,因此答案中的 \((x,y)\) 一定满足 \(\min(a_{x},a_{y})=\max_{i=x+1}^{y-1}\{a_{i}\}\),使用单调栈可以求出这样的 \((x,y)\),顺便也证明了这样的对数为 \(O(n)\)
离线,从右到左线段树维护每个 \(z\) 的答案,每次加入 \(x=i\) 的二元组即可
旅行
看到 \(dis(u,v)\le d_{u}\) 的形式想点分治
3.15
梦批糼
没看懂题解,这里是 \(O(n^{5})\) 做法
设 \(f[i,j,k]\) 为包含 \((i,j,k)\) 的合法子长方体数,\(O(n^{5})\) 枚举子长方体的顶面,可以 \(O(1)\) 得到底面最低是多高,配合三维二阶差分即可。
记 \(tot\) 为子长方体总数,\(sum\) 为合法的子长方体数,则没有选中障碍的概率为 \((\frac{sum}{tot})^{w}\),\((i,j,k)\) 一次也没有被选中的概率为 \(\displaystyle 1-(\frac{sum-f[i,j,k]}{sum})^{w}\)
至少出现一次 \(\iff\) 所有 \(-\) 一次都没有出现
等你哈苏德
黑白区间视为 \(1,-1\),要求离散化差分数组 \(\in\{-1,0,1\}\)。对于为 \(-1,1\) 的位置,手动添加区间 \([i,i]\) 使其变为 \(0\)。
把区间看作给差分数组连边,相当于要求出度 \(=\) 入度,即存在欧拉回路,网络流求混合图欧拉回路给无向边定向即可,有 \(O(n)\) 点数或 \(O(n+m)\) 点数两种建图方式
差分!!!
3.17
传教
令 \(c_{i}=a_{i}\oplus b_{i}\),要把 \(c\) 异或成 \(0\)。一个显然的贪心是每次取最左端不为 \(0\) 的 \(i\) 给 \([i,i+k-1]\) 异或上 \(c_i\),差分后每次只需要修改两个数
按模 \(k\) 余数分组,每组互不影响,转化为求组内前缀异或不为 \(0\) 的个数,修改变为给一段后缀异或一个数。可以对每组分块,每块开一个桶做到 \(O(n\sqrt{n})\)。有个小 bug 是 \(k>\sqrt{n}\) 会出现 \(k\) 个不满的块,因此分块的时候只对满的块开桶,不满的暴力即可
方程
随便把式子推成 \((\frac{a+b}{c})^{2}+\frac{c}{a+b}\equiv-t-1\)
\(a+b\) 的取值数可以直接卷积,\(\frac{a+b}{c}\) 可以用原根转化为指数上的加减,再卷一次即可,最后枚举 \(\frac{a+b}{c}\) 值统计答案
移花接木 \(\star\)
跟着官方题解的思路走还是比较顺的,实现有点阴间
大问题由小问题组合成时考虑递归
3.18
加与乘
考场做法为打表 ^_^,貌似可以感性理解正确性
szs 做法:
考虑 \(n\) 为奇数时 A 先手的情况。\(n=2\) 时 B 先手,只有此时为 \(00\) A 才能胜。如果原序列存在连续两个 \(0\) 或首尾均为 \(0\),A 可以一直保持这两个 \(0\) 到 \(n=2\),必胜;如果存在长为偶数的极长连续 \(1\)(旁边一定有一个 \(0\)),保持这段 \(1\) 为偶数长度至 \(n=3\)(\(011\)),必胜。因此必败情况只有极长连续 \(1\) 均为奇数且由一个 \(0\) 隔开。B 先手只需要判断一次操作是否能达到这种情况即可
感觉和 AGC6B 有点像
数颜色
yzf 做法:每个点和父边一一对应,只需要考虑 LCA 的贡献。如果一条链的 LCA 不被其他链覆盖,那么会对答案贡献 \(1\),对每条链的 LCA 求出其左右第一个覆盖它的链即可。只需要链覆盖、点查询,可以做到 \(O(n\log n)\)
3.24
小 F 与游戏
\(a\) 单谷,因此 \(b\) 的前 \(k\) 个元素必然可以划分成两个 LDS。\(a\) 在进行 \(k\) 次 \(3,4\) 操作后剩下的元素单调,有 \(2^{\max(n-k-1,0)}\) 种方案,最后乘上即可。令这些元素也递减,这样 \(b\) 整体就可以划分成两个 LDS,且后 \(n-k\) 个属于同一 LDS
为了避免算重,规定优先接在第一个 LDS 后面,且第一个长于第二个。设 \(f[i,j]\) 为前 \(i\) 大的元素,后 \(j\) 个属于同一 LDS 的方案数,转移枚举 \(i\) 放在哪里即可:\(f[i,j]=f[i-1,j-1]+\sum_{k=j}^{i-1}f[i-1,k]\),答案为 \(\sum_{i=n-k}^{n}f[n-1,i]\)
然后有一个比较神仙的事情:设 \(g[i,j]=f[i,i-j]\),把 \(g\) 画在坐标轴上,发现转移类似走格点,答案即为从 \((1,0)\) 走到 \((n-1,k)\) 且不越过 \(y=x-1\) 的方案数
一些形式简单的 DP 可以尝试转组合数计算
小 Z 与函数 \(\star\)
我的理解非常生硬,先鸽了
小 W 与骑士
- \(\overrightarrow{a}//\overrightarrow{b}\):变成了一维问题
- \(\overrightarrow{a},\overrightarrow{b}\) 同向:简单 DP 即可
- \(\overrightarrow{a},\overrightarrow{b}\) 反向:先顺着走看能否到终点,再逆着走看是否成环。写起来略烦,但这方面的数据很弱
- \(\overrightarrow{a},\overrightarrow{b}\) 不平行:bzoj4767 原题。根据平面向量基本定理可以把所有点表示成 \(x\overrightarrow{a}+y\overrightarrow{b}\),把 \((x,y)\) 拿出来可以看作每次向上或向右走一步,注意 \(x,y\) 值域为 \(500^{2}\) 因此不能直接 DP。考虑容斥,按 \(x\) 给所有点排序,设 \(f[i]\) 为走到点 \(i\) 且不经过其他点的方案数,枚举经过的第一个点减掉即可
3.27
博弈
DP 出 \(f[u]\) 表示位于点 \(u\) 的一个棋子移动到叶子,最大的自己移动次数 \(-\) 对手移动次数
注意 \(f\) 可以直接和 \(0\) 取 \(\max\),因为 \(f[u]<0\) 代表走这个棋子给自己带来的时负收益,因此一定选择不走它,若当前所有棋子的 \(f\) 都 \(\le0\) 就可以直接判负了。考场上就是没想到这一点
剩下的问题就是一个朴素背包,时间复杂度 \(O(n^{3})\)。预先把体积降序排序可以避免坐标偏移,卡掉一半常数
排列
先考虑 \(m=0\),可以直接 OEIS,考虑对限制做一些转化
把一个排列看作给 DAG 加边的一个顺序(排列种元素 \((a,b)\) 看作连边 \(a\rightarrow b\)),那么 \((a,c)\) 在 \((a,b),(b,c)\) 之间等价于传递闭包后不会出现新的边,分类讨论不难验证,难的是如何想到
更进一步,我们知道逆序对是有传递性的,考虑对于一个 \(1\cdots n\) 的排列,逆序对 \((a,b)\) 代表 DAG 已有边 \(a\rightarrow b\),因此任意排列都对应一个合法的 DAG(且是双射,可以爆搜验证,不会证明)。考虑 DP,状态为 \(1\cdots n\) 的排列,转移考虑交换相邻的顺序对(加入恰好一条边),按逆序对从少到多的顺序转移即可
\(m\ne0\) 只需要在加入边 \((c,d)\) 时判断其之前的 \((a,b)\) 是否全部加入即可,时间复杂度 \(O(n!(n+m))\)
卡常的话可以用康托展开离散化,数组保存 DP 值
3.28
逃离藏宝洞
树上任意一条链 \((u,v)\),\(\text{lca}(u,v)\) 可能有两条子边在链上
序列划分
弱智 DS 选手实锤,说一下实现细节
- \(\text{mex}\) 单调,因此使用数组保存每个 \(\text{mex}\) 对应的区间,省掉两次线段树二分和一次区间覆盖
- 转移时要求 \(\sum f[i]\times\text{mex}(i+1)\),而 \(\text{mex}\) 每次变化一个区间,因此使用前缀和 + 一个变量维护,省掉一个单点插入
最终线段树只需要两个操作求区间 \(\text{mex}\),根本不卡常
值的一提的是不用线段树,精细实现一下就能得到 \(O(n\sqrt{n})\) 的做法
重排列 \(\star\)
为了方便先给 \(a\) 排序。对于不互质的元素 \(i,j\),Bob 无法改变其相对顺序。给不互质的元素连边,对于一个连通块,Alice 能做的是给边定向成 DAG,Bob 能做的是取出最大的拓扑序
对于一个连通块,起点一定是最小点,删去该点后形成若干子问题,不过要求分出的每个连通块起点与当前起点相连(为了保证拓扑序中相邻点有边,否则 Bob 就会换走)。直接做是 \(O(n^{3})\) 的,瓶颈在于 \(n\) 次删点每次需要遍历 \(O(n^{2})\) 条边来区分连通块,这里只需要判断连通性因此可以质因子优化连边
这部分 zsy 有一个更简单的做法,但并不会严谨证明
求多个 DAG 的最大拓扑序用一个堆模拟即可
3.31
环
显然把 \(a\) 排序不影响答案。对于环,考虑用若干条端点均在右部的点拼出来。由于链的两端不同而点的相同,拼接时系数不同,可以把链看成有向的,这样只有一种拼接方式,最后给答案 \(\div2\) 即可
设 \(f[i,j]\) 为左部前 \(i\) 个点,右部前 \(a_i\) 个点形成 \(j\) 条链的方案数。转移:,再用 \(i\) 把两条链串起来
- 从 \((a_{i-1},a_{i}]\) 中选若干点加入:\(\displaystyle f[i,j]\leftarrow f[i,j]+{a_{i}-a_{i-1}\choose k}f[i-1,j-k]\)
- 用 \(i\) 把两条链串起来:\(\displaystyle f[i,j]\leftarrow f[i,j]+2{j+1\choose 2}f[i,j+1]\)
数
代入 \(c=2b-a\) 得 \(k=b(3b-4a)\),合法的 \((a,b,c)\) 对应 \(k\) 的一个分解 \(xy\)(\(b=x,a=\frac{3x-y}{4}\)),要求 \(x+y\equiv0\pmod4\land 3x>y\)(第一个要求保证 \(a\in\mathbb{Z}\),不难发现 \(c\in\mathbb{N_{+}}\) 已经自动满足)
设 \(k=u\times2^{v}\),\(u\) 为质数,要把 \(2^v\) 分给 \(x,y\)
- \(v=0\):\(u,v\) 均为奇数,\(x,y\) 分别 \(\equiv1,3\) 且 \(k\equiv3\),\(x=k,y=1\) 显然是一组合法解,因此 \(k\) 必须为质数
- \(v=2\) 或 \(v=4\):已经满足 \(x+y\equiv0\),因此 \(u\) 必须为质数或 \(1\)
- 否则:无解。
综上:合法的 \(k\) 为 \(4\) 或 \(16\) 或 奇质数 \(\times4\) 或 奇质数 \(\times16\) 或 \(\equiv3\pmod4\) 的质数。使用 min25 筛模 \(4\) 余 \(1,3\) 的质数个数即可(loj6027)
貌似可以直接打表,考虑质数与模 \(4\) 的余数得出,不过有一定难度