Live2D

Solution Set - 神奇 NOIP 模拟赛

Defining LATEX macros...

  2021.10.29.

  「A. 莓良心」 给定 {wn},对于所有将其划分为 k 个非空集合的方式,求 wi×(wi 所在集合大小) 之和的总和模 998244353 的值。n106

  考虑算每个 wi 的贡献次数,首先 wi 自己算一次,{nk};任意 jiwjwi 放一次时贡献一次,(n1){nk1}O(n) 算第二类斯特林数单点值即可。


  「B. 尽梨了」 给定 {(a,b)n},初始时 t=0,每次选一个未选过的 i,令 t(ai+1)(t+1)+bi,需要保证此时 tm。求最多能选择的次数。n2×105m109

  交换贪心可知确定要选的集合时最优的选取顺序,依此排序后,问题变为从其中依次取子序列。注意到 a=0 的必然最后选,且按 b 从小到大选;a0 每次选择至少有 t2(t+1),对于这种情况直接 DP,最后考虑 a=0 即可。复杂度 O(nlogm)


  「C. 团不过」 有求 n 堆有标号石子堆,每堆石子数量在 [1,2n) 且不存在两堆相同数量石子堆时,Nim 先手必胜的方案数。n107

  令 fi 为仅考虑 i 堆石子的方案数,显然可以通过下降幂、fi1fi2 进行转移。复杂度 O(n)


  「D. 七负我」 给定无向图 G,给每个结点赋非负实数权值 ai,使得 ai=x,最大化 (u,v)Eauavn40

  调整法证必然有一种方案,ai>0 的结点的导出子图是团,团内部的最优决策显然是平均分点权(可以不等式或者口算一下拉格朗日乘子法),继而发现取最大团最优。这里直接 Meet in Middle 求最大团即可。复杂度 O(2n2n)




  2021.10.30.

  「A. 特殊字符串」 水。


  「B. 宝可梦」 给定一个 n×m,有墙或空地的迷宫,保证空地在四联通意义下构成树。接下来 q 组询问,每次给定起点,第一步方向(保证不撞墙)和终点,求从起点摸着右手的墙走,需要走多少步到终点。nm5×105q105

  分析清楚题意后,直接拆四个点建图。注意到可能作为起点,或者可能是中间过程的点必然是两两可达的,所以图是一整个环,在环上随便写写就行。

  Attention. 图在具体题目的具体性质分析清楚再动手,直接搓一个基环树森林的做法太浪费时间了。


  「C. 矩阵」 给定 n×m 的矩阵 A,找一条四联通意义下的路径,使得依次经过的元素构成等比序列,或声明存在长度无穷大的路径。nm,ai,j4×104

  先判掉无穷大,之后枚举第一步然后记忆化搜索可以做到 O(nmlog2a),或者 DP 一下可以做到 O(nm)


  「D. 乘法」 求十六进制下 n! 除去末尾 0 后的最后 16 位。n<264,多测 T10

  先求出 n! 含因子 2 的个数,接下来要求出

if(n2i),

其中 f(n)=(n[2n])!!,问题转化为求双阶乘。令 Fn(x)=i<2n,2i(2x+i),那么 Fn(0)=(2n1)!!,且 F2n(x)=Fn(x)Fn(x+n),注意到当次数 k>63[xk]Fn(x)=0,所以可以暴力卷积。在二进制扫描 n 的同时倍增,可以做到 O(Tlog3n)




  2021.11.01. 总之就是四道傻瓜题。

  「A. 集合均值」 水。


  「B. 聚烷撑乙二醇」 水。但出题人不写浮点比较 SPJ 还卡精度。


  「C. 技术情报局」 给定 {an},求 [l,r](maxi=lr{ai})(i=lrai),序列随机,模给定数 Mn107

  单调栈 O(n) 嘛,我告诉你能做就肯定能做的啦~


  「D. 肯德基」 求 i=1nμ2(i)in1014,数据组数 T100

  容斥,答案显然是

i=1nμ(i)S(n/i2)i2,

