UOJ Long Round #3 记录
A 10pts
直接开一个数组做。
A 60pts
注意到置换环取反后最小值不变,于是只在最小值位置处理,这样每个环只会处理一次。将单个环取反是容易的,求最小值直接暴力。
A 100pts
继续优化判断新环的过程,尝试利用 256b。
手写一个 bitset,这样就能给 \(1408\) 个位置打标记了,时间复杂度就能除掉 \(1408\)。
取 \(\{x\mid x\bmod 214=114\}\) 打标记可以通过。
F 5pts
暴力。
F 45pts
\(y_i=0\),考虑分块,整块离散化维护每一段的贡献,散块暴力。
时间复杂度 \(O(nB+\frac{nq\log B}{B})=O(q\sqrt{n\log n})\)。
C 6pts
首先考虑如何判断一个点 \(u\) 深度(根为 \(0\)) \(\le x\):\(ask(u,h+x)=0\)。
对于 \(h=2\),找到根 \(rt\) 后 \(ask(rt,1)+ask((rt+1)\bmod 3+1,1)\) 即为答案。
C 9.12pts
下称深度为 \(1\) 的两个点分别为 \(x,y\)。
考虑找出 \(rt\) 后直接用 \(ask(rt,d)\) 得出深度为 \(d\) 点的答案 \(s_d\),但是无法求出 \(s_0\)。
注意到 \(ask(x,1)+ask(y,1)=2s_0+s_2\),故 \(s_0=\frac{ask(x,1)+ask(y,1)-s_2}{2}\)。
C 12.48pts
之前做法对 \(rt\) 问的次数太多了。
考虑先用 \(n\log\log n\) 次求出每个点的深度,然后对所有深度为 \(d\) 的点 \(u\) 用 \(ask(u,1)\) 得出 \(s_{d-1}+s_{d+1}\),可以将每个 \(s\) 解出来。
C 28.56pts
考虑 \(\sum ask(u,1)=3ans-s_0-2s_{h-1}\),把 \(s_0,s_{h-1}\) 用 \(rt,x,y\) 求出即可。
D 5pts
暴力。
E 30pts
显然 \(s_x\) 为 \(s_u\) 的祖先,在 fail 树上暴力跳即可,数据随机时跳的次数较小也能过。
B 26pts
注意到 \(i-1,i\) 之间往左和往右的次数是相同的,设其为 \(b_i\)。
则 \(b\) 合法的充要条件为其中非 \(0\) 值成一段区间且 \(a_i+b_i-b_{i+1}\ge0\),对非 \(0\) 区间内位置的答案产生贡献。
不难 dp,但是无脑 dp 复杂度太高了。考虑对答案差分,并同时统计对 \(r+1\) 的贡献(\(l\) 同理)。容易做到 \(O(n\sum a)\)。
E 50pts
\(fa_i=i-1\),此时变成一个串了,倍增跳限制即可。
C 36.08pts
先判断 \(de\le 1\),然后判断是不是 \(rt\),这样只需要 \(2n+O(1)\) 次。
但是被卡了 \(1\) 次,根据可能性大力剪枝可以省掉。
C 52.96pts
实际上不需要局限于求出 \(\sum ask(u,1)\),只要能凑出答案就行了。
还是先找出 \(rt,x,y\),然后用 \(rt\) 直接问可以得到 \(1\) 层,\(x,y\) 交叉可以得到相邻 \(2\) 层。
手玩不难得到 \(h\le 8\) 的处理方法,由于单点次数限制无法处理更大范围。可以通过 \(5\le h\le 8\)。
C 59.07pts
手玩得到 \(h=3,99\%\) 和 \(h=4,100\%\) 的策略。
C 59.2pts
手玩得到 \(h=3,100\%\) 的策略。
C 71.2pts
之前的策略在大范围下至少也要 \(2n\),并且满二叉树最下面几层的点太多了,考虑让最下面若干层的点只询问 \(1\) 次用来判断深度,然后用顶部的点去凑。
单点次数限制卡的比较死,手玩只玩出来能干掉 \(2\) 层的策略,次数是 \(1.75n+O(1)\)。
B 56pts
之前那个属于是硬做了。限制实际上是 \(b_{i+1}\le a_i+b_i\),那么考虑容斥。容斥完变成若干段要求段内 \(b_{i+1}> a_i+b_i\)。由于 \(b_i\le \sum a\),可以直接组合数计算。
还是不难 dp 统计,时间复杂度 \(O(n^2+\sum a)\)。
B 69pts
效率瓶颈在于计算组合数。由于需要正反跑两遍,考虑直接把组合数存起来,就能卡过了。

浙公网安备 33010602011771号