P6020 [Ynoi2010] Exponential tree 解题报告
P6020 [Ynoi2010] Exponential tree 解题报告:
感觉还是水平不太行,写的很感性。
题意
给定 \(n,k\),构造矩阵满足:
- \(a_{i,i}=a_{i,i+1}=1\);
- 对于 \(i>j\),\(a_{i,j}=0\);
- 若 \(j>i+1\) 且 \(a_{i,j}=1\),则存在 \(i<t<j\) 满足 \(a_{i,t}=a_{t,j}=1\);
- 矩阵 \(A^k\) 需满足对于所有 \(i\leqslant j\),\((i,j)\) 非零。
\(1900\leqslant n\leqslant 2000\),\(2\leqslant k\leqslant 15\),你构造的矩阵 \(1\) 个数 \(m\) 需要服从一系列约束,形如 \(m-(2n-1)\leqslant \lambda n\)。
分析
之前学习过相关知识,结果又不会了,属实是菜。
记 \(F(k,n)\) 为在 \((k,n)\) 约束下我们做到的 \(m\) 大小。
赋予矩阵一个组合意义:我们初始拥有 \(n-1\) 个区间 \([i,i+1]\),需要预处理若干个区间,使得预处理的区间都可以表示成两个更小的预处理区间的无交并,且所有的区间都可以表示成不超过 \(k\) 个预处理的区间的无交并。
\(k=2\) 时是经典的猫树算法,这里不赘述,可以做到 \(F(2,n)=O(n\log n)\),事实上这也是这个子问题的下界。
\(k=3\) 时是经典的 sqrt-tree 算法,做法大概是对序列分块,预处理所有块前缀、后缀区间,以及所有整块区间,块内的区间作为子问题递归处理,得到 \(F(3,n)=O(n\log\log n)\)。
\(k>3\) 时,想做到更优,我们需要对整块区间也作为子问题处理。
具体地,我们可以通过 dp 找出最优的分段点:(令 \(a_{1,2,\cdots,p}\) 为每一个块的大小)
直接求复杂度太劣,剪一剪枝大概就能过了。
稍微提一句,当 \(k=O(\alpha(n))\) 时,我们可以做到 \(F(k,n)=O(n\alpha(n))\)(应该是下界?),做法大概是:
建立 \(t\) 层数据结构,其中第 \(i\) 层数据结构块间用第 \(i-1\) 层数据结构维护(我们钦定第 \(0\) 层的数据结构为猫树),块内递归下去。
令 \(T(t,n)\) 为第 \(t\) 层数据结构的深度,我们第 \(i\) 层数据结构按照 \(T(i-1,n)\) 分块,于是 \(T(1,n)=\log^*n\),\(T(2,n)\) 就是 \(n\) 不断取 \(\log^*\) 直到变成 \(O(1)\) 的次数。那么 \(t\) 就是 \(n\) 不断变成 \(T(t-1,n)\) 变成 \(O(1)\) 的次数,此时 \(t=\alpha(n)\),为反阿克曼函数,于是得到 \(F(k,n)=O(n\alpha(n))\)。