随笔分类 - 题解
摘要:"题目" 贪心,可以用分类讨论的方法,可以得出如果n2n2枚举则会过不了,而我们观察原题中的式子,有: ∣x1−x2∣+∣y1−y2∣∣x1−x2∣+∣y1−y2∣ 发现式子中的绝对值很恶心,而考虑如果没有绝对值的话会有四种情况。 1. (x1x2)+(y1y2)=x1+y1(x2+y2)(x1x2)+(y1y2)=x1+y1(x2+y2) 2. $(x1 x2)
阅读全文
摘要:"题目" 方法很多,最经典的是用搜索的算法,也就是IDAIDA算法搜索。 IDAIDA算法是每次规定一个搜索深度,并在搜索的时候限制该搜索深度,从而达到把深搜的优点和广搜的优点结合起来优化时间的一个算法。 说白了,就是一个剪枝借鉴了广搜的思想。 c++ include using namespace
阅读全文
摘要:"题目" 该题目就是求这n个数的前缀和所组成的数组的所有子区间的左端点和右端点相差不超过m,且他们的前缀和差最大,求出这个最大值即可。 而朴素算法肯定会T,而我们发现如果前缀和最大的话,则前缀和的值一定是满足单调递增的,因此可以用单调队列优化。
阅读全文
摘要:"题目" 一道单调栈裸题,主要是用单调栈维护单调性,和单调队列都可以在O(n)O(n)的时间内得出单调最大值或最小值,要比堆要快。 这个题可以用h来当做单调栈的使用对象,即用单调栈来维护高度,高度是越在栈深处越大,元素下标是越在栈深处越小。 CodeCode:
阅读全文
摘要:"题目" 最短路+DP 最短路可以用floyd或者spfa来处理出1到n的所有时间区间的最短路。 dis[i][j][k][l]dis[i][j][k][l]表示i到j在k,lk,l时间内每个时间点都能走的节点的i,ji,j之间的最短路。 因此我们可以预处理出来最短路,然后开始DP,设置dp[i]dp[i]为1到i之间的所有时间的最短
阅读全文
摘要:"题目" 搜索加贪心其实并不需要用到DPDP,搜索也是比较简单地搜索。 对于每个第一行的城市进行类似于滑雪那道题的搜索,然后记录最后一行它所覆盖的区间,易得一个一行城市只会有一个区间。然后可以在最后进行线段覆盖贪心即可求出答案。要注意区间闭开和边界问题。 CodeCode
阅读全文
摘要:"题目" 堆+模拟,还有一个小优化(优化后跟堆关系不大,而是类似于贪心)。 如果不加优化的话,卡常可以卡到85。 思路是对于对每一秒进行模拟,用堆来维护动态的最大值,然后对于每个长度都加q的情况可以用一个中间变量temp来处理。 85pts的Code : c++ include include
阅读全文
摘要:"题目" 跟奶酪那道题差不多,用并查集来求解。 用二分,或可以用类似于克鲁斯卡尔算法的贪心来每次判断是否起点和终点已经并在一个集合里(类似奶酪) 如果已经覆盖就结束判断并得出答案:即当前选择的边的最大值。 为什么是边的最大值呢。 我们考虑最小的工作半径一定是等于两点间的一个距离,如果大于一个两点间的
阅读全文
摘要:"题目" 暴力能得30,正解需要其他的算法操作,算法操作就是用秦九韶算法来优化。 秦九韶算法就是求多项式的值时,首先计算最内层括号内一次多项式的值,然后由内向外逐层计算一次多项式的值,然后就将求n次多项式的算法转化为求n个一次多项式的算法。 但是这样只能得到30分,用高精也只能拿50分,
阅读全文
摘要:"题目" LCT,或者并查集水过。 首先并查集这道题不能路径压缩,因为路径压缩是为了用牺牲一些信息的方法来加快速度,可是这道题我们需要这个信息,所以不能路径压缩。 剩下的操作就只剩下了暴力并查集,而每次查询前都要使u所在的树换根,使u换为该树的根,可以方便查询。
阅读全文
摘要:"题目" 不看数据范围的话是一个很简单的DP,可是加上数据范围之后就之前的做法就不行了。 所以我们考虑一下路径压缩。 小数据Code c++ include include include using namespace std; int l, m, s, t, dp[100010]; int fl
阅读全文
摘要:"题目" 该题目标签是DP,但是其实数据范围可以用记忆化搜索来解决,并且代码实现起来会简单一些,用二分查找来优化。 c++ include using namespace std; int n, k, minn = 2147483647, dp[101000]; multimap m; struct
阅读全文
摘要:"题目" 一道经典的树形dp,其树形DP的原理是递归求解树状结构,并返回已经确立的状态值,形式多为记忆化搜索形式。而树形DP也常常跟其他DP联系起来,这道题就是将树形DP和背包DP联系起来的一道题。 而且该题是01背包,所以要注意i,j的枚举顺序。还要注意j和k的取值范围。 Code c++
阅读全文
摘要:"题目" 博弈论。 考虑先手和后手的关系。然后可以通过统计数值不是0的数的个数来得出答案。 Code c++ include using namespace std; int main() { int n, ans = 0, a[1010]; scanf("%d", &n); for (int
阅读全文
摘要:"题目" 博弈论+贪心。 由于我们是先手,所以我们其实是必赢的,而且其实选完前两次,就已经结束了,因为接下来选的每一次其实都没有我们前几次选的好。而且又因为机器人会把我们想选的最好的拿走,那我们就只能拿走次好的了。然后枚举排序就可以得出答案。 Code c++ include define in
阅读全文
摘要:"题目" 一道很经典的搜索题,可以锻炼搜索的能力,比如可以用dfs覆盖加dp的方式来寻找+更新答案。而且还可以通过在递归中增加数组的方式来辅助搜索。 c++ include using namespace std; int n, k, ans[101000], maxn, tot, a[101000
阅读全文
摘要:"题目" 草鉴定,tarjan可以用来缩点,优化spfa的时间, 缩点之后就是一个DAG了,因此完全可以用来跑spfa上的最长路,然后枚举每条边,查看是否这条边的两个节点分别可以到达起点所在的强连通分量。(因为要返回到1点)。然后更新答案就可以了。 可是为什么要缩点呢,因为只能逆行一次,逆行之后
阅读全文
摘要:"题目" 割点模板题。 可以将图中的所有点分成两部分,一部分是去掉之后不影响图的连通性的点,一部分是去掉之后影响连通性的点,称其为割点。 然后分两种情况讨论,如果该点不是割点,则最终结果直接加上2 (n 1)。如果是的话,就求子树的每块连通块大小。 一个点的子树可以分成两类:存在返祖边或不存在。 对
阅读全文
摘要:"题目" 一道悬线法的裸题,悬线法主要是可以处理最大子矩阵的问题。 而这道题就是比较经典的可以用悬线法来处理的题。 而悬线法其实就是把矩阵中对应的每个位置上的元素分别向左向上向右,寻找到不能到达的地方,然后递推或者说是DP,这样在每次递推完之后就可以更新最小值了。 [heighti,j]
阅读全文