终于打上 h 点模拟赛了兄弟们

A

手模一下可以发现,合法当且仅当 0 恰好形成左下到右上的格路

B

没有第 k 个必须选 x 的限制的话,设 fu,i 表示 u 子树内选 i 个点的方案数,树上背包即可,

考虑限制,可以发现只有 x 根链上的点受 x 的影响,

考虑从根到 x 依次填入根链上的每个点 u,以及 u 附带的不在根链上的子树,

gu,i 表示 u 的不在根链上的子树中选 i 个点的方案数,g 可以在算 f 时得到,

考虑从根到 x 转移,设 hu,i 表示考虑到 u 点,且填的最后一个根链上的点前有 i 个点的方案数,

考虑往下转移到 v,先考虑填不填 v,不填 v 的话 hu,ihv,i,填 v 的话 ji,hu,ihv,j

然后再考虑 v 的不在根链上的子树中选了几个点,有 i,j,hv,i×gv,j×(i+ji)hv,i+j

注意 x 必选。

C

DP 没啥前途,考虑线性规划,

xi 表示第 i 天去不去动物园,yi 表示见没见到第 i 只长颈鹿,

则问题可以写成线性规划:

maximizeyis.t.{yi1yij=lirixjxik

考虑线性规划对偶,设前 m 个限制对偶出的变量为 pi,中间 m 个为 qi,最后一个为 R

则对偶问题为:

minimizepi+kRs.t.{i,Rljirjqj0pi+qi1

可以发现一定取 R=maxi=1nljirjqj,pi=1qi

所以只需要规划 qi 使得 (1qi)+kmaxi=1nljirjqj 最小,

可以发现 qi 只能取 01,不妨把 qi 看成是否选了 i 区间,

(1qi) 就是没选的区间个数,maxi=1nljirjqj 就是被覆盖次数最多的点被覆盖的次数。

设选出的区间集合为 S,被覆盖次数最多的点被覆盖的次数为 c(S),则需要最小化 m|S|+kc(S)

考虑枚举 c(S),设 fi 表示 c(S)=i|S| 的最大值,则 k 的答案为 mini=0m(mfi+ki)

求出 f 后决策单调性分治/斜率优化/双指针即可求出答案,现在只需要求出 f

考虑递推 fifi+1,首先 f1 是普及组贪心,每次选能选的右端点最小的区间即可,

可以发现之后的 fi 也可以这样做,数据结构维护这个贪心过程即可。

A

对每个位置求出以其为中位数的极小区间(只有 4n 个),对这些区间 DP 即可

B

先枚举左右边界,然后对每个上边界暴力往下走的话复杂度是 O(n5)

可以发现,从上边界 u 往下最终走到 v 的过程中,若走到 t 时合法,则从 t+1 开始最终也会走到 v,可以记忆化,

对于不同 t 之间的位置 p,从 p 往下走不可能跨越 t,相当于递归到子问题,

所以加记忆化之后一轮的复杂度相当于从第一行扫到最后一行,总复杂度 O(n4),常数小可以过。

C

先容斥,答案是一种线覆盖的权值和减两种线覆盖的权值和加三种线覆盖的权值和,

第一部分平凡,第二部分扫描线+树状数组,考虑第三部分,

先考虑每条线都顶着边界的部分分,可以发现 x=k1,y=k2,xy=k3 三条线相交当且仅当 k1k2k3=0

则第三部分的答案为 k1k2k3=0k1k2,FFT 即可。

考虑有区间修改的情况,考虑把矩阵分成 B×B 的块,则每条线被拆成两个散线和 n/B 个整线,

考虑对每个块统计其内部的答案,先对整线 FFT,再依次加入每个散线,平衡一下可以做到 O(nnlogn)

发现瓶颈在对每个块 FFT/IFFT,而 FFT/IFFT 是线性变换,所以最后可以把每个块的点值加起来一起 IFFT,

现在瓶颈在 FFT 求每个块的点值,可以发现单点修改系数之后可以 O(B) 更新点值,

所以可以 O(nB) 递推出一行上每一块的行的多项式的点值,列、斜线同理,复杂度 O(nn)

A

考虑扫描列,扫到 i 列时维护 fx,i 表示到 xi 列的最短路,

首先 fx,i 可以由 fx,i1+x2,fx1,i+ci 转移,也就是说需要支持第 i 个位置加 i2 以及斜率和 cimin

归纳可证一列 f 是凸的,所以第二种转移会影响一个后缀,

考虑维护每个 fx,i 上一次用第二种转移的时刻以及转移起始位置,则做一次第二种转移需要对一个后缀推平这个信息,

用单调栈维护这个信息的颜色段即可。

B

1n 的链拿出来,考虑依次对每个点遍历其不在这条链上的子树,

(下面说的“u 的子树”都不考虑 u 在这条链上的子树)

考虑 DP,维护 fu,0/1/2 表示 u 子树内访问的(第一个,最后一个)点为(u,u)/(u,u 的孩子)/(u 的孩子,u 的孩子)是否可行,

(这里第一个点为 u 的孩子,最后一个点为 u 的方案可以由 fu,1 的方案反转得到,所以不用考虑)

转移略,自己手模

然后考虑把 1n 上每个点的方案依次拼起来,设 gi,0/1 表示做完前 i 个点,最后到 i / i 的孩子是否可行,

转移略,自己手摸

输出方案倒推回去即可

C

考虑扫描线,扫到 r 时维护 fi=W(i,r)

考虑 r1r 时所有后缀 MEX 的变化,首先 MEX 不等于 ar 的后缀的 MEX 不会变化,

而后缀 MEX 单调不增,所以 MEX 等于 ar 的后缀一定是连续的一段,

这些 MEX 应该更新为大于 ar 的若干段,根据颜色段均摊的分析产生的总段数是 O(n) 的,

所以拿个数据结构维护一下后缀 MEX,不断二分找出每一段即可,

考虑新产生的 MEX=d 的一段 [x,y]f 的贡献,只需要找出 MEX=d 的子区间扫到 r 之前最近在哪里出现,

维护 pd 表示 MEX=d 的子区间的左端点的最大值,则 [x,y]f 的贡献为令 [pd+1,y] 区间加一,

询问答案是 f 的历史和,把扫描线可持久化一下即可强制在线。

A

先枚举直角边的向量写一个 O(n2) 的暴力,然后分讨掉最值推一下式子即可 O(n)

B

考虑用 burnside 引理处理同构,考虑转 i 位的不动点需要满足的要求,

可以发现转 i 位不变的生成树需要有长度为 gcd(i,n) 的周期,分讨一下可以发现一个周期双射一个 gcd(i,n) 阶轮图的生成树,

现在只需要对轮图的生成树计数,根da据biao经fa验xian它是二阶线性递推,矩阵快速幂即可,

最后需要除以 n,可以发现 x/nmodm=x/nkm=(xkmn)/n=(xmodmn)/n

可能会卡常,预处理转移矩阵的(2 的幂)次幂,然后把矩阵乘矩阵改成向量乘矩阵即可。

C

O(2n) 用树上高消即可。

可以发现栈顶相同、总厚度相同的状态虽然答案可能不同,但是它们的子树是完全一致的,

所以不需要记栈中的元素集合,只需要记栈顶和总厚度,然后用之前的树上高消即可。

A

直接贪的话所有数都去后半部分了,显然不对,

对后半部分的每个数维护把它放到前半部分的贡献,每次把贡献为负的数放到前面即可。

B

考虑在树上 DP,每次选当前点的区间肯定是不行的,因为可以选到更低层的儿子间隔上,

不妨在 u 处统计选在 u 子树内的所有区间,设 fu,i,0/1,0/1 表示 u 子树内选了 i 个区间,且左、右有/无一个区间延伸进来,即可。

C

把每个树苗向其影响到的树苗连边,则询问答案为区间蓝点根链并编号小于等于 r 的部分的点数,

手模一下可以发现编号是逆 DFS 序,然后线段树维护一下 ajdkfjjflsjl

posted @   Jijidawang  阅读(71)  评论(7编辑  收藏  举报
相关博文:
阅读排行:
· 在鹅厂做java开发是什么体验
· 百万级群聊的设计实践
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
· 永远不要相信用户的输入:从 SQL 注入攻防看输入验证的重要性
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
历史上的今天:
2024-02-20 P3712 少女与战车 题解
点击右上角即可分享
微信分享提示