【省选模拟】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\) 变为对木棍左端点的限制。显然若存在方案,木棍左端点坐标可以为整数

梳理一下限制:

  1. 区间 \([l,r]\) 中最多 \(\lceil\frac{r-l}{k}\rceil\) 根木棍
  2. 区间 \([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)\) 扫描线)
  3. 区间 \([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\) 的余数得出,不过有一定难度

posted @ 2022-03-06 21:23  401rk8  阅读(138)  评论(0编辑  收藏  举报