NOIP 模拟赛:2024-11-20

T1:

本题中令记号 ab 表示幂运算 ab 。一个幂运算代数式可以通过加括号改变所有运算符号的运算顺序,否则从左到右运算,例如 a((bc)d)e表示(a((bc)d))e

对一个代数式 a1  a2    an ,你可以任意加括号,求能得到的最小运算结果,你只需要输出最小结果对 998244353 取模的值。

容易想到把第一个 1 会把后面的无效,而对于前面的数,因为此时 ababa,b2),肯定不加括号最优。


T2:

一棵n个结点的树,每个结点u有给定的点权au。你需要为每一条边赋一个[1,m]范围内的整数边权,要求每个结点i的邻边边权的中位数不超过ai。求树的边权和的可能最大值,若无满足条件的赋权方案则输出-1。

本题中,认为k个数的中位数为从小到大的第k2+1个数。

容易发现每条边只会取 au,av,m 中的一个。dp[i][0/1/2] 表示 i 的子树,ifai 的边权取 au/av/m


T3:

棋盘

题目描述

对一个n×m的01矩阵,有一些位置的数字是确定的,另一些不确定。你需要填充不确定的位置的数字,要求其不能包含如下两种2×2子矩阵

[1001] [0110]

请判断能否按要求填充,若能则给出任意一种方案。

先把能直接确定的填了。

如果还有括号,我们采取这样一种方案:随便挑一个,然后把能由它直接确定的都填了;循环往复。断言这不会有问题。

证明:

假设当前局面开始时不存在已经不合法的。当填了一连串问号后,若导致矛盾,必然是恰好填进了一个 2×2 的不合法子矩阵,但是这应该在之前就确定了的。


T4(未完善):

一个2n长度的序列a,下标范围12n,需要保证初始时值为1n的元素各两个。

之后,开始反复执行如下操作,直到操作后序列a不发生变化:

  • 从前到后考虑每一个位置i,若ai>0且此时值为ai的元素并非唯一(即存在j>i使得aj=ai),则将ai减小1,然后结束本次操作。

容易发现a最终一定会有恰好n个位置非0。现在给出n个非0位置的下标,求可能的不同初始序列a的个数,答案对998244353取模。

显然应该从后往前考虑,因为前面的数不会影响后面的操作。

容易想到最后会留下一个 1n 排列。证明考虑当前序列的最大数 x,最靠后的 x 一定会留下来,前面的总会变成 x1;然后在所有剩下的 x1 中,又会留下最后一个 ……

举个例子观察一下,比如最后留下了 002013,最后一个 0 为了变成 0,只能填 1;倒数第二个 013,第一个 0 也是填 13。注意到无论后面的 0 填什么,都会导致前面的 0 少一种可能。而这个 "可能" 就是这个 0 后面从 1 开始最多可以连续几个数都有。

记当前位置从 1 开始连续个数为 x,在各个位置的 x 组成一个序列 {xi}。而 xi 相同的初始序列,最终的方案数也一样,这可以作为 DP 中将不同方案统一计算的手段。

粗略考虑 dp[i][j] 为填了 i2n,从 1 连续能到 j 的方案数。如果 i1 最终留下 0 是好求的,只需要乘以一个系数(j 减去后面 0 的个数)即可;但如果不是 0,我们为了知道填了它会让 1 能连续到哪里,也需要知道后面所有填过的位置,这就不可避免走向状压。

这里有一个经典的 trick:当一个东西很重要而无法确定时,不妨不确定,当真的要用到时再拿出来。

放在这题里,也就是 dp[i][j] 只考虑 1j 的填法。只有当 dp[i][j] 试图向 dp[i][j+2] 转移,我们才把后面空着没填的 1 取出若干个填了。

但是 "取出若干个填了" 的方案数到底是多少?这里不清楚 …… 而且如果后面填了两个 a,前面还要避免使用 a,比较复杂。目测还要一个预处理 DP。

posted @   FLY_lai  阅读(21)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 没有源码,如何修改代码逻辑?
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
点击右上角即可分享
微信分享提示