这里会显示出您选择的修订版和当前版本之间的差别。
| 后一修订版 | 前一修订版 | ||
|
2020-2021:teams:die_java:front_page_springtraining7 [2020/05/30 08:51] fyhssgss 创建 |
2020-2021:teams:die_java:front_page_springtraining7 [2020/05/30 08:54] (当前版本) fyhssgss |
||
|---|---|---|---|
| 行 6: | 行 6: | ||
| * 时间:2020-5-24 13:00~18:00 | * 时间:2020-5-24 13:00~18:00 | ||
| - | * rank:2/30 | + | * rank:''%%2/30%%'' |
| - | * 完成情况:10/10/12 | + | * 完成情况:''%%10/10/12%%'' |
| ===== 题解 ===== | ===== 题解 ===== | ||
| 行 26: | 行 26: | ||
| 线段树维护最大独立点集合的和,维护信息为$mx[o][0/1][0/1]$表示$o$节点的答案,端点的数值选或者没选。 | 线段树维护最大独立点集合的和,维护信息为$mx[o][0/1][0/1]$表示$o$节点的答案,端点的数值选或者没选。 | ||
| + | <hidden 代码> | ||
| <code cpp> | <code cpp> | ||
| #include<iostream> | #include<iostream> | ||
| 行 83: | 行 84: | ||
| } | } | ||
| </code> | </code> | ||
| + | </hidden> | ||
| + | |||
| ===== ===== | ===== ===== | ||
| 行 97: | 行 100: | ||
| 路径一定是起始点到指定点再到终点,对 $k$ 个点跑最短路即可,询问的时候枚举到哪个指定点算最小值。 | 路径一定是起始点到指定点再到终点,对 $k$ 个点跑最短路即可,询问的时候枚举到哪个指定点算最小值。 | ||
| + | <hidden 代码> | ||
| <code cpp> | <code cpp> | ||
| #include<iostream> | #include<iostream> | ||
| 行 177: | 行 181: | ||
| } | } | ||
| </code> | </code> | ||
| + | </hidden> | ||
| ===== F. Combination Lock ===== | ===== F. Combination Lock ===== | ||
| 行 192: | 行 197: | ||
| $dp[i][j]$表示从$i$转移$j$的最佳收益,正常DP的话还需要枚举一个$k$,复杂度是$O(n^3)$。根据转移方程$dp[i][j]=max\{dp[k][i]\}+a[j],x[i]-x[k]\leq x[j]-x[i]$,发现$dp[k][i]$可以用单调队列维护最大值,所以复杂度降为$O(n^2)$ | $dp[i][j]$表示从$i$转移$j$的最佳收益,正常DP的话还需要枚举一个$k$,复杂度是$O(n^3)$。根据转移方程$dp[i][j]=max\{dp[k][i]\}+a[j],x[i]-x[k]\leq x[j]-x[i]$,发现$dp[k][i]$可以用单调队列维护最大值,所以复杂度降为$O(n^2)$ | ||
| + | <hidden 代码> | ||
| <code cpp> | <code cpp> | ||
| #include<bits/stdc++.h> | #include<bits/stdc++.h> | ||
| 行 251: | 行 257: | ||
| } | } | ||
| </code> | </code> | ||
| + | </hidden> | ||
| + | |||
| ===== H. Crowded Cows ===== | ===== H. Crowded Cows ===== | ||
| 行 263: | 行 271: | ||
| 讲所有奶牛按坐标排序,然后预处理一下RMQ维护一下区间奶牛的最大值,在统计时直接查询两端区间最大值是否满足大于二倍关系即可。 | 讲所有奶牛按坐标排序,然后预处理一下RMQ维护一下区间奶牛的最大值,在统计时直接查询两端区间最大值是否满足大于二倍关系即可。 | ||
| + | <hidden 代码> | ||
| <code cpp> | <code cpp> | ||
| #include<bits/stdc++.h> | #include<bits/stdc++.h> | ||
| 行 307: | 行 316: | ||
| } | } | ||
| </code> | </code> | ||
| + | </hidden> | ||
| ===== J. No Change ===== | ===== J. No Change ===== | ||
| 行 318: | 行 328: | ||
| 状压dp,$f[S]$ 表示用集合 $S$ 最多能买到的位置,转移的时候枚举用哪个硬币,在前缀和序列上二分即可 | 状压dp,$f[S]$ 表示用集合 $S$ 最多能买到的位置,转移的时候枚举用哪个硬币,在前缀和序列上二分即可 | ||
| + | <hidden 代码> | ||
| <code cpp> | <code cpp> | ||
| // luogu-judger-enable-o2 | // luogu-judger-enable-o2 | ||
| 行 356: | 行 367: | ||
| } | } | ||
| </code> | </code> | ||
| + | </hidden> | ||
| + | |||
| ===== ===== | ===== ===== | ||
| 行 381: | 行 394: | ||
| 模拟,直接从头开始走,转两圈就可以了 | 模拟,直接从头开始走,转两圈就可以了 | ||
| + | <hidden 代码> | ||
| <code cpp> | <code cpp> | ||
| #include<iostream> | #include<iostream> | ||
| 行 437: | 行 451: | ||
| } | } | ||
| </code> | </code> | ||
| + | </hidden> | ||
| ===== 训练实况 ===== | ===== 训练实况 ===== | ||