做题记录?!!?
做题记录?!!?
CF1406E Deleting Numbers
题目描述
这是一个交互题。
有一个未知整数 \(x\)(\(1 \le x \le n\))。你需要找出 \(x\) 的值。
一开始,你有一个整数集合 \(\{1, 2, \ldots, n\}\)。你最多可以进行 \(10000\) 次如下操作:
- A \(a\):查询当前集合中有多少个数是 \(a\) 的倍数。
- B \(a\):查询当前集合中有多少个数是 \(a\) 的倍数,然后删除所有 \(a\) 的倍数,但 \(x\) 永远不会被删除(即使 \(x\) 也是 \(a\) 的倍数)。在此操作中,\(a\) 必须大于 \(1\)。
- C \(a\):表示你已经确定 \(x=a\)。此操作只能执行一次。
做法
分大小质数,小质数全问一遍然后对于有的再指数从大到小查。
大质数考虑分块,每块后再问一遍 \(A \ 1\),看块内有无。
有的话就在快内查。
D. Magical Tiered Cake
脑电波
汉诺塔,改成顶上有 \(a_i\) 才能动。
直接类似汉诺塔一样动。
得到 \(f(n) = f(n-a_i-1)\times 2 + f(n-1)+1 \le f(n-2)\times2 + f(n- 1)+1 \le 2^n-1\).
E. Snaking Arrangement
\(n \times n\) 的网格上,有 \(n\) 条路径,第 \(i\) 条长度为 \(2 \times i - 1\)。
现在固定了几条,问有几种可能的填路径方案数。
做法
先手玩一下。
可以发现蛇的放置对应着一个 \([1,n]\) 的排列。
把矩阵旋转45度。
从上到下。
发现每次会多一只蛇头 \(x\)
然后上面的旧蛇头运行规则是:在 \(x\) 左边则向左,反之向右。
方案数即为每一层蛇头能选择的格子数量之积。
能选格子是一段区间算一下乘一下。
CF1408E Avoid Rainbow Cycles
题目描述
给定 \(m\) 个整数集合 \(A_1, A_2, \ldots, A_m\),这些集合的元素都是 \(1\) 到 \(n\) 之间的整数(包含 \(1\) 和 \(n\))。
有两个正整数数组 \(a_1, a_2, \ldots, a_m\) 和 \(b_1, b_2, \ldots, b_n\)。
每次操作,你可以从集合 \(A_i\) 中删除一个元素 \(j\),并为此支付 \(a_i + b_j\) 个金币。
你可以进行若干次(也可以不进行)这样的操作(有些集合可能会变成空集)。
之后,你将用这些集合构建一个带有边颜色的无向图,该图有 \(n\) 个顶点。对于每个集合 \(A_i\),对于所有 \(x, y \in A_i\) 且 \(x < y\),你都要添加一条颜色为 \(i\) 的边 \((x, y)\)。某些顶点对之间可能会有多条边,但这些边的颜色各不相同。
你称一个环 \(i_1 \to e_1 \to i_2 \to e_2 \to \ldots \to i_k \to e_k \to i_1\)(\(e_j\) 是连接顶点 \(i_j\) 和 \(i_{j+1}\) 的某条边)为“彩虹环”,如果该环上的所有边颜色都不相同。
请你求出,为了使最终得到的图中没有彩虹环,你最少需要支付多少金币。
做法
每个集合有一个相互连边的东西。
trick:优化建图
考虑每个集合中的每个点都连向集合对应的虚点。
此时他们的连通性不变。
令边权等于 \(a_i + b_j\) ,跑最大生成树做完了。
CF1491F Magnets
有趣交互。
有0 -1 1
每次选一些在左,一些在右,返回左和 x 右和,而且要求返回值必须 \(\le n\)。
次数 \(n + log_2^{n}\) 要求得出所有 0 的位置。
做法
容易被限制吓晕。
考虑如何才能做到信息量最大化。
考虑可以一边只放 \(1\) 个。而且这样肯定不违反。
考虑查 \(i\) 与 \(1 \to i-1\)。
容易知道 \(i\) 是否是磁性的。
且前面最多一个。
有了 \(i\),容易得出后面所有的 \(0\)。
对于前面,简单二分。
CF1495E Qingshan and Daniel
诈骗思维。
机器人出牌,第 \(i\) 个有 \(a_i\) 张。分为 1 号人和 2 号人。按顺序交替出牌。
\(\sum a_i\) 较少的一定会先出完。
故用小的按顺序去贡献大的做完了。
CF1500C Matrix Sorting
两个矩阵 \(A,B\),操作是让 \(A\) 按某一列排序(稳定),构造方案使得 \(A=B\)。
做法
可以先编号。转化为给 \(A\) 的编号排序。
怎么刻画排序这件事情?
转化为使得 \(o_1 < o_2 ,o_2<o_3,o_3<o_4 \dots\)
令 \(f_i = [o_i < o_{i+1}]\)
那么此时考虑按列排序。
带来对于 \(f\) 的影响为 \(-1,0,1\) 三种。
形如:\(-1,0,1,0,1,-1,1,-1,0,1,-1,0\)
\(-1\) 为直接变为 \(0\)。
\(0\) 是不改变。
\(1\) 是改为 \(1\)。
目标是全部改为 \(1\)。
这种覆盖问题可以从尾考虑。
最后的必定没有 \(-1\)。
若前面有 \(1\),则这一位可以有 \(-1\)。
以此类推可以用一个类似于拓扑排序的东西做完。
P4629 [SHOI2015] 聚变反应炉
一棵树,节点有所需强度 \(d_i\),消灭后会给周围增加 \(c_i \le 5\) 强度。
问最少强度。
做法
转化为 \(\sum d_i-v_i\),\(v_i\) 是前面的总贡献。
一条边的贡献只跟 \(x,y\) 谁在前面有关,考虑刻画成边定向。
然后跑拓扑排序一定能确定出一个可能的选择序列。
然后就很好树形 dp 了。
E2. Abnormal Permutation Pairs (hard version)
毒瘤数数。
\(n\) 的所有排列的逆序对按字典序排序出来的序列 的逆序对个数。\(n \le 500\)
做法
设 \(x_n\) 表示第 \(n\) 的所有排列拉出来的序列。
打表可以发现 \(x_n\) = \(x_{n-1} +(x_{n-1}+1) + (x_{n-1}+2) \dots + (x_{n-1}+n-1)\)
这里的加是指序列整体加。
容易得到 \(g_{n,x}\) 表示 \(x_n\) 中 \(x\) 的个数。前缀和优化一下有 \(O(n^3)\).
再设 \(f_n\) 表示 \(x_n\) 的逆序对。
只需要额外计算块与块之间的。
枚举 \(x,y\),可以得到类似 \(\sum_{x-y\ge k} (x-y)g[x]g[y]\) 之类的式子。
然后全部拆开来算就好了。
trick:当式子出现 \(\pm0.5\) 的时候考虑将模数与式子 \(\times 2\)
trick:式子过于繁琐时考虑枚举后合并同类项算,更快更好写。
AGC013_e - Placing Squares
问题描述
Joisino 有一根长度为 \(N\) 的棒,上面有 \(M\) 个标记。从左端到第 \(i\) 个标记的距离为 \(i\)。
她将在该棒上放置若干个正方形。放置时需满足以下条件:
- 只能放置边长均为整数的正方形。
- 每个正方形必须使其底边与棒接触。
- 棒必须被正方形完全覆盖。即,没有正方形超出棒的范围,且棒的任何部分都不能未被覆盖。
- 两个正方形的分界线不能直接位于某个标记的正上方。
一种正方形摆放方案的 美观度 定义为所有放置的正方形面积的乘积。Joisino 感兴趣的是所有满足条件的摆放方案的美观度之和。请编写一个程序计算该和。由于结果可能极大,请输出其对 \(10^9+7\) 取模的值。
一种基于朴素 \(dp\) 的代数优化方法。
不考虑组合意义,就直接设 \(dp_i\) 表示考虑前 \(i\) 个格子并在 \(i\) 与 \(i+1\) 放上隔板的答案。
显然对于非特殊点 \(dp_i=\sum\limits_{j=0}^{i-1}dp_j(i-j)^2\),否则 \(dp_i=0\)。
考虑直接着手优化这个式子,我们考虑 \(dp_{i+1}\) 的递推式,(这里假设 \(i+1\) 不是标记点,即 \(dp_{i+1}\ne 0\))显然 \(dp_{i+1}=\sum\limits_{j=0}^idp_j(i+1-j)^2\),考虑把最后一项单独提出来,即 \(dp_{i+1}=\sum\limits_{j=0}^{i-1}dp_j(i+1-j)^2+dp_i\),把括号打开即有 \(dp_{i+1}=\sum\limits_{j=0}^{i-1}dp_j(i-j)^2+2\sum\limits_{j=0}^{i-1}dp_j(i-j)+\sum\limits_{j=0}^{i-1}dp_j+dp_i\)
我们记 \(a_i=\sum\limits_{j=0}^{i-1}dp_j,b_i=\sum\limits_{j=0}^{i-1}dp_j(i-j),c_i=\sum\limits_{j=0}^{i-1}dp_j(i-j)^2\)
可写成矩阵的形式,即对于关键点 \(i\),\(\begin{bmatrix}a_{i+1}\\b_{i+1}\\c_{i+1}\end{bmatrix}=\begin{bmatrix}1&0&1\\1&1&1\\1&2&2\end{bmatrix}\times\begin{bmatrix}a_{i}\\b_{i}\\c_{i}\end{bmatrix}\),否则 \(\begin{bmatrix}a_{i+1}\\b_{i+1}\\c_{i+1}\end{bmatrix}=\begin{bmatrix}1&0&0\\1&1&0\\1&2&1\end{bmatrix}\times\begin{bmatrix}a_{i}\\b_{i}\\c_{i}\end{bmatrix}\),这个同样可以矩阵 ksm 计算。时间复杂度同上。
本质地考虑这个优化
有限差分
定义 \(\Delta a_i = a_i - a_{i-1}\).
\(\Delta^2 a_i = \Delta a_i - \Delta a_{i-1}\)
\(\Delta^3 a_i = \Delta ^2 a_i - \Delta ^2 a_{i-1}\).
\(dp_i=\sum\limits_{j=0}^{i-1}dp_j(i-j)^2\)
对于这个 dp 式子,我们直接考虑常系数线性递推他,然后矩阵优化。
注意到次数只有两次,则差分三次后必定成为常数。
而式子中上界每次只变化 \(1\)。
相当于只会多出来一些 \(dp_i\)。
于是,我们直接计算 \(\Delta^3 dp_i\).
一定是一个 \(O(1)\) 项的递推式子,然后我们反推出 \(dp_i\) 的递推式即可。
trick:组合意义?
还有一个做法,看到平方想到组合意义。
看成是插板,然后块内放黑白两个小球的方案数(可以重叠)。
然后 dp 也是简单的。
E. Cake Trial
TFN 字符串,把 \(N\) 改成 \(T/F\),要求使得 \(f(l,r)\) 最小值最大。
\(f(l,r)\) 定义为 $ #T \in[l,r] +#F \in[1,l-1] + #F \in[r+ 1,n]$.
trick:数据范围推理
It is guaranteed that the sum of \(n^3\) over all test cases does not exceed \(500^3\).
则这题大概率是 \(O(n^3)\) 的。
做法
既然 \(O(n^3)\),则我们先不考虑二分。
刻画 \(f(l,r)\) 。
可以 \(T\to1,F\to-1\).
转化为最小子段和 \(+\) \(\# F\).
数据范围很小,考虑可以把一些东西记到状态里面。
可以考虑我们想要知道哪些东西?
\(\#F,i,s_i,\max s_j,\) 当前最小字段和。
发现 \(s_i\) 可以由 \(\#F\) 算出来,然后我们的 dp 值也可以保存一个东西。
于是我们用 dp 值保存最小字段和。
\(f_{i,\#F,pmx}\) 记录了只考虑前 \(i\) 位,\(F\) 的数量,前缀最大值(用来计算。
这样就能 \(O(N^3)\) dp了。
C. Revival
一个排列,每一个位置告诉你前缀的逆序对或者告诉你这个位置的值,还原这个排列。
发现正着不好做。
正着做,在用局部信息去猜测全局状态。
考虑倒着做。
可以发现会构成严格的限制,并发现唯一。

浙公网安备 33010602011771号