• 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)\)

  • 相关阅读:
    JS(JQEERY) 获取JSON对象中的KEY VALUE
    .NET 日期数据的格式化方法
    jquery转换json对象为字符串
    Repeater和Gridview前台显示行号的方法
    Asp.Net对Json字符串的解析和应用
    C++学习之路—运算符重载(一)概念、方法及规则
    C++学习之路—多态性与虚函数(二)纯虚函数与抽象类
    C++学习之路—多态性与虚函数(一)利用虚函数实现动态多态性
    软件工程师的优秀品质
    C++学习之路—继承与派生(四)拓展与总结
  • 原文地址:https://www.cnblogs.com/lnzwz/p/15588286.html
Copyright © 2020-2023  润新知