NOI 2025 题解

NOI2025

补题,感觉题解写得还是比较明白的,宝宝也能看懂

[NOI2025] 机器人

分层图最短路

[NOI2025] 序列变换

写一个自己场上大概是会了的做法

首先操作一个点之后这个点不可能再次被操作,两边就无关了

注意到最后肯定是形如 \(\text{RRRxLLLRRxLLL}\) 的东西,其中 \(\text{R}\) 代表向右操作,这个点变成 \(0\)

\(dp_{i,j}\) 表示在 \(i\) 处剩下一个非零数,\(s_i\) 表示 \(\sum_j dp_{i,j}\),它前面那段 \(\text{R}\) 的开头是 \(j\)

枚举 \(i,k\),发现合法的转移点是一个区间,第二问转移形如 \(dp_{i,v}=\sum\limits_k (s_k-dp_{k,j}) calc(k+1,i)\),这里的 \(j\) 是指让 \((j,k,v-1)\) 这个三元组权值是 \(0\)\(j\),去重的话如果存在 \(a,b\) 满足 \(c_{k,a}=c_{k,b},c_{i,a+1}=c_{i,b+1}\),那么这两个点只有一个能转移,这个很好限制,因为枚举完 \(i,k\) 之后事实上满足一个限制就好了,这个容易证明,也就是保证同样的答案只贡献到一个位置

现在直接做就 \(O(n^3)\) 了,考虑优化

\(calc(k+1,i)=f(i)f(k)^{-1}\)\(dp_{k,j}\) 可以写成 \(dp_{k,v}\),表示贡献系数,有 \(dp_{k,v}=\sum\limits_{u<k,k\le r_u} dp_{k,u}\),还要满足一个 \(c(i,u)+c(i,v)-a_i \ge 0\) 于是做一个一维偏序就 \(O(n^2\log n)\) 维护 \(\sum\limits_{k} dp_{k,v}\) 了,然后需要记录前驱,扫描线一下,对于 \(c_{k,a}=c_{k,b}\) 的贡献到小于当前 \(i\) 最靠后的点,直接做就 \(O(n^2\log n)\),分讨一下奇偶性精细实现可以做到 \(O(n^2)\)

第一问用同样的做法就能做了,注意不要取模,好像也没有特别难写,可能是场上脑子太乱了

[NOI2025] 数字树

场上不会任何,写了 \(8\) 分暴力

我太搞笑了,场上认为很有性质于是对着一般树想了半天有啥深刻的性质,获得了 \(0\) 个有意义观察,改题的时候才发现自己场上想这个还不如去厕所玩会原神

首先有一个观察是我们进入每个子树之后添加的数的无序集合显然是固定的,那么我们考虑我们 dfs 到了某个节点,它的左子树和右子树存在一对落单的元素,那么先进入一棵子树之后除非某个分叉的子树里面可以在回溯之前全部消掉,都只能后选落单元素所在那边,另一棵子树相反,而且完全对称

考虑 AB 性质,注意先进入的根的子树的 dfn 倒序和后进入的根的子树的 dfn 正序,发现是一个类似于匹配的过程,每次两边走的子树中的元素必然要是包含关系,否则中间这段永远消除不了,于是我们可以迅速的将若干棵子树配对,因为保证答案不为 \(0\),所以配对一定可以成功,碰到空子树就给答案乘二继续递归,然后注意到有一个条件是保证任意状态有解,注意到加点越多限制越紧,所以肯定是最后点全加完仍然存在合法方案,因为满二叉树的结构,这个包含必定是相等,所以答案是 \(2^{2n-i}\),其中 \(2^i\) 是由每个不存在空子树的节点贡献的,而一个存在空子树的点会贡献 \(2\),这样的节点显然共有 \(2n-i\)

试图扩展到 A 性质,依然先考虑限制最多(\(i=n\))的情况,如果遇到两边子树不相等,那么之后进入一边递归,一定每次都是有一边子树相等的情况,不然显然无解,所以我们每次只能无脑先走相等的子树,刚才的推导关键是 '一定每次都是有一边子树相等的情况',所以当 \(i<n\) 时显然也成立,注意到乘二的情况事实上相当于当前两棵子树相等,所以我们事实上只需要维护左右两边相等的子树棵数,集合合并,判等,这个可以和哈希维护,注意刨去一棵子树是空的的节点

考虑更加一般的情况,我们猜想答案的形式也差不多是这样,假设我们进入一棵子树,那么我们依旧进行上面的配对过程,只不过我们需要先配对这棵子树内的东西,递归进行 A 性质类似的东西,发现我们如果当前有两种 LCA 不同的元素在子树内的时候递归的方向必然唯一确定,所以这个点的子树顺序无关当且仅当:子树内所有元素的 LCA 至多有一种小于当前节点,当前节点经过对应 LCA 处的匹配之后得到的点的集合和当前集合相等,那么只需要把和哈希换成异或哈希,去掉左右子树的限制,那么现在这些节点额外的贡献等于 \(2^{2i-1-k}\),加上原来的 \(2^{2n-2i}\) 答案就是 \(2^{2n-1-k}\)\(k\) 是不同的集合个数(注意不包括空集和大小为 \(1\) 的集合),现在就有 \(80\) 了,这里为了方便维护可以把大小为 \(1\) 的集合和空集也算进去,再把多减的加回来,写成 \(2^{2n+i-k}\) 的形式

那么我们现在要用数据结构维护这个玩意,优化复杂度,注意到 \(k\) 是单调递增的,先丢掉异或哈希,改成直接维护集合对应的 \(01\) 串,发现其实 \(lcp(a,b)=t\) 的在前 \(t\) 个时刻颜色全相同,如果能对这些串排序就可以品酒大会秒杀一切,不难想到使用可持久化线段树合并维护每个串,在节点上维护子树哈希值,排序的时候在线段树上二分比较答案,复杂度 \(O(n \log^2 n)\),代码很好写,存在 \(O(n\log n)\) 做法

