NOIP 2018 原题重做

DAY 1

记忆尤为深刻的一场考试

T1-铺设道路(road)

算法 1(标准做法)

标准Codeforces Div2B难度。
把原题想成是用最少的1×D(D[1,+))1\times D(\forall D\in[1,+∞))的水平木板覆盖完整个直方图。
考虑现在铺第ii个水平位置,那么如果上一个水平位置在直方图内,即可直接将木板延长一次。
因此总的答案就是i=1nmax(hihi1,0)\sum^n_{i=1}\max(h_i-h_{i-1},0)

算法 2(笛卡尔树)

笛卡尔树模板题,答案就是笛卡尔树的带权sizsiz

算法 3(线段树)

无脑找最小值然后区间减,分治直接做即可。
复杂度最极端是即为直方图表现为1n1\dots n的情况。
此时复杂度为i=1nlogi=logi!\sum^n_{i=1}\log_i=\log i!
随便放缩一下就可以得到它上限为O(nlogn)O(n\log n)
然而我们也可以用斯特林公式证明O(logn!)=O(nlogn)O(\log n!)=O(n\log n)

T2-货币系统(money)

算法 1(标准做法)

显然答案是原货币系统的一个子集,那么我们需要删去一些面额。
我们被删去的面额显然满足它能用较小的面额的货币表示出来。
因此按货币从小到大完全背包即可。

算法 1 plus(拟阵)

其实原问题是一个很经典的拟阵形式,我们只需要证明它是一个拟阵我们就能完全严谨的证明算法1的结论了。
证明如下:
NOIP 2018 原题重做

算法 2(同余最短路)

虽然复杂度不优秀,但是思路挺巧妙的。
首先将货币系统aa按面值排序。
我们建a1a_1个点分别表示mod  ai=k\mod a_i=k的点。
对于每个ai(i>1)a_i(i>1),连一条xx(x+ai)mod  a1(x+a_i)\mod a_1,权值aia_i的有向边。
对这个图求出源点为00到每个点的最短路did_i
这个did_i的含义其实就是货币系统aa能表示的最小的k(kmoda1=i)k(k\bmod a_1=i)
容易得到满足条件的货币系统的did_iaa货币系统的did_i一致。
因此我们只需要找原图的一个边数种类最小的联通子图即可。
看起来比较困难,其实我们只需要做最短路时尽量保留较小的边即可。

算法 3(生成函数)

显然有一个做法:
F(x)=i=1nGi(x)F(x)=\prod^n_{i=1}G_i(x)
Gi(x)=j=0+xvijG_i(x)=\sum^{+∞}_{j=0}x^{v_i·j}
复杂度:O(TnMlogM)O(TnM\log M)
然而NTT常数很大会T。
考虑换底,然后化简:
F(x)=ei=1nlnGi(x)=eln(1xvj) F(x)=e^{\sum^n_{i=1}\ln G_i(x)}=e^{-\ln(1-x^{v_j})}
ee上面的然后求导再积分回来:
ln(1xvj)d(1xvj)=vjxvj111xvjdx=vji=0+xvj(i+1)1dx()=i=0+x(i+1)vj(i+1)=i=1+xivji -\int \ln'(1-x^{v_j}) \mathrm{d}(1-x^{v_j}) \\=\int v_jx^{v_j-1}\frac{1}{1-x^{v_j}} \mathrm{d}x \\=\int v_j\sum^{+∞}_{i=0}x^{v_j(i+1)-1}\mathrm{d}x(等比数列公式) \\=\sum^{+∞}_{i=0}\frac{x^{(i+1)v_j}}{(i+1)} \\=\sum^{+∞}_{i=1}\frac{x^{iv_j}}{i}

H(x)=i=1+xivjiH(x)=\sum^{+∞}_{i=1}\frac{x^{iv_j}}{i},答案即为eH(x)e^{H(x)}中能被表示的方案数为00的数的个数。
求出H(x)H(x)复杂度是调和级数O(MlogM)O(M\log M)的,expexp也是O(MlogM)O(M\log M)的。
因此复杂度:O(TMlogM)O(TM\log M)
然而它还是过不了。

T3-赛道修建(track)

算法 1(标准做法)

显然对答案进行二分,这样我们就转化为了求最多的划分链个数。
我们尝试用DFS的思路求解。对于一个节点,显然它的每个儿子都至多有一条未处理完的顶部为这个儿子的链。对于当前层,要么我们选出两条链连在一起,要么这条链成为当前点的未处理链。
显然我们可以在里面再套一个二分或者vector来做。
然而当时我不敢写二分套二分写了个双指针挂成80。

算法 2()

DAY 2

T1-旅行(travel)

T2-填数游戏(game)

T3-保卫王国(defense)

相关文章:

  • 2022-02-28
  • 2022-12-23
  • 2022-12-23
  • 2021-11-23
  • 2021-12-15
  • 2022-01-22
  • 2022-01-23
  • 2021-09-09
猜你喜欢
  • 2022-02-14
  • 2021-05-12
  • 2021-10-24
  • 2021-05-20
  • 2022-12-23
  • 2021-09-02
  • 2021-08-17
相关资源
相似解决方案