其中 S(n)=n(n+1)2。发现可以用 i2n 进行整除分块。复杂度方面,当 in13,仅有 O(n13) 个取值;当 i>n13,有 ni2n13,也仅有 O(n13) 个取值,所以分块复杂度为 O(n13)。总复杂度即 O(n+Tn13)




  2021.11.02.

  「A. 按位或」 求序列 {xn} 的个数,满足 3xii=1nxi=t。答案模 998244353n,t1018

  不太签到的题。联想十进制下 mod 3 的结论,发现 3xi 等价于从最低位起,相邻两个 bit 为一组,各组数值之和是 3 的倍数。容斥没有满足或起来为 t 的 bit 组计数即可。


  「B. 最短路径」 给定一棵含有 n 个点的树,以及其中一个大小为 m 的关键点集 S。对于 S|T|=k 的子集 T,求依任意次序遍历过 T 中所有结点的最短路径长度的期望。答案模 998244353n2×103m300

  遍历 T 的最短路径长度显然是 T 的虚树所含边数 ×2 减去 T 的树上直径,分别计数。对于边数,枚举边,求这条边两侧都有关键点的方案数;对于直径,令 d(u,v) 表示 u,v 的树上距离,对于路径 D(u,v) 定义一个严格偏序关系:

D(u,v)<D(x,y)d(u,v)<d(x,y)(d(u,v)=d(x,y)(u,v)>(x,y)).