tips:最后的正解反而不直接对集合异或哈希的原因是异或哈希难以处理每个时刻的答案,如果只求一个时刻的答案显然可以直接做

[NOI2025] 三目运算符

显然,写棵线段树,不要小巧思就过了

[NOI2025] 集合

深情朗诵

😭回来吧指数状压😭

🌟我最骄傲的信仰🌟

⚡历历在目的省选⚡

😭眼泪莫名在流淌😭

💥依稀记得哈集幂💥

👍还有给力的数据👍

⚡把铜牌都给打退⚡

😎通宵熬夜都不累😎

要求的是

\[\begin{aligned} \sum_{S_1} \sum_{S_2} [S_1 \cap S_2 = \varnothing] [f(S_1)=f(S_2)] g(S_1) g(S_2)\\ =\sum_k \sum_{S_1} \sum_{S_2} [S_1 \cap S_2 = \varnothing] [f(S_1)=k] [f(S_2)=k] g(S_1) g(S_2) \end{aligned} \]

这个不太好做,尤其是那个 \([S_1 \cap S_2 = \varnothing]\) 非常之恶心,给它容斥掉

\[\begin{aligned} =\sum_T (-1)^{|T|}\sum_k (\sum_{T \subseteq S} [f(S)=k] g(S))^2 \end{aligned} \]

后面的 \(S\) 肯定需要想办法不枚举,发现 \(f(S)=k\) 还是太强了,接着容斥,设 \(w(k)\) 所有 \(f(S)\)\(0\) 的位置是 \(k\) 的子集的 \(\sum g(S)\),同时设零位置的集合是 \(z(k)\)

\[\begin{aligned} =\sum_T (-1)^{|T|}\sum_k (\sum_{D} (-1)^{|z(D)|} w(D) \sum_{i \in T} \dfrac{a_i}{1+a_i})^2 (z(T) \subseteq z(D) \subseteq z(k)) \end{aligned} \]

\(\sum_{i \in T} \dfrac{a_i}{1+a_i} = R(T)\),拆开平方

\[\begin{aligned} = \sum_k (\sum_T (-1)^{|T|} R^2(T) (\sum_{D} (-1)^{|z(D)|} w(D))^2) \end{aligned} \]

现在一切只和 \(z(f(T)),z(D)\) 有关,前面只和 \(T\) 有关的式子显然是 \(\prod (1+tx^i)\) 的形式,可以高维前缀和状物求出 FWT 数组

\[\begin{aligned} = \sum_T (-1)^{|T|} R^2(T) \sum_{D_1} (-1)^{|z(D_1)|} w(D_1) \sum_{D_2} (-1)^{|z(D_2)|} w(D_2) 2^{\operatorname{popc}(D_1 \operatorname{and} D_2)} \end{aligned} \]

事实上目前对于 \(D_1\)\(D_2\) 的限制是 \(D_1 \operatorname{or} D_2 \operatorname{or} f(T) = f(T)\),所以如果没有最后一项的话可以直接把后两项卷起来,而 $ \operatorname{and} $ 又显然可以拆成 $ \operatorname{or} $,于是可以直接卷积了,最终式子是

\[\begin{aligned} = \sum_T (-1)^{|T|} R^2(T) 2^{-\operatorname{popc}(D_1 \operatorname{or} D_2)} \sum_{D_1} 2^{\operatorname{popc}(D_1)}(-1)^{|z(D_1)|} w(D_1) \sum_{D_2} 2^{\operatorname{popc}(D_2)}(-1)^{|z(D_2)|} w(D_2) \end{aligned} \]

对着这些式子冲一发 FWT 即可,于是 B 性质做完了,可以获得 \(52\) 分,思考如何处理 \(0\)

问题在于计算 \(R\) 的时候无法直接算逆元,考虑扩域,维护一个多项式表示当前 \(0\) 因子个数,注意到只可能把某一层所有 \(0\) 消掉,不可能除掉更多的 \(0\),所以这个多项式只需要维护最低次项即可,容易发现复杂度依然是 \(O((n+\log p)2^n)\)


虽然暴力容斥已经足够暴力了,但是我们仍然希望一个更加形式化的推导方式,考虑直接把这玩意写成形式幂级数

\[F(x,y)=\prod_i(x^Uy^U+a_ix^Uy^i+a_ix^iy^U) \]

两维都是 $ \operatorname{and} $ 卷积,最后所求是 \(\sum\limits_i [x^iy^i] F(x,y)\)

注意到 \([x^r] FWT(F) = y^U+a_iy_i+a_iy^U[r \subseteq i]\)

其实就是

\[[x^{r_1}y^{r_2}]FWT(F) = 1+a_i[r_2 \subseteq i]+a_i[r_1 \subseteq i]=\prod_{r_1 \subseteq i} (1+a_i)\prod_{r_2 \subseteq i} (1+a_i) \prod_{r_1 \cup r_2 \subseteq i} \dfrac{1+2a_i}{(1+a_i)^2} \]

给它 IFWT 回去,发现 \([x^{r_1}y^{r_2}]FWT(F)\) 对答案的贡献系数是 \((-1)^{|r_1|+|r_2|} 2^{|r_1 \cap r_2|}\)

不考虑这个系数,上面部分直接或卷积显然能做,那么就像容斥做法一样拆开 \(\cap\) 就好了,两种做法本质相同

[NOI2025] 绝对防御

还不会

posted @ 2025-09-24 15:04  wang54321  阅读(57)  评论(2)    收藏  举报