模拟赛8.17 解题报告
T1. 激光通讯(P2937 [USACO09JAN]Laserphones S)
题意:一张 \(n\times m\) 的网格图,有空格有障碍。给出两只奶牛的坐标,求他们之间的路径最少要拐多少次弯。\(1\le n,m\le 100\)
拐弯次数最少 \(\iff\) 直走的段数最少,我们直接 \(\text{BFS}\),取出每个点,更新在同一条直线上的点。
T2. 树
题意:一棵二叉树的中序遍历结果是 \(1...n\),给出层次遍历(左儿子优先),求先序遍历,数据保证有解。 \(1\le n\le3\times 10^5\)
LGJOI 的题真的越来越水了……(不是,你给个模板是什么意思???)
考虑层次遍历的第一个数一定是树的根,设为 \(p\),根据中序遍历,\(p\) 的左子树由 \(1...p-1\) 组成,右子树由 \(p+1...n\) 组成。考虑到可以分治,设 \(\text{solve}(l,r)\) 为求 \(l...r\) 所构成的子树的值。显然 \(l...r\) 中深度最小的是根,我们可以在层次遍历中记录每个数的位置,然后 \(\text{ST}\) 表找出。设找出的这个根为 \(p\),分别递归 \(\text{solve}(l,p-1),\text{solve}(p+1,r)\)。
时间复杂度 \(O(n\log n)\)。
T3. 石头剪刀布
题意:有一个数列 \(A_{1...n}\),给出 \(A_i\) 可取的数 \(S_i(|S_i|\le 3,\space \forall x\in S_i,\space 0\le x\le 2)\)。设 \(w(A)\) 为 \(A\) 中能连出形如 \(0,1,2,0,1,2,0,1,...\)(\(0,1,2\) 开头均可)的子序列最长长度,对于每个 \(k(1\le k\le n)\),求 \(\sum\limits_A [w(A)=k]\)。\(1\le n\le 2000\)
一开始想的是二项式反演,但这并不是普通的数数,而是里面套了一层“最长长度”,直接算会出现大量重复。
思考,感觉只能硬 \(\text{DP}\)。设 \(f[i,a,b,c]\) 表示确定了 \(A_{1...i}\),其中以 \(0\) 结尾的子序列最长为 \(a\),\(1\) 为 \(b\),\(2\) 为 \(c\),有多少种方案会到达这样的局面。
设 \(b_{i,0/1/2}\) 表示 \(A_i\) 是否可取 \(0/1/2\),转移:
时间复杂度 \(O(n^4)\),显然炸裂。
但是观察到 \(a,b,c\) 的差距不会很大,因为题目需要统计的序列 \(0,1,2,0,1,2,0,1,...\) 很特殊,进一步的,\(b-a\le 1,c-b\le 1,a-c\le1\)。
证明:考虑归纳证明,\(a=b=c=0\) 时显然成立。
若 \((a,b,c)\) 成立,考虑对后面的影响:
- \((a,b,c)\rightarrow (\max(a,c+1),b,c)\):因为 \(b-a\le 1\),所以 \(\max(a,c+1)\le1\)。仍然有 \(c-b\le 1\),然后又因为 \(a-c\le1,c+1-c\le 1\),所以成立。
剩下的同理。
所以我们设 \(f[i,a,b',c']\) 表示 \(b=a+b',c=a+c'\) 时的答案,总时间复杂度 \(O(n^2)\)。
T4. 快递员
题意:一张 \(n\times m\) 的网格图,有空地和障碍。\(q\) 次操作,每次把一个格子状态取反,或者询问 \((x_1,y_1)\rightarrow (x_2,y_2)\) 在不能往左走的条件下的最短路(\(y_1\le y_2\)),或给出无解。\(1\le n\le5,\space 1\le m\le2\times10^5\space 1\le q\le5\times10^4\)
原题面过于恶心……
现在很气。
然后我们发现这就是个动态 \(\text{DP}\) 的模板,时间复杂度 \(O(mn^3+qn^3\log m)\)