其中 (u,v)>(x,y) 指一般的二元组偏序关系,当然也可以替换成方便区分的其他式子。在此基础上,可以证明对于 D(u,v),若不存在 w 能够使 D(u,w)>D(u,v)D(v,w)>D(u,v) 变大,则 D(u,v) 是直径。枚举直径 D(u,v),求出无法更新直径的点集 {w},剩下的 k2 个关键点都取自 {w},组合算贡献。

  为什么我忽略了边数和直径可以拆开算啊……


  「C. 仙人掌」 给定一株仙人掌,求其邻接矩阵的行列式。n105

  等价于边匹配,得到的排列中,二阶轮换的贡献是 1,其余 k 阶轮换的贡献是 2×(1)k1。圆方树 DP 即可。


  「D. 对弈」 Cover「SDOI 2011」黑白棋。我不会,但是




  2021.11.03 @ LOCAL/20211103/

  「A. 鲜血之女王」 水,不过赛时无脑 DP 压根没证正确性(虽然过了。


  「B. 撤离」 求排列 {pn} 冒泡排序恰好进行 k 次 swap 后得到的排列。n106

  我真的做过这道题吗? 我会求进过完整 t 轮后的交换次数,也会求到经过完整 t 轮后得到的排列,而一轮最多 swap O(n) 次,所以在这个排列的基础上再模拟一轮冒泡即可。


  「C. 闪蝶」 水,线段树维护 GF 板题(但是选手不得试图使用生成函数。


  「D. 缘分的天空」 给定一棵含 n 个结点的树,对于 k=0,1,,n1,求随机切树上 k 条边得到的森林中,每棵树所含结点数量的平方之和的期望值。答案模 (109+7)n105

Ek(|T|2)=E[(u[uT])2]=E(u[uT]2)+2E(uv[uT][vT])Ek(i|Ti|2)=n+2uv[path(u,v)Gk]=n+2(n1)k_l=1n1cl(n1l)k_.

其中 cl 表示原树上长度为 l 的路径条数。若能求出 {c},可以发现这个式子是差卷积:

Ek(i|Ti|2)=n+2(n1)k_l=0kcl(n1l)!1(n1lk)!.

  好吧其实难点是实现,求 {c} 可以 DSU 或者点分,但得写多项式卷积。注意路径条数不超过 n2,所以可以写模 long long 的 NTT。但是最后这个卷积是真的没办法——只能写 MTT。总之吧我一份代码写了 MTT + NTT,常数大概是标算的 0.2 倍叭。但是有 9K 的码量




  2021.11.04.

  「A. 谜之阶乘」 水。


  「B. 子集」 将 1n 划分为 k 组,每组大小相等且数字和相等。多测,n106

  每组大小是偶数显然;若是奇数,尝试先用一些数组把每组大小填充成偶数。观察样例并打表发现可用 13k 填每组前 3 个,具体构造方法多种多样(我懒得描述了√


  「C. 混凝土粉末」{an} 初始全为 0q 次操作,区间加,询问某个 ai 最早什么时候 hn,q106

  对不起两个 log 无脑整体二分能操过。 离线下来,在序列上做扫描线,在时间轴上维护 BIT 或线段树,树上二分求答案,即可做到单 log


  「D. 排水系统」 挺可爱的题 w。我的题解




  2021.11.05.

  「A. 回文」 给定字符矩阵 {Sn×m},求从 (1,1) 出发走到 (n,m) 且只向下或向右走的所有路径中,依次经过的字符形成回文字符串的路径数量。n,m500

  明显只能从起点和终点同时 DP。f(i,j,k) 表示起点终点各走 i 步,起点走到第 j 行,终点走到第 k 行,当前行走路径字符串对称的方案数。讨论一下转移,滚掉第一维状态就行了。


  「B. 快速排序」 水。


  「C. 混乱邪恶」 给定 A{1,2,,m}|A|=n(2m3,m]。求 ST=A,ST=,且 aSa=bTbm106

  要看出这是道构造题而非乱搞题就很难啊喂。 如果 n 是奇数,令 AA{0}。将 A 的元素升序排列后,令 di=a2ia2i1,我们尝试用 {dn/2} 来构造等和。(为什么想到两两捆绑?这就是传说中构造题的 movitation?)

  观察 {dn/2} 的性质:idimn2<n(利用题设性质,太 tm 妙啦),即至少有一个 di=1。接着归纳构造:

  • di=1,由于 2idi,必然有解;

  • 否则,将 {d} 中最大值和最小值(必为 1)取出,将它们的差值返还。

  这个方法显然是很厉害的。


  「C. 校门外歪脖树上的鸽子」 给定一棵维护序列长度为 n,随便划分区间的线段树,支持 m 次区间加或查询区间和操作。但是标记不下传。n,m2×105

  左右加哨兵,变成类似 ZKW 线段树的形式,修改查询都类似于走一条路径,修改/统计某侧儿子的贡献,所以你永远可以相信 毛毛虫剖分




  2021.11.06.

  「A. 破门而入」 水,但有个傻子拿 EGF 推出式子准备开始写暴力卷积的时候发现这是第一类 Stiring 数。


  「B. 翻转游戏」 从读完题到证完结论不到 30s.jpg。


  「C. 奶油蛋糕塔」 总不能看不出是欧拉路吧,但有个傻子状压连通性+状压度数奇偶性大力 DP WA 了。😅


  「D. 多重影分身之术」 建议换道题放 T4。

  我敲?这就是今天的题解吗?!




  2021.11.07. 总之就很辣鸡。




  2021.11.08. 今天是 Yet another NOI Professional Simulation。(

  「A. NOIP 2018」 水。


  「B. CSP 2019」 给定 n 阶矩阵 A 和列向量 bT 次询问,每次询问给出 k,求 mod2 意义下的 Akbn,log2k2×103

  取 A 的特征多项式 p(x)=|xIA|,由 CayleyHamilton 定理,p(A)=0。令

r(x)xk(modp(x)),

那么 Ak=r(A)+kp(A)=r(A)。而 degr=O(n),考虑答案形式为 iriAib,可以预处理 Aib快速求解。

  写不来,全程口胡。


  「C. CSP 2020」 定义正整数 x 的拆分是数列 {tk},满足 ti{0,1,,9},t=x,此时将 t 依次写下作为一个十进制数 vx。现给出 m,对于 n=1,2,m,求 n3 的所有拆分得到的 vn3 去重并升序排序后的第 n4 个数。答案模 p(不保证为素数)。m103

  注意到成为答案的 vx 应有 log10vxx9。因为在 a999¯ 中选若干个 9 减去 1,令 a 加上减去的总和,这一方案数的规模远大于 n4

  回到题目,这种题惯用手法是确定位数,再从高到低枚举,用方案数判断当前位的取值。预处理约 n1.5 范围内的方案数,对于超过该范围的方案,组合数的快速增长让我们可以快速判断与需求方案数的大小关系。最后,只特判后导 9 的起始位置即可。总复杂度为 O(m2.5)


  「D. NOIP 2021」 对于素数 p=4324321=25×33×5×7×11×13+1,取其原根构成的序列 {g0,g1,,gm1} 作为密钥,对于明文串 S,定义加密 sigimodmsimodp。现给出 m 和密文 S (|S|=n),解出明文 Sm10540mn50m5×106。保证明文是有意义的英文段落,si 是大小写字母以及 {' ','.',',','?','!','-','"',''',':','(',')',';'} 中的一个。

  任取一个 p 的原根 r,令 gi=rαi,显然 αiφ(p)。那么 s=gisIndrs=αisIndrs 是可求的,我们枚举 s,解同余方程就能够得到若干可能 αi,用 αi 尝试解密一些 s 即能判断合法性,考虑到对于错误的密钥,解出字符在字符集内的概率极小,视为 O(1)。现在就几乎能完成解密了,不过很卡常。

  联系 S 是英文文段以及生活实际,猜测一些字符在至少 40 个位置中必然出现,关键问题是找到方便后续计算的字符。注意到 αiφ(p),即 gcd(Indrs,φ(p)) 完全来自 s。注意到 s{i,h,n,l,u,p,c} 时恰整除 φ(p);当 s=' ' 时,s 的倍数全为非法字符。所以直接考查 Indrs 对于它们的整除性即可。

  看什么看,我写 T 了。




  2021.11.10.

  「A. 开挂」 水。


  「B. 叁仟柒佰万」 水。


  「C. 超级加倍」 给定一棵树含 n 个结点的树,求路径 (u,v) 的数量,使得 uv,且 u 是路径经过结点中标号最小的,v 是路径经过结点中标号最大的。n2×106

  我是不是傻 qwq。 点分治?我想我优化不动二维偏序。而注意到树上最大最小,应该联想到笛卡尔树。建出大根笛卡尔树和小根笛卡尔树,那么 (u,v) 合法当且仅当在大根树上 vu 的祖先,在小根树上 uv 的祖先。在一棵树上 DFS,BIT 维护另一棵树上的 DFN 即可。复杂度 O(nlogn)


  「D. 欢乐豆」 给定含 n 个结点的有向完全图,边 u,v 的权为 wu,v=au,现修改 m 条边的点权,求两两最短路之和。n105m2×103

  显然由修改的边构成的图中,不同的连通块相对独立。在一个连通块中,可以线段树优化 Dijkstra 暴力做最短路。所以可以做到 O(m2logm)。有一些并不太困难的小细节叭。




  2021.11.11.

  「A. 嗑瓜子」 水。


  「B. 第 k 大查询」 给定排列 {an},求所有长度大于 k 的区间的第 k 大值之和。n5×105k50

  从 n1 枚举第 k 大值 x,一个区间的第 k 大为 x 当且仅当其中包含恰好 k 个大于等于 x 的数。维护已经枚举过的值,发现可能作为合法区间端点的只有 O(k) 段,暴力计算答案即可。

  神 tm std::set::iterator 的自加是最坏 O(logn) 的,只有扫描整个 set 是均摊 O(1) 的(相当于遍历一棵树),T 飞了。


  「C. 树上路径」 给定一棵含有 n 个结点的树,设 l1,l2 是两条点不交路径的长度(经过结点个数),求可能的 (l1,l2) 的数量。n5×105

  路径点不交,那么存在一条边,使得割掉这条边后两条路径分别处于两棵子树,换根求出两棵子树的直径后转化成矩阵并(其实就是后缀最大值)。(换根有点细节别写错了 qwq。


  「D. 糖」 数轴上依次有 (n+1) 个关键点,第 0 个点为原点,第 i 个关键点的坐标是 ai。你从 0 出发,每走一单位吃掉一颗糖,每到达一个关键点,可以以 bi 的单价买糖,以 si 的单价买糖,但最多携带 C 颗糖。求到达 n 号关键点时的最小花费(假设你初始的钱足够多)。n2×105,保证有解且答案有限。

  做这种买卖问题的一贯套路是:凭空买,凭空卖,等价操作赚大钱。我们直接从等价操作的角度研究:

  • 买入再以相同价格退掉 不买,所以每到一个关键点可以补满背包。

  • 买入,篡改价格,退掉 低买高卖,所以我们只需要处理“买”和“退”两种操作。

  实现上,走到 i 时,维护当前背包内剩余的糖果集合 S,并保持价格单调性。将背包内所有价格 <si 的糖果价格篡改为 si(卖);将背包内所有价格 >bi 的糖果价格改为 bi(重新买),并用当前 bi 补满背包;最后吃掉下一步需要的糖果(挑便宜的吃咯)。

posted @   Rainybunny  阅读(529)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示