2021.11做题记录
東京 とうきょう
可以考虑 dp,按照最短路长度把点分层,发现要么这一层到下一层连边,要么是层之间连边
因为 2 可以随便取,所以实际上是求一个图的每个点的最短路长度之和
用 \(f[i][j]\) 表示 \(i\) 个点最后一层有 \(j\) 个点的方案数 \(g[i][j]\) 表示长度之和
转移的时候枚举 \(k\),从 \(f[i-j][k]\) 转移,这一层的每一个点必须至少和上一层的每一个点连边,也就是 \((2^k-1)^j\),同时层内还要连边,\(2^\binom{j}{2}\),还要乘上组合数
\(g\) 也是类似的转移
注意到对于每一个图,我们相当于 \(2\) 在每一个点都算了一次,所以我们还需要在最后的答案里乘上 \((n-1)^{-1}\)
新桥 しんばし
\(n\leq 20,q\leq 10^5\)
不难发现可以 \(\mathcal O(qn^2\log q)\) 利用线段树维护区间转移的值,但是显然是过不去的
所以我们考虑一种人类智慧方法
用两个栈维护,第一个栈维护 \(i\) 到 \(m\) 的转移,第二个维护 \(m\) 到 \(i\) 的转移
加入就在第二个栈加
删除如果第一个栈非空直接删
否则把第二个栈弹空扔到第一个栈里面,\(m\leftarrow r\)
查询直接两个栈合并一下
注意到一个操作最多被重构一次
因此操作均摊 \(\mathcal O(qn^2)\),查询单次 \(\mathcal O(n)\)
code
品川 しながわ
\(k\leq m\leq n\leq 10^{12},m\leq 4\)
\(n\) 比较小的时候特判掉
可以直接求或者整数分块做
推柿子可以跑一个暴力或者直接手推
川崎 かわさき/CF1333E Road to 1600
非常非常好的思维题
其实这种题都是做完之后再来看非常简单。。。
我们希望王后被堵死,所以我们考虑构造一个王后被堵死的路
先考虑 \(n=3\) 的情况,其实也可以暴力枚举得到答案
\(n\leq 2\) 的时候显然无解
考虑 \(n\geq 4\) ,我们可以用 1 2 3 4环绕右上角 \(3\times 3\) 的一周
然后再把 \(3\times 3\) 的统一加上 \(n^2-9\) 填在左上角就构造完了。。。
横滨 よこはま
和的期望的平方不等于和的平方的期望
因为 \(E(XY)=E(X)E(Y)\) 只在 \(X,Y\) 独立的时候成立
但是考虑子树合并的时候,这个时候就是相互独立的了
因此可以 dp,维护 \(f^1[u]\) 表示和的期望和 \(f^2[u]\) 表示和的平方的期望
转移有 \(f^2[u]=val[u]^2+\sum p(u,v)\times (f^2[v]+2f^1[u]f^1[v])\)
多次询问直接换根即可
戸塚 とつか/ ARC127D
考虑如何判断 \(a_i \oplus a_j\) 和 \(b_i \oplus b_j\) 的大小关系,其实是这俩异或起来看最高位属于哪一个
所以对于 \(c_i=a_i \oplus b_i\) 来建一棵 trie 树
查询的时候就看一看,如果走向另一颗子树,就计算一下他们两个之间答案的贡献,否则他们两个在这一位是相同的,也就是 \(a_i \oplus a_j=b_i\oplus b_j\),所以随便找一个计算贡献即可
\(\mathcal O(n\log^2n)\)
code