摘要:
首先做一遍最小生成树,其次,如果某条未在生成树当中的边可以替换端点之间的边的话,那么证明它存在新的最小生成树。 因此我们要将这条的权值加到比路径上的最大边大1的情况,才能做到这条边无用 #include<bits/stdc++.h> using namespace std; typedef long 阅读全文
摘要:
关注一下互相看到的问题,因为只有这样才是一对。我们按r排序,这样只需要关注一个点和他左边点的关系 因为如果它能看到左边的,左边的一定能看到他。之后我们要求的是一个二维数点的模型,这种模型我们考虑用cdq分治来解决。 如果能把智商排序,那么这样的用双指针就能维护全部,但是这题不能直接对整段排序,因为我 阅读全文
摘要:
我们发现一个点什么时候开始变化决定于离他最近的开始变化的点是哪个,因此只要求出最短距离即可 朴素的想法是通过bfs从每个点往外遍历,但是复杂度过高。其实可以考虑从步数考虑,从步数为1的不断往外扩展。这样不会炸内存,复杂度也满意 #include<bits/stdc++.h> using namesp 阅读全文
摘要:
我们观察到,如果奇数,只能由*2转移来,如果是偶数可以从x+1和x*2两种情况转移而来 因此我们通过式子画出集合,观察到我们应该奇偶判断,首先我们观察到画出树形结构后分别对于奇偶,存在单调性,因此可以二分 对于check,我们发现通过二进制的转换后,*2相当于右移1,*2+1相当于右移1后+1,因此 阅读全文
摘要:
首先我们发现因为每条边无限用,因此会有一种优先队列贪心的基本思路。只要每次弹出最小的路径就是答案。 但是如果每次都将所有边存入,取出最小边后又存入,这样会导致内存爆炸并且超时。 所以我们要想办法是否可以存一些必要的可能成为答案的边,首先我们将以i开始的边都存到对应的vector中 如果我们从优先队列 阅读全文
摘要:
我们发现由于b不减,c不增,所以如果ai>ai-1,那么就是b增加,不然就是c减少。因此最大值的答案就是max(b1+k,c1),k是两两之间大于0的差值。 我们发现两个答案越接近答案越小,因此最后的答案就是(a1+k)/2上取整。而对于修改操作直接在差分数组上计算贡献即可,注意边界条件 #incl 阅读全文
摘要:
首先我们观察到a数组是一个排列,并且k也是在1-n之间,说明我们的答案一定是不大于n+1 又因为第一种操作直接加了1e7,因此我们相当于将这个数剔除,也就是将这个数作为可选范围内。 我们要求的是大于k的数,并且不能与1-r之间的答案相同。 那么我们就要直接从线段树上k-n找答案。 因此我们只需要维护 阅读全文
摘要:
根据题意,寻找子串出现的第k次的开头。寻找第k大,一般可以想到用主席树来维护。 但是这题还需要更多的转化,首先想到我们如果想知道子串匹配,一个可以考虑kmp,但是因为询问过多,不太科学。 一般还有两种,一种是哈希算法,一种是后缀数组求lcp。考虑哈希算法,感觉可做性不是很大,因为他要多次匹配。考虑后 阅读全文
摘要:
算是比较常见的题型,我们要求在最短路的基础上求得最小的花费,因此使用迪杰斯特拉算法。 但是优先队列里面有两种情况,我们先要满足最短路,在最短路相同的情况下,我们对于花费大小进行判断 #include<bits/stdc++.h> using namespace std; typedef long l 阅读全文
摘要:
根据数据范围我们可以猜出是n^2的算法,其实可以看的出就是dp统计合法方案,但是本身这个序列不满足条件,因此要进行排序后再进行dp #include<bits/stdc++.h> using namespace std; typedef long long ll; typedef pair<int, 阅读全文