摘要:
设计dp状态为f[i]表示以i为根的子树能到达正确答案的概率是多少,那么f[1]就是答案 当我们先行计算出他儿子的答案时,根据独立性以及反方向考虑,我们只需要知道一次不能到达正确答案的概率,之后重复size遍,用1去减就是答案 #include<bits/stdc++.h> using namesp 阅读全文
摘要:
首先要抽象出模型,我们其实只需要管自己选啥英雄就行,因为这是有限制的,其他的直接使用组合数计算之后乘上就行 对于自己选的英雄,有5层,每层100个,最朴素的想法是枚举每人选什么,但是5层for循环超时了,但是4层for循环就很合理 因此我们只枚举前4层,之后看看第五层还能选啥就行。 #include 阅读全文
摘要:
对于本题,可以发现是一种bfs不断向外扩展的情况,也就是当某个点周围所有比他小1的点都更新过他了,那么他才可以更新别人,这里就有一种拓扑排序的思想 又因为题目告诉我们要找最长的,因此我们最后的答案某点,不能向外扩展,因此可以维护出度和入度,以入度为更新标准,以出度为是否能作为答案 之后拓扑时直接修改 阅读全文
摘要:
对于这题,我们发现1和3点是同类点,因此其实就是二分图染色,如果只有一个连通块,那么判断一下是否是二分图就行。 现在有多个连通块,因此我们还要判定一下能否把这些2分给这么多个连通块 因此可以做一下背包,先存一下每个连通图的信息,之后dp,除了维护可达性,还要维护一个把图的哪部分分给2 如果最后不能分 阅读全文
摘要:
这道题的状态可以设计为f[i][j]表示在以i为根的子树上,深度最小为j的最大值。这个深度是相对于子树的深度 因此我们枚举深度去更新当前子树答案,在第一次更新的时候,先去求深度恰好为j的答案,之后倒序取一遍max就是答案 如果深度为0,就是选择根节点,那么只要把所有子树中>=k的位置选进来就行(这里 阅读全文
摘要:
分块预处理,表示f[][],第i块到第j个数的答案 这样做的时候就可以大块直接查询,小块暴力查询 #include<bits/stdc++.h> #define getsz(p) (p?p->sz:0) using namespace std; typedef long long ll; typed 阅读全文
摘要:
这里必须要全部存图而不能直接判断原先最短路和给定特殊边的关系 因为我们如果用了某个特殊边,其实会影响到其他点最短路,使得他的最短路更小,我们直接判断,会导致本身的可以被删掉的答案,因为没用特殊边而不能删掉 所以本题的做法是,全部存下来后,记录某个点的最短路的个数 如果特殊边大于最短路,那就直接删掉 阅读全文
摘要:
这道题需要做一下模型转换,首先我们发现给定的边其实构成一个补图 如果我们暴力做这道题,那么就是遍历所有点,限制题目的边这样做收到了点的个数的制约 而我们可以这样想,我们把给点的边构图,那么其实就是求取他的补图的连通性 这里有一个好的发现就是,对于原来复杂度超时的代码来说,肯定是点数太多,才会超时,但 阅读全文
摘要:
设计二维dp状态为f[][],处理到i,比原来方案多j的答案是多少 这样可以根据h[i]和h[i+1]来作比较得到 这里因为多j个可能是负的,也就是当前答案不一定是正的,因此我们考虑坐标平移2001个位置,把2001这个点当作原点,这样不会产生边界情况 #include<bits/stdc++.h> 阅读全文
摘要:
这题我们显然可以发现,一个点越被迟处理越优,因此可以先预处理一波,接下来我们发现,如果贪心的在某个点最后可以取的位置去掉,那么可能会出现到后来不够的情况 因此其实我们可以使用反悔贪心的思路,先都取掉,用优先队列维护之前取掉的贡献值,从小到大排序 如果不够了,就把最小的那个去掉,这样兵力就能+1,因此 阅读全文