20210823K 复盘

看 t1,emm..我是不是可以分块,然后预处理一些块间信息,做到 \(n\sqrt{n}\log n\) ?规模很小并且时限 2s,有可能

看 t2,哦?我输出一个 fail 树是不是就行了...

看 t3,呃,我把 trie 树拉出来,然后在上面跑博弈 dp,是不是就行了...

于是去看 t4,emmm,k 很小...然后这个 \(f\) 又是比较无厘头的函数,说明不能找 \(f\) 的性质,要从数的关系入手...

不太明白,于是先去回看 t1。

emm。我们预处理出某点结尾,到某块开头一段区间中的最大数对,过程比较类似于 dp,复杂度 \({\cal O}(n\sqrt{n}\log n)\)

然后每次查询,最右端点到最左整块的左端点都可以 \({\cal O}(1)\) 取出。左端点和剩下的用 trie 上查询,一次 \(\sqrt{n}\log n\)

严重怀疑 nqlog 卡卡常能过,但是还是没有冒险

写 t1,犯了各种智障错误,数组大小两维开反了,然后到处越界一堆玄学错误,直到很晚才写完,过了大样例,希望没事

因为 t3 看起来比较好写于是去写 t3,中间 dfs 又忘了 dfs 下去,花了点时间,过了大样例,希望没锅

转头去写 t2,尝试用可持久化线段树去实现 build_fail 的过程,很快写完了

最后剩下一点时间看了看 t4,没思路,写了记忆化+卡常 30pts


s2oj773. A.xor

分块,预处理出某点结尾,到某块开头一段区间中的最大数对,过程比较类似于 dp,复杂度 \({\cal O}(n\sqrt{n}\log n)\)

然后每次查询,最右端点到最左整块的左端点都可以 \({\cal O}(1)\) 取出。左端点和剩下的用 trie 上查询,一次 \(\sqrt{n}\log n\)

s2oj774. B.magic

形式化题意:给定一棵巨大字符集的 trie 树,求它的 fail 树

考虑 ac自动机建 fail 的过程,存在以下两种转移:

  • fail[trie[now][ch]] = trie[fail[now]][ch]
  • trie[now][ch] = trie[fail[now]][ch]

发现空儿子是要继承 fail[now] 的儿子信息的,这给我们启发,使用可持久化数组维护 ch[],每次先从 fail[now] 那里继承根过来,然后依次枚举有的儿子,它们的 fail 在 fail[now] 的那棵树上面查询,最后将已有的儿子插到 now 这棵树上来。就行了

s2oj775. C.strGame

博弈,我们发现赢下整局的关键在于最后一轮游戏,前面输赢其实都无所谓,目的在争 "能赢下最后一轮" 的那一手。由于每轮都是一样的过程,在 trie 上 dp 一遍。

若拿到叶子节点,那么无论接下来做什么,一定必输,记为 LSE;如果走到状态全都是必赢,那么我们也必输;如果走到的状态都是必输,那么我们必赢,记为 WIN;如果我既能走到一个必赢状态,也能走到必输状态,那么拿到这个局面的先手可以决定本轮游戏自己是赢还是输,记为 ALL;如果一个点只能走到 ALL,说明无论我做什么,对手一定可以掌控全局输赢,记为 NO;

(注意的一点是,这里的 dp 和普通的博弈 dp 不同,普通 dp 的必赢指:我竭尽所能使用最优策略是可以赢的;但是这里的必赢是指,我无论干什么,想不想,都必赢)

最后查看根节点分类讨论。如果是 ALL 先手会赢下整局,比如我在最后一轮之前一直输,一直输就一直是先手,到最后一轮我赢,就赢了;如果是 NO 则后手赢下整局,后手做类似的操作即可。如果我只能输,那么我就会一直输,一直是先手,最后一局也输,那么就输掉了整局游戏;如果我只能赢,那么就是两个人交替赢得一轮,K 为奇数时先手必赢,否则先手必败

s2oj776. D.神秘数问题

难以想象的深奥数位 dp。和一般的数位不同,我们从低往高数位 dp,比较新奇

\(f[i][j][sgn][s]\) 表示,我填下 \(i\) 位,此时形成的数满足 \(F(kx) - F(x) = j\),目前是否是小于等于 n,以及我已有的进位

\[\forall 0\leqslant ch\leqslant 9,\\ f[i+1][j+((k\cdot ch + s)\bmod 10) - ch][\mathtt{ch==num_{i+1}? sgn:ch<num_{i+1}}][\lfloor (k\cdot ch+s)/10\rfloor]\\ += f[i][j][sgn][s] \]

含义自行多理解,如此 dp 即可

posted @ 2021-08-23 20:15  熹圜  阅读(12)  评论(0)    收藏  举报