2022.7~9 杂题
P6620 [省选联考 2020 A 卷] 组合数问题
组合数配合下降幂有优秀的性质:
将 \(f(x)\) 转化为下降幂多项式:
对于其中的每一项 \(b_kx^{\underline{k}}\),分别计算答案:
时间复杂度 \(O(m^2)\)。
P4216 [SCOI2015] 情报传递
简单题。
离线,算出每个点开始 \(+1\) 的最早时间 \(t_u\),那么在 \(T\) 时刻的查询 \((u_i,v_i,c_i)\),就相当于查询 \(u_i\to v_i\) 的链上,有多少个满足 \(t_x<T-c_i\) 的 \(x\)。差分成四个询问,然后树状数组即可。
AT2044 [AGC004D] Teleporter
因为模拟赛被贪心爆杀了,所以来做几道贪心。
首先,这是一棵基环树,且一号城市在环上。那么一号城市肯定需要连向自己,因为如果形成大小 \(>1\) 的环,就一定存在一个点,走 \(K\) 步不能走到 \(1\)。将这个自环去掉,剩下的就是一棵内向树,“恰好 \(K\) 步后能走到 \(1\)”就变成了“每个点到 \(1\) 的距离不超过 \(K\)”。
考虑从下往上贪心,每次若一个子树的深度 \(\ge K\),就令答案加一。
const int N = 1e5 + 5;
int n, k, ans;
vector<int> e[N];
int DFS(int u) {
int res = 0;
for (int v : e[u]) {
int cur = DFS(v);
if (u > 1 && cur == k - 1) ++ans;
else res = max(res, cur + 1);
}
return res;
}
至于这个贪心是怎么想到的,我也不知道,因为我没想到。
P1645 序列
按区间右端点从小到大排序,如果区间内元素个数少于要求的个数,就贪心地从右端点往左填,时间复杂度 \(O(N^2)\)。
AT2169 [AGC007B] Construct Sequences
先考虑那个 \(a_{p_1}+b_{p_1}<a_{p_2}+b_{p_2}<\dots<a_{p_n}+b_{p_n}\) 的限制。假如不需要满足 \(a\) 单调增,\(b\) 单调减,那么令 \(a_{p_i}=i,b_i=0\) 即可。
发现这样构造的话,\(|a_i-a_{i+1}|<N\)。因此,令 \(a_i\gets a_i+i\times N,b_i\gets 10^9-i\times N\) 即可。
P2751 [USACO4.2] 工序安排Job Processing
首先,假如只有操作 A,那么对于每个工件 \(i\),找到那个生产它的结束时间最短的机器即可。设这样求出的结束时间是 \(t_i\),显然 \(t\) 单调不降。
考虑操作 B,我们会让 \(t\) 越大的匹配效率越高的机器。对于每个机器 \(j\),设 \(b_j\) 是它生产一个工件需要的时间,\(c_j\) 是它的使用次数,那么倒序枚举 \(i\),每次找到一个 \((c_j+1)b_j\) 最小的 \(j\),工件 \(i\) 的生产时间就是 \(t_i+(c_j+1)b_j\)。
但有一种情况是:对于两个工件 \(i<j\),\(j\) 在进行完 A 操作时,\(i\) 有足够的时间进行 A 和 B 操作。假如 \(i,j\) 使用的 B 机器不同,则这种情况显然不影响。否则,设它们使用的 B 机器是 \(k\),需要满足:\(t_i+b_k\le t_j,t_i+2b_k>t_j+b_k\)。发现这两个不等式是矛盾的,于是这种情况不会影响答案。
时间复杂度 \(O(N\log M)\)。