随笔分类 - qzezoj
摘要:题面传送门 就这道题我打了一个小时我太菜了。 首先这道题爆搜不可取算了吧。 然后其实这道题可以dp 因为乘法和加法不同所以分开来算。 先算乘法,定义区间内组成值的最小操作数。这个区间就可以了。复杂度 然后考虑加法,同样也是一样的
阅读全文
摘要:用脚找一下规律就会发现可以构成最后一项为全部异或和的循环节。 那么前缀异或就好了。 代码实现: #include<cstdio> using namespace std; int n,m,k,z; long long a[1000039],q[1000039],ans,x,y; int main()
阅读全文
摘要:当然这道题可以跑最小生成树。 但是那样时间复杂度是,可以被卡掉。 这里有一个跑不满的 就是每次拿到一条边,就搜索是否联通。 不连通就加上去 联通就找到最大的那条边,看看能不能替换,能换就换。 代码实现: #include<cstdio> #include<cstr
阅读全文
摘要:题面传送门 我们可以二分这个值。 然后验证时将所有数字减去这个值,看看有没有长度大于权值之和大于的子段就好了。 代码实现: #include<cstdio> #include<cstring> #include<algorithm> #define max(a,b) ((a)>(b)?(
阅读全文
摘要:题面传送门 这个对于每个边跑拓扑序即可,如果有环那么不可行,如果两个字母拓扑序相同也不可行。 代码实现: #include<cstdio> #include<cstring> #include<queue> #include<algorithm> using namespace std; int n
阅读全文
摘要:题面传送门 直接建分层图跑即可。 注意一些细节即可。 代码实现: #include<cstdio> #include<cstring> #include<queue> #define abs(x) ((x)>(0)?(x):-(x)) #define max(a,b) ((a)>(b)?
阅读全文
摘要:题面传送门 对于一个点,考虑如果把它和它的子树断开来。 断主要边肯定是断和父节点连着的边。 断次要边统计子树内有几条次要边连向外面。 如果只有一条,那么就断这一天, 如果没有,那么随便断,加上次要边边数即可。 统计子树内边数可以用树上差分 时间复杂度 代码实现:
阅读全文
摘要:题面传送门 题目中要求最小路径生成树的方案数。 先跑一遍把最小路径跑出来,然后对于每个点枚举边,看看有几个点是可以转移,然后乘法原理计数即可。 代码实现: #include<cstdio> #include<cstring> #include<queue> #include<algori
阅读全文
摘要:题面传送门 题目大意:构造一个完全图,使得在最小生成树唯一(题目中给出)的情况下权值总和最小。 直接克鲁斯卡尔模拟,在合并两棵树时进行操作。 合并两棵树时要连的边的条数是,即将合并的这条边一定是两棵树中最大的边,而所有不在最小生成树内的边一定大于这条边,所以
阅读全文
摘要:题面传送门 分做法见这里 正解是线段树+分治。 我们尝试在线段树上跑分治,则维护线段树每个节点的有几个位置没被选两边跑分治就好了。 代码实现: #include<cstdio> using namespace std; int n,sum[4000039],now[1000039],a[10
阅读全文
摘要:题面传送门 分做法参考这篇博客 考虑在分做法上优化。 分是一个一个找的。我们可以用树状数组维护序列为之前有几个位置被占了。 则当时,,这满足二分的性质,所以我们可以二分找位置。 时间复杂度 代码实
阅读全文
摘要:题面传送门 题目告诉我们,没有三点共线,所以我们可以容斥。 两条线,相等,即平行。那么我们可以用总可能数-条直线平行-条直线平行。 用来判断平行线。 代码实现: #include<cstdio> #include<cstring> #include<cmath> #
阅读全文
摘要:题面传送门 考虑用哈希折半搜索来解决。 观察以下原式考虑移项得到,那么两边就可以分别枚举了。 代码实现: #include<cstdio> #include<cstring> #include<cma
阅读全文
摘要:题面传送门 对于这道题,正着枚举是很难枚举的,但我们可以反着来。 俗话说得好,正难则反。 考虑最小的一个数,则所有数都是大于等于它的,所以它的排位应该是在。 考虑第二小的数,则除了没有其他数小于它,所以我们可以直接找到除了外的第位,它的答案就是
阅读全文
摘要:题面传送门 考虑把两个操作合并,会发现把每个分为一组,会剩下第个。 则我们可以很容易地推出递推式: 则我们就可以很容易地找到最后剩下的位置了。 那么根据位置求数字就很简单了。 代码实现: #include<cstd
阅读全文
摘要:题面传送门 直接暴力,判断当前点和下一个单位时间有没有石头,并且当时间时就跳出。 为什么是呢? 考虑极端情况,一块石头在的位置,如果这块石头掉到底部要单位时间,然后如果现在再开始走,走到终点要个单位时间。 代码实现: #include<cstdio
阅读全文