「2024 July」做题笔记

[THUPC2019] 摆家具

发现概率/方案数只和有多少个位置和初始状态相同有关。

如何预处理和每个状态 \(i\) 相同个数为 \(j\) 的权值和呢?

考虑按位来。类似高维前缀和的思想,那么就是前 \(k\) 位与 \(i\)\(j\) 个相同,然后后面全部相同的权值和。直接转移即可!

求方案可以矩乘。由于矩阵相同,可以类似 bsgs 的思想预处理 \(B^0,B^1,...B^{blk},B^{2blk}...\)

时间复杂度 \(O(nk^3+qk^2+\sqrt {Mod}k^2)\)


P6631 [ZJOI2020] 序列

\(\sum _{x\in I} b_x\geqslant a_i\)\(\sum _{x\in I} -b_x\geqslant -a_i\)\(\forall b_x \geqslant 0\),最小化 \(\sum b_x\)

对偶得 \(\sum s_i-t_i\leqslant 1\),最大化 \(\sum a_i(s_i-t_i)\)

猜测最优解为整数。

\(f_{x,i,j,k}\) 为前 \(x\),三种操作的后缀最大值为 \(i,j,k\)

那么满足条件当且仅当 \(i,j,k\leqslant 1\)

发现 \(i,j,k\geqslant 0\),因为出现负数肯定后面的后缀最大。同理推出 \(-1\leqslant s_i-t_i\leqslant 1\)

直接 dp 即可。


CF542B Duck Hunt

这个题真只有 *3100 吗?

考虑从左到右扫描线,整体 dp 维护只考虑 \(r\leqslant k\) 的区间,上一次在 \(i\) 开枪的最大🦆数。

每次形如,给一个后缀加 \(1\),以及查询 \(i-r\) 前缀最大值赋值给 \(i\)

前一个操作只会进行 \(O(n)\) 次,考虑优化后一个操作的次数。

考虑 \(f_{i,i}\) 什么时候和 \(f_{i,i-1}\) 不同。发现要么是存在区间满足 \(l=i-r\),要么 \(f_{i,i-r}\) 是唯一前缀最大值。注意到这些情况也是 \(O(n)\) 的。

使用优先队列+线段树维护即可。

非常难实现。参考了一下题解。


P6256 [ICPC2019 WF] Directing Rainfall

可以列出 \(dp_{i,j}\) 表示第 \(i\) 块布横坐标为 \(j\) 需要的最小代价,显然可以离散化。

想想用什么顺序进行这个 dp。发现可以拓扑排序,然后维护一棵线段树,对应的位置转移(进行修改)。

那么操作就是区间加和区间进行前/后缀依次赋 min。可以线段树维护。

到时候来打。


uoj461 新年的Dog划分

考虑对于一个点可以找到和它还没在一个连通块的边,也就是说,可以找到一棵生成树。

那么现在只用判断是否有同侧边。发现可以枚举树边删去,判断是否联通,然后就做完了。

通过玄学乱搞卡进次数内并过掉了。


【UNR #3】鸽子固定器

考虑暴力是:枚举左端点,向右扫右端点,每次取出堆中前 \(k\) 大。

考虑第 \(k\) 大的数,包含它的区间肯定有恰好 \(k-1\) 个大于它的值,从小到大删数,那么答案只能在相邻的 \(2k\) 个数中选。

那么直接链表维护即可。


qoj6199 Frustration and Bracket Sequences - Problem

首先算出添加括号数是平凡的,移动次数也是固定的,考虑如何快速算出。

考虑左边的右括号向左移动。那么遇到右括号个数会加 \(1\),并且 不会增加移动次数。遇到左括号个数减 \(1\),增加当前个数次移动步数。

那么遇到第 \(i\) 个左括号就是增加了 \(\max(a_i-i,0)\) 次,\(a_i\) 表示前面的右括号个数。

然后 把右括号看成 \(1\),左括号看成 \(-1\),问题转化为前缀 \(\geqslant 0\) 并且当前为 \(-1\) 点的前缀总和。

主席树维护即可。 由于有修改,分块维护即可。


SP419 TRANSP - Transposing is Fun

写成二进制的形式,其实就是向左移 \(a\) 次。求本质不同串数。所以板题了。


CF1442D Sum

看起来是 min+ 卷积,非常经典啊。但是发现只会有一个位置不选满。

所以考虑前后缀合并,但是也是同样的复杂度。

这种题要单个单个加,尝试编一个分治。发现只需要设计 dp 表示当前不含分治区间的所有数的贡献即可。

时间复杂度 \(O(nk\log_2 n)\)


[AGC039E] Pairing Points

考虑枚举 \(1\) 连的边,看成区间的形式,发现和这条线相交的所有线段是互相包含关系。

枚举最外面那一条,此时整个线段被化为了四部分,相邻的部分可以连边。并且,对于一个部分,肯定是左边一些点连左边,右边一些点连右边。

画一下发现这个问题可以被化为三个子问题,也就是 \(f_{l,r,x}\) 表示 \([l,r]\)\(x\) 和外界相连的方案数。所以直接转移就行了。

时间复杂度 \(O(n^7)\),常数极小所以就能过了。

优化的话枚举 \(p,q\),然后发现其它的式子和 \(x\) 无关,再设 \(g_{l,p,k}\)\(\sum f_{l,p,i} [a_{i,k}=1]\)。可以优化到 \(O(n^5)\)


CF1060F Shrinking Tree

考虑枚举根最后留,那么当前删边,如果父亲与根联通就要提供 \(\frac 1 2\) 的概率,否则概率为 \(1\)

感觉一下,这个东西和一条边删除的时间有关,如果向上树形 dp 的话,只对子树最后删除的一些边有限制。

并且发现,这个兄弟之间的关系是很浅的,因为本题就是一些儿子和父亲的合并。

\(f_{i,j}\)\(i\) 为根,考虑最后删的 \(j\) 条边,最后留下 \(i\) 的方案(要乘上刚才说明的概率)。答案就是 \(f_{root,n-1}*\frac {1} {(n-1)!}\)

考虑 \(v\rightarrow u\),枚举删边时间戳 \(i\),可以直接对此转移。

然后子树合并直接卷积就行了,乘上有限制的和没限制的组合数即可。

时间复杂度 \(O(n)\)


qoj8171 Cola

Bob 的策略肯定是后面的乱猜,那么首先可以写出一个没啥用的 dp。

考虑设每次询问后确定了多少个数 \(\{c_i\}\)。发现 \(c_i\leqslant c_{i+1}\),且 \(i\) 的出现次数 \(\leqslant n-i\)。考察一下出现的概率,发现都是 \(\frac 1 {n!}\)!所以只用计算方案数。

将多出的步数分给 \(n\),且 \(c_n\geqslant 1\)。也就转化为,\(i \in[0,n]\)\(\sum d_i= m-1\)\(d_i\leqslant i\) 的方案数。

容斥。那么剩下的就是一个组合数,所以只和选的 \(\sum i\) 有关。发现这就是五边形数的形式:\(\sum_{i=1}^{+\infty}(1-x^i)=\sum_{i=-\infty}^{+\infty}(-1)^i x^{i(3i-1)/2}\)。可以 \(O(\sqrt n)\) 求出。

所以总复杂度线性。


posted @ 2024-07-02 08:31  Saintex  阅读(5)  评论(0)    收藏  举报