A
略
B
反射一次后就变成从一个平行四边形的右下角到左上角经过多远,可以递归解决,重复过程用除法处理
注意处理其中一边是另一边整数倍的情况
C
当 (k = 2d) 时,枚举最后作为直径中点的点,然后深度大于 (d) 的点都要被续掉,统计并更新答案即可
(k) 为奇数时同理
D ( riangle)
猜结论+构造
没看懂题解
咕咕咕
E ( riangle)
wtcl,又没想出来
把组合数转化为网格路径数,算是比较常用的技巧
考虑 (inom{a_i + b_i + a_j + b_j}{a_i + a_j}) 的组合意义:
从 ((-a_i, -b_i)) 只能往上或往右走到 ((a_j, b_j)) 的路径数
令 (f[j][k]) 表示以所有的 ((-a_i, -b_i)) 为起点,走到 ((j, k)) 的路径数,答案即为
F ( riangle)
神仙题
首先我们把每个数的位置列出来,就变成了当相邻两项之差大于等于 (k) 可以交换
然后可以发现令原排列字典序最小等价于让现在这个排列字典序最小
下面所有讨论以 (i < j) 为前提
考虑两个数 (a_i) 和 (a_j) ,当 (|a_i - a_j| < k) 时显然它们的相对顺序是不会改变的,记做 (a_i ightarrow a_j)
对于 (|a_i - a_j| geq k) 的情况, 易证 (a_i) 一定在 (a_j) 之前,当且仅当存在 (a_x) 满足 (a_i ightarrow a_x) 且 (a_x ightarrow a_j)
根据上面的性质我们可以得到一个 (O(n^2)) 的暴力:
把 (a_i) 向所有满足 (|a_i - a_j| < k) 的 (a_j) 连边,得到一个DAG,然后在这个DAG上拓扑排序,跑个贪心,可以用堆实现
接下来考虑如何优化连边,假设 (a_i) 后的所有数都已正确地连边,现在要对 (a_i) 进行连边
令 (a_j) 为 ((a_i - k, a_i + k)) 中下标最小的一个,它会向 ((a_j - k, a_j + k)) 中所有数连边,注意到 ((a_j - k, a_j + k)) 和 ((a_i - k, a_i + k)) 是有交集的,所以实际上只需要连两条边就能覆盖所有限制,实现时可以取 ((a_i - k, a_i)) 和 ((a_i, a_i + k)) 中各自下标最小的,线段树维护即可,复杂度 (O(n log n))