\[\mathbb{Defining~\LaTeX~macros\dots}
\newcommand{\addeq}[0]{\overset{+}{\gets}}
\newcommand{\vct}[1]{\boldsymbol{#1}}
\]

0.「集训队互测 2018」「洛谷 P9248」完美的集合

  和希望一样的东西, 对 \(x\) 形成的连通块做点减边容斥. 此后, 我们需要对于一个根 \(r\), 求出包含 \(r\) 的集合信息. 这个集合信息是一个背包信息, 自然想到规避背包合并的 DFN DP. 做做就完了, 求一个 \(r\) 的答案是 \(\mathcal O(nm)\) 的.

  求出全局最大权值, 在枚举每个根算方案数. 其中需要用到组合数, 这里需要一个 ex-Lucas 的变形.

  • Ex-Lucas (\(m=p^k\), \(m\) 极大, \(p\) 极小).

  还是和正常 ex-Lucas 一样, 难点在于算 \(n!\) 除去 \(p\) 因子的结果. 我们知道

\[n!/p^{w_p(n!)}=(n/p)!/p^{w_p((n/p)!)}\prod_{i=1,p\notin i}^ni.
\]

后者仍然类似阶乘, 所以可以用类似快速阶乘算法的东西算. 令 \(f_n(x)=\prod_{i=1,p\notin i}^n(x+i)\), 则 \([x^0]f_n(x)\) 是答案. \(x\) 的引入让位移倍增得以实现:

\[f_{2kp}(x)=f_{kp}(x)f_{kp}(x+kp).
\]

复合过程可以暴力进行, 因为本题 \(m=5^{23}\), 只需要保留次数低于 \(23\) 的系数. 最后 \(\mathcal O(p)\) 个剩下的东西暴力算就行. (\(m=p^k\), \(p\) 视为常数的语境下) 复杂度 \(\mathcal O(w^2\log^2n)\).

  因此, 本题复杂度 \(\mathcal O(n^2m+nw^2\log^2(2^n))=\mathcal O(n^2m+n^3w^2)\), 其中 \(w=23\).

1.「UR #6」「UOJ #74」破解密码

  \(h_i\times26-h_{i+1}=(26^n-1)t_i\), 若 \(p\mid(26^n-1)\), 旋转后的关系恒成立, 只需要求 \(h_0\) 的在 \(26\) 进制下的串 (\(p\le26^n-1\), 一定存在); 否则可以直接解出所有 \(t\). \(\mathcal O(n)\).

2.「NOI Simu.」苯为

  我们只关心最终大基环树的环长, 环长又由 \(d(s,t)\) 确定, 设 \(F(z)\) 为树上路径数量关于路径长度的 GF, 那么

\[\begin{aligned}
\textit{ans} &= \sum_i[z^i]F(z)\cdot(k-1)^{(n-i-1)m}((k-1)^{(i+1)m}+(-1)^{(i+1)m}(k-1))\\
&= \sum_i[z^i]F(z)\cdot(k-1)^{nm}+\sum_i[z^i]F(z)\cdot(-1)^{(i+1)m}(k-1)^{(n-i-1)m+1}\\
&= (k-1)^{nm}F(1)+(-1)^m(k-1)^{(n-1)m+1}F((1-k)^{-m}).
\end{aligned}
\]

数路径是 \(\mathcal O(n\log^2n)\) 的, 但 GF 代入了 \(z\) 值就变成 一个数啦, 像数路径一样点分治就 OK.

3.「NOI Simu.」西克

  也许复杂度正确的算法很好想, 但咱毕竟是写代码竞赛对不对? (

  从下到上很简单, 随便倍增一下就行. 从上到下的话, 涉及到在儿子处划分许多询问的去向. 自然的想法是启发式分裂, 但这玩意儿确实不好写. 一个巧妙的一点的算法是撤销并查集, 对询问维护并查集, 并维护每个颜色的代表点, 这样可以完成进入结点时对颜色的合并. 我们没有分裂合并对询问的影响, 但只需要在出子树的时候把这些影响撤销掉就好, 反正被非法影响到的询问都在子树外, 不会被问出错误答案. 复杂度都是 \(\mathcal O(n\log n)\) (\(n,q\) 同阶).

4.「NOI Simu.」尼特

  • Private link | 胡!
  • 「A.数学-生成函数」「B.Tricks」

  直觉上, 我们只需要 \(a_i\overset{?}{=}a_{i+1}\) 这个信息, 不妨令 \(k_i=[a_i=a_{i+1}]\). 若随机串已知, 我们会从右到左依次枚举空格求答案, 每次答案的变化量在 \(\{-1,0,+1\}\) 中, 转化到网格图上, 就是从某个 \((0,y_0)\) 出发, 走 \(n\) 步, 求折线的最高纵坐标的过程. \(k_i=1\) 时过于平凡, 我们只需要讨论 \(k_i=0\) 的情况.

  令 \(f(i,j)\) 表示放了 \(i\) 个箭头, 折线最高点与当前位置高差为 \(j\) 的方案数; \(g(i,j)\) 表示放了 \(i\) 个箭头, 折线最高点与当前位置高差为 \(j\) 的折线线最高点坐标之和. 那么:

\[f(i+1,0)=(m-1)f(i,0)+f(i,1),\\
g(i+1,0)=(m-1)g(i,0)+f(i,0)+g(i,1);\\
f(i+1,j)=(m-2)f(i,j)+f(i,j-1)+f(i,j+1),\\
g(i+1,j)=(m-2)g(i,j-1)+f(i,j-1)+ g(i,j+1).
\]

令 \(F_i(z)=\sum_jf(i,|j-i|)z^j\), \(G_i(z)\) 同理 (这里比较 tricky), 那么

\[F_{i+1}(z)=(1+(m-2)z+z^2)F(z),\\
G_{i+1}(z)=F_i(z)+(1+(m-2)z+z^2)G_i(z).
\]

观察到

\[G_n(z)=nF_{n-1}(z)=n(1+(m-2)z+z^2)^{n-1}.
\]

  回到原问题, 我们需要对常数 \(c\) 求出 \(G_c(z)\) 的各项系数. 这里用 \(A(z)=B^k(z)\Rightarrow\frac{A'(z)}{A(z)}=\frac{kB'(z)}{B(z)}\) 对比系数即可. 复杂度 \(\mathcal O(n)\).

5.「UR #6」「UOJ #75」智商锁

  这是一道很 "OI" 的构造题, 比较容易创死喜欢数理上构造答案的生物. (

  题解倒是很简单: 随机 \(10^3\) 个含 \(12\) 个结点的图 (每条边以 \(0.5\) 的概率存在), 矩阵树求出生成树数量, two pointers 查询四棵树 \((A,B,C,D)\), 使得 \(c_Ac_Bc_Cc_D\equiv k\pmod P\) 即可.

  真敢呐.

6.「UR #7」「UOJ #82」水题生成器

  狭路相逢, 勇者胜! 每次从 \(n\) 到 \(1\) 枚举因子乘到减数上, 迭代, 过之. 正解是把阶乘进制倒过来算, 嗯嗯.

7.「NOI 2011」「洛谷 P1971」兔兔与蛋蛋游戏

  二染色, 发现兔兔只可以将空格移到与初始位置异色的白子上, 蛋蛋同理. 不满足要求的棋子视作障碍, 移动后的棋子也是障碍, 那么这就变成了一个网格图上简单路径问题. 判定胜负得到解决: 检查是否存在除开起点的最大匹配.

  移动的话, 就增量地尝试修改匹配就行, \(\mathcal O(nmk)\). (虽然一不小心发现每次暴力匈牙利也能过.)

8.「BJOI 2018」「洛谷 P4428」二进制

  哪来那么无聊的题… 显然区间非法条件是:

  • 仅存在一个 \(1\);
  • 存在奇数个且大于一个 \(1\), 但存在至多一个 \(0\).

  然后 DDP 就行. \(\mathcal O((n+q\log n)w^3)\), \(w\) 是矩阵大小, 目测没什么特别优美的矩阵构造.

  呃啊… 这东西写着真的讨厌. 我的写法是一个 \(4\times4\) 的矩阵算满足前一个条件的区间, \(6\times6\) 的矩阵算满足后一个条件的区间, 一车 BIT 维护同时满足两个的区间, 容斥容斥. 带着一堆 template 倒是也不难写.

9.「NOI 2012」「洛谷 P2179」骑行川藏

  属实没想到这个冷门 tag 会迎来第二题. 显然令总耗能恰好为 \(E\) 最优, 引入这一限制的辅助元 \(\lambda\), 则

\[y=\sum_{i=1}^n\left(\frac{s_i}{x_i}+k_is_i(x_i-v_i)^2\lambda\right)-E.
\]

导之,

\[\frac{\part y}{\part x_i}=-\frac{s_i}{x_i^2}+2k_is_i(x_i-v_i)\lambda=0\\
\Rightarrow 2k_ix_i^2(x_i-v_i)\lambda=1.
\]

  注意下面这个三次方程的一阶导恒正, 因此我们并不需要学会解三次方程, 可以直接二分求 \(x_i\) 的数值解. 另外也可以观察到 \(\lambda\) 与实际 \(E\) 负相关, 所以外层二分一下 \(\lambda\) 即可. 二分的界就… 随便编吧. \(\mathcal O(n\log^2 V)\), 洛谷的数据对精度和范围的要求似乎比 LOJ 弱很多.

  好像上一道这个 tag 的题也是二分 \(\lambda\) 控制合法性, 看来这个 trick 可以留意一下喵.

10.「UR #7」「UOJ #83」水题出题人

  Subtask 1 (merge vs counting) 只需要一个大数, counting 就飞了.

  Subtask 2 (bubble vs selection) 这俩复杂度一样, 但观察代码发现 bubble 的 swap 常数是 \(3\), selection 的交换常数是 \(2\), 我们不能让后者超过前者, 那就索性给一个有序序列! 当 \(n=1990\), 序列有序时, selection 的次数是 \(1998959\), bubble 的次数是 \(1985028\), 但我不能再增大 \(n\) 了, 看来还是需要引入交换. bubble 还能支撑 \((1986591-1985028)/3=521\) (今天的日期 w) 次 swap, \(521\times 2\) 次操作刚好可以让 selectoin T 掉! 我们只需要引入这 \(521\) 次 swap 即可.

  Subtask 3 (merge vs quick) 你这快排有点假啊? 我们尝试每次把区间最值放在区间中点, 这样没有随机化的快排就成为尸体了. 具体来说, 每次我们一定是把区间中点换到左端点 (假设中点是最小值), 其他的不变, 这样 \(l=1\sim n\) 模拟一遍, 安排初始位置即可. 当然对 merge 的要求也很死, 手动二分 (迫真) 一下取 \(n=1984\) 刚好满足条件.

  Subtask 4 (counting vs bubble) 肯定是一个降序序列, 为为了节约 counting 的枚举, 我们猜测序列形如 \(a\) 个 \(b-1\), \(a\) 个 \(b-2\), …, \(a\) 个 \(0\), 尝试后发现 \(a=b=32\) 的时候刚好杀掉 bubble, 但 counting 超了一点点. 于是又尝试 \(a=32\), \(b=31\), 最后补充 \(r\) 个 \(0\). 又一次手动二分后发现 \(r=20\) 刚刚好卡满 counting 的要求, 同时干掉了 bubble.

  Subtask 5 (selection vs bubble) 刚刚嫌弃 bubble 常数大, 现在又觉得它常数不够大喵. 我们得构造一个最小值更换次数小但逆序对数大的序列. 一个可行的构造是令 \(f(l,r)=\lang p\rang+f(p+1,r)+f(l,p-1)\), 其中 \(p=(l+r)/2\), 这样 selection 的交换次数是 \(\mathcal O(n\log n)\) 的, 而逆序对仍然是 \(\mathcal O(n^2)\) 的. 取 \(f(0,1002)\) 即可.

  Subtask 6 (bogo vs quick) 多少有点荒谬了, 我们势必要去研究 bogo 的随机数生成器的特殊性质. 可以发现, RNG_aRNG_b 的最低 bit 都是 \(1\), 但次低 bit 却很大, 因而当 \(n=2^k\) 时, 第一次排序过程生成的下标是连续自然数! 不妨取 \(n=2^{12}\), 我们先枚举一个目标 seed, 反向模拟 bogo 的操作还原初始序列, 然后检查 quick 会不会 T. 一组能够卡掉 quick 的数据是 \(\textit{seed}=2^{11}\). 接下来只需要构造一个相对顺序不变, 生成目标种子的序列, 暴力循环把 \(>a_{n-1}\) 的数 \(+1\), 计算为了达到种子, \(a_{n-1}\) 的理论取值, 检查是否符合条件即可. 带着 -O2 只需要大概 \(0.4\text s\) 出解, 可行的增量是 \(75883\).

11.「AGC 062A」Right Side Character

  首先, 全 A 和全 B 的串可以先判掉. 否则手玩一下发现有 BA 子串就剩下 A, 否则剩下 B.

12.「AGC 062B」Split and Insert

  令原题中 \(k\to m\). 大概就是考验一个讲故事能力. 第一步转化自然是倒序操作, 现在每次操作可以把 \(p\) 的一个子序列拉到最后, 要求 \(m\) 步以内将 \(p\) 排序. 我们可以把 \(p\) 划分为若干个连续上升的自然数序列, 那么每次操作可以将若对不交的序列合并. 设这些序列从大到小排列后长度为 \(w_1,w_2,\cdots,w_k\),令 \(f(l,r,t)\) 表示用前 \(t\) 步合并完 \([l,r]\) 的最小代价, 转移有

\[f(l,r,t)=\min_{i\in[l,r)}\left\{f(l,i,t-1)+f(i+1,r,t-1)+c_t\sum_{j=l}^iw_j\right\}.
\]

  \(\mathcal O(n^3m)\) 结束.

13.「集训队互测 2015」「UOJ #91」最大异或和

  这题突破口大概是数据范围? 就算只有一次询问, 我们也得 \(\mathcal O(nm^2/\omega)\) 地插一个线性基出来, 这个已经把复杂度卡满了!

  因此, 被迫排除所有数据结构的维护手段, 我们想起一个线性基上的经典题目: 静态区间 xor 最大值. 在那道题中, 通过保留存活时间最长的向量, 我们仅仅进行了 \(\mathcal O(n+q)\) 次线性基操作, 非常合适啊! 可惜, 本题的一次修改就会改变 \(\mathcal O(n)\) 个向量, 我们没有办法直接迁移过来.

  记得这篇的 #8 中, 我们通过相邻向量相加的方式处理了 "选偶数个", "相邻向量相加" 而几乎不改变空间状态, 但可以几乎消除所有改动! 具体地, 我们暴力维护初始向量列 \(\{\vct a\}\) 和 \(\vct d_i=\vct a_i+\vct a_{i-1}\) (\(\vct d_1=\vct a_1\)). 不难发现两组向量的张成空间相同, 所以提供的答案应当相等.

  考虑修改, 区间加变成两个单点加, 区间赋值变成了单点加和区间赋 \(\vct 0\), 我们没有必要把一堆 \(\vct 0\) 引入空间, 所以对 \(\vct 0\) 打上标记后可以均摊掉区间赋 \(\vct 0\) 的修改次数. 最终, \(\{d\}\) 只发生了 \(\mathcal O(q)\) 次有效变动, 把变动挂在时间左端点, 右端点做扫描线, 这样就转化成静态 xor 最大值了. \(\mathcal O((n+q)m^2/\omega)\).

14.「集训队互测 2015」「UOJ #93」上帝之手

  所以说啊, 抓住魔法的本质, 忘记魔法的禁忌, 敢想敢用. (?

  这题看上去非常吓人, 仔细分析一下却发现前两个询问多少都在虚张声势: 第一问, \(c\in[a,b]\) 的答案显然是单调不降的, 我们可以直接确定需要询问哪个位置. 先来解决单调询问, 注意到每一天对混乱度的变化形如 \(\varphi_i:x\mapsto\min\{x+a,b\}\), 这个函数在复合作用下形式不会改变, 所以线段树维护即可.

  第二问, 我们尽量不让 \(x_0\) 被取 \(\min\). 线段树二分出 \([a,b]\) 内最后一个 \(\ell_i\le x\), 从这个位置放 \(x\) 向后走即可.

  第三问, 利用答案单调不降的性质, 我们只需要求出 \(c\in[a,b]\) 答案变化 (增大) 的次数. 怎么数一个不降序列的段数? 可以发现这和楼房重建维护 LGIS 的 trick 很像, 每次先递归右区间, 求答案的同时顺便求出后缀函数复合的结果, 检测左区间哪一段后缀在变化后和右区间前缀会合成一段, 递归检查即可. 这里复杂度是 \(\mathcal O((n+m\log n)\log n)\), 前两问的复杂度都是 \(\mathcal O(n+m\log n)\).

15.「集训队互测 2015」「UOJ #92」小树苗与集合

  • Link | 口胡惹, 写答辩还得看 crashed.
  • 「A.数据结构-可持久化平衡树」

  先考虑树上问题. 点分什么的太难啦! 我们整点直观的: 对于 \(u\) 子树, 维护两棵平衡树. 第一棵维护以到 \(u\) 距离为键值的由树上结点 (以及用来描述平衡树子树的虚点) 构成, 第二棵维护以到 \(u\) 之后还能走的距离为键值的由询问结点 (以及用来描述平衡树子树的虚点) 构成. 在树根合并的时候, 我们需要模拟两棵值域可交 treap 的合并, 这里每次拿高优先级的 treap 根 split 另一棵 treap 然后递归就行, 期望复杂度是被证明达到理论下界的.

  仙人掌? 我们只需要处理环上 treap 间的交叉连边问题. 这个? 似乎? 线段树? 点和边都是 \(\mathcal O(n\log n)\)? 从 wys 论文的字里行间胡出来这个意思. 反正咱不写代码, 重点放在前面部分就行了. (

Solution Set - “我献上明月一盏,照满河山”的更多相关文章

  1. 献上一款漂亮的手写PHP验证码

    献上一款漂亮的PHP验证码,可以根据个人需求作调整,代码如下(审美观不同,欢迎吐槽): <?php /** * Author: xiongwei * Email: 695704253@qq.co ...

  2. netty的调优-及-献上写过注释的源码工程

    Netty能干什么? Http服务器 使用Netty可以编写一个 Http服务器, 就像tomcat那样,能接受用户发送的http请求, , 只不过没有实现Servelt规范, 但是它也能解析携带的参 ...

  3. 献上两个java小算法

    直接上代码: /** * Name: 求数组中元素重复次数对多的数和重复次数 * Description: * 数组中的元素可能会重复,这个方法可以找出重复次数最多的数,同时可以返回重复了多少次. * ...

  4. 十多位全球技术专家,为你献上近十个小时的.Net微服务介绍

    .Net Conf: Focus on Microservices 是 .Net Conf 社区在 2020 年 7 月 30 日举办的线上分享活动.整个活动视频长达近 10 个小时.今天我们来看看都 ...

  5. 2016年4月1日下午,《java入门123》翻开了第一页,从此走上不归路。新手初来乍到,献上见面礼

    package copyfile; import java.io.File;import java.io.FileInputStream;import java.io.FileOutputStream ...

  6. SCUT - 15 - 为美好的世界献上爆炎 - dfs

    https://scut.online/p/15 样例错了,按题目说的去做就AC了. 反向搜索使得最终比较strncmp的时候复杂度下降了很多(虽然应该可行性剪枝也少了) #include<bi ...

  7. 线上服务器TCP被打满是啥情况

    从一个线上服务器警告谈谈backlog https://wangxiangnan.cc/?p=105 缘起 双十一如期而至,此时的我因为在处理客户的一个问题已经陷入了忙碌.突然,不断接到驻场实施发来的 ...

  8. Linux堆内存管理深入分析(上)

    Linux堆内存管理深入分析(上半部) 作者:走位@阿里聚安全   0 前言 近年来,漏洞挖掘越来越火,各种漏洞挖掘.利用的分析文章层出不穷.从大方向来看,主要有基于栈溢出的漏洞利用和基于堆溢出的漏洞 ...

  9. java编写一个可以上、下、左、右移动的坦克

    唉,本人学习进度缓慢,但依然会坚持不懈!有感兴趣的朋友可以在下面留言. 源代码献上: /* * 画出我的坦克,使他可以上下左右移动 */package com.test4; import javax. ...

  10. iOS移动下上传图片失败解决 (上传多图,带其他参数)

    项目中有一个主要的功能,就是上传图片,结结果移动真的是很奇怪,WiFi,联通,电信都没有问题的情况下,居然在移动下不行,真的是很头疼.不过好在最后是解决了 项目的网络请求我是采用ASIHttpRequ ...

随机推荐

  1. SaaS多租户的3种隔离模式

    大家好,我是汤师爷~ 在SaaS模式下,多租户之间的资源隔离是基础且关键的一环.SaaS服务商需要在确保运营效率和控制成本的前提下,搭建一个让多个租户能够同时访问的共享环境. 虽然大家都在用同一套Sa ...

  2. 使用 FastGPT 工作流搭建 GitHub Issues 自动总结机器人

    如今任何项目开发节奏都很快,及时掌握项目动态是很重要滴,GitHub Issues 一般都是开发者和用户反馈问题的主要渠道. 然而,随着 Issue 数量的增加,及时跟进每一个问题会变得越来越困难. ...

  3. Rust 版本一直是 1.4 或者其它版本

    Rust 版本一直是 1.4 或者其它版本 通过rustup update 升级或者 rustup default 设置版本也不行 解决方法 删除 rust-toolchain 这个东西,这个东西覆盖 ...

  4. docker REPOSITORY 改名

    创建新的名称: docker tag oldname:tag newname:tag 删除旧的名称: docker rmi oldname:tag

  5. 应届生必看!23 个高质量 C++ 项目推荐,校招简历秒加分

    大家好,我是小康. 最近,不少同学私信我,临近毕业忙着找工作,想问有没有推荐的 C++ 项目,既能练手又能让简历更出彩.我也想起自己当年毕业时同样的焦虑,知道作为 C++ 后端开发的求职者,有几个实际 ...

  6. Java8之新特性

    简单例子 实例: ​ 处理集合时,通常会迭代遍历它的元素,并在每个元素上执行某项操作,例如假设我们想要对某本的所有长单词进行计数,首先需要将所有单词放到一个列表中 var contents = new ...

  7. 【一步步开发AI运动小程序】十三、自定义一个运动分析器,实现计时计数02

    随着人工智能技术的不断发展,阿里体育等IT大厂,推出的"乐动力"."天天跳绳"AI运动APP,让云上运动会.线上运动会.健身打卡.AI体育指导等概念空前火热.那 ...

  8. MySQL 主从复制之多线程复制

    目录 一.MySQL 多线程复制的背景 二.MySQL 5.5 主从复制 1.原理 2.部署主从复制 2.1.主节点安装配置MySQL 5.5 2.2.从节点安装配置MySQL 5.5 3.检查主从库 ...

  9. The Bento Box Adventure

    题目来源:codeforces 2041A 题目名称:The Bento Box Adventure 题目链接:https://codeforces.com/contest/2041/problem/ ...

  10. Web实时消息推送的解决方案

    什么是消息推送(push) 推送的场景比较多,比如有人关注我的公众号,这时我就会收到一条推送消息,以此来吸引我点击打开应用. 消息推送(push)通常是指网站的运营工作等人员,通过某种工具对用户当前网 ...