A - Reachable Towns
给定平面上 \(n\) 个点 \((x_i,\ y_i)\) ,其中 \(x_i,\ y_i\) 分别是 \(1,\ 2,\ \cdots,\ n\) 的排列
定义点 \(i\) 可以到达点 \(j\) 当且仅当 \(x_i<x_j,\ y_i<y_j\) 或 \(x_i>x_j,\ y_i>y_j\)
对于每个 \(1\leq k\leq n\) ,求出从 \(k\) 出发能走到多少个点
\(n\leq2\times10^5\)
如果只有条件 \(x_i<x_j,\ y_i<y_j\) ,按 \(x_i\) 考虑,维护 \(y_i\) 降序的单调栈,用并查集维护能走到的点的集合
对于条件 \(x_i>x_j,\ y_i>y_j\) 再扫一遍即可
时间复杂度 \(O(n)\)
B - Sum is Multiple
给定整数 \(n\) ,找到最小的正整数 \(k\) 满足 \(n|\frac {k(k+1)}2\)
\(n\leq10^{15}\)
可得 \(2n|k(k+1)\) ,而 \(k\) 与 \(k+1\) 互质
由于在 \(10^{15}\) 范围内一个数最多有 \(13\) 个不同的质因数,考虑枚举 \(2n\) 的每个质因数的若干次幂出现在 \(k\) 还是 \(k+1\)
容易发现这是若干个同余方程,使用 CRT 即可
时间复杂度 \(O(2^{\omega(n)}\omega(n)\log n)\)
C - Moving Pieces
有一个 \(n\times m\) 的网格,每个点上可以是空地、障碍或棋子
你每次可以执行以下操作:选择一个棋子,将其往下或往右移动一格,要求不能移出棋盘,且目的地不能是障碍或已经存在一个棋子
- \(n,\ m\leq50\)
- 保证棋子个数 \(\leq100\)
将棋子看做左部点,所有非障碍位置看做右部点,做带权二分图匹配即可
D - Keep Distances
给定数轴上 \(n\) 个升序的不同位置 \(X_i\) 和一个常数 \(k\)
有 \(q\) 次询问,每次给出 \([l,\ r]\) ,定义一个集合 \(S\) 是合法的当且仅当:
- 集合 \(S\) 中的每个元素均为 \(X_l,\ X_{l+1},\ \cdots,\ X_r\) 之一
- 对于集合中任意两个不同元素 \(x,\ y\) ,满足 \(|x-y|\ge K\)
- 满足上述两个条件的前提下,集合 \(S\) 的大小尽量大
你需要对于该询问找到所有合法集合的并的大小
- \(n,\ q\leq2\times10^5; K\leq10^9\)
- \(1\leq X_1<X_2<\cdots<X_n\leq10^9\)
对于单次询问 \([l,\ r]\) ,记 \(cnt\) 为合法集合的大小, \(f(i)\) 是满足区间 \([l,\ f(i)]\) 中合法集合大小为 \(i\) 的最小位置, \(g_i\) 是满足区间 \([g(i),\ r]\) 中合法集合大小为 \(i\) 的最大位置
不难发现答案等于 \(\displaystyle\sum_{i=1}^{cnt}g(i)-f(cnt-i+1)+1\)
若 \(g(i)<f(cnt-i+1)\) ,可以反证得到合法集合大小小于 \(cnt\)
而对于开区间 \([f(cnt-i+1),\ g(i)]\) 中的元素 \(x\) ,可以将位置 \(f(cnt-i+1)\) 和 \(g(i)\) 替换成 \(x\) 得到一个新的合法集合
因此可以将求和拆开,用倍增维护集合,时空复杂度 \(O(n\log n)\)
原文:https://www.cnblogs.com/Juanzhang/p/13714526.html