NOIP2021 题解

T1:若\(x\)存在一个约数\(y\)满足\(y\)的十进制表示有\(7\),那么\(x\)就是不好的,\(T\)次询问给出\(n\),询问大于\(n\)的最小的好数。\(n<=10^5,T<=10^7\)

解法:类似筛法的思路。先预处理\(b7(x)=b7(x/10)||(x\mod10==7)\),表示\(x\)的十进制中有无\(7\)

对于\(b7(x)==true\)\(x\),把\(x\)的倍数标记。注意如果一个数被标记了就不用标记他的倍数了。

时间复杂度约为\(O(n\ln\ln n)\)

T2:给出\(n,m,k\),若数组\(a\)满足\(\sum{2^{a_i}}\)的二进制1的个数不超过\(k\),就是合法的。数列\(a\)的价值为\(\Pi v_{a_i}\)求合法数列价值和。

暴力:\(O((m+1)^n)\),可以获得\(30\)分。

可以发现这是一个背包问题,设\(f(i,j)\)表示前\(i\)个数\(2^{a_x}\)的和为\(j\)。时间复杂度\(O(n^2m2^m)\),结合暴力可以获得\(60\)分。

首先,看到二进制,考虑\(DP\)。我们按照\(a_i\)从小到大的顺序枚举,并记录未确定的元素个数,进位值以及已确定的二进制1的个数。

\(f(i,j,x,s)\)表示考虑到数组\(a\)中等于\(i\)的元素,剩下\(j\)个,进位为\(x\),有\(s\)\(1\)

枚举等于\(i\)的有\(y\)个,转移到\(f(i+1,j-y,\frac{x+y}2,s+(x+y)\mod 2)\times C(j,y)\times{v_i}^y\)

时间复杂度:\(O(n^4m)\)。稍稍注意常数即可。

T3:给一个递增数列\(a\),每次可以使\(a_i\)变为\(a_{i-1}+a_{i+1}-a_i\),求最小方差。

先差分。设\(b_i=a_{i+1}-a_i\)。那么对于\(a,a+x,a+x+y\)操作后变成了\(a,a+y,a+x+y\),发现交换了两个差分值,

那么我们暴力枚举\((n-1)!\)种最终的差分数组,即可得到\(20\)分。

不难发现方差可以用总和与平方和表示。

\(m=\max{a_i}\),我们可以通过状压枚举全排列。设\(f(S,x)\)表示已经用的集合为\(S\),前缀的和为\(x\) 的最小平方和。复杂度为\(O(n^2m2^n)\),可以获得\(32\)分。

由于是最优化问题,可以考虑模拟退火,得分约为\(72\)分。

通过找规律可以发现,最优解的差分一定先减后增。那么我们把\(b\)排序,从小到大考虑放到左边还是右边即可。

\(f(i,x)\)表示前\(i\)小的数,前缀的和为\(x\) 的最小平方和。设第\(i\)个数为\(y\),前\(i\)小的差分和为\(z\)

放到右面:转移到\(f(i+1,x+z)+z^2\)

放到左面:转移到\(f(i+1,x+i\times y)+2xy+y^2i\)

把数组中的\(0\)扔掉,复杂度为\(O(\min\){\(n,m\)}\(\times nm)\)

T4:题意略。

暴力就是分4次,每次只考虑一种边bfs即可。时间复杂度\(O(nmq)\),期望得分\(24\)~\(32\)分。

只有普通道路的情况直接查询4个点即可。期望得分\(8\)分。

没有互通道路的情况,用并查集维护一个点上下左右能走到的最远点,能吃到棋子最多4个,暴力检验即可。期望得分\(12\)分。

结合上述 做法可以获得\(52\)的高分。

满分做法:

首先时间倒流,变为合并问题。

对于每个3道路构成的连通块,用线段树按照等级维护它周围的棋子。

同时,用并查集维护联通块的点数。

合并时进行线段树合并或启发式合并即可。注意一个点没有棋子后要把它从周围的线段树中删除。

同时注意相同位置上的棋子合并时不要算重,这个可以在叶子结点使用\(set\)实现。

对于2道路的问题,还是用并查集维护一个点上下左右能走到的最远点。

查询时,分为不吃与吃两种情况:

不吃:把3和2的点数加到一起,然后把重复的减去。

这个需要对每个联通块,每行开一个线段树,按照列维护。列的线段树同理。加点时线段树合并即可。

吃:直接在联通块维护的线段树上查询前缀和即可。

使用1,2道路的最多有8个点,暴力计算有几个不能只通过3道路吃掉即可。

注意代码复杂度较高。

时间复杂度\(O(K\log K)\)\(O(K\log^2K)\)

posted @ 2021-11-22 13:57  lnzwz  阅读(1362)  评论(0编辑  收藏  举报