06 2020 档案
摘要:题面传送门 代码难度稍大,思路其实不难。 题目求最大最小,那么就是二分。 那么怎么验证呢。 首先预处理出所有航线的时间,然后跑出大于的航线,在树上差分。 只有每一条航线都经过的路径才可能满足要求,所以先找出这样的路径。 对于每一条边,我们都把权值放在下面的节点上,这样的话就可以直接跑一遍验
阅读全文
摘要:题面传送门 树剖裸题,感觉难度虚高。 当两个部落开战时,我们就把下面那个点的权值设为,休战则设为即可。 这样有一个好处就是查询时如果有可以直接跳出。 其他基本操作。 代码实现: #include<cstdio> #include<cstring> using namespace s
阅读全文
摘要:题面传送门 很裸的一道题。感觉难度虚高。 可以先把这棵树的欧拉序跑出来,然后每次询问是根节点到当前点的权值,那么树状数组随便维护一下就好了。 代码实现: #include<cstdio> #include<cstring> using namespace std; int n,m,k,x,y,ans
阅读全文
摘要:题面传送门 因为只有一次贸易,所以可以枚举中转点。 从点出发跑最小值,从点出发跑最大值,这个贪心应该都懂。 然后枚举中转点,注意跑不到的点不能枚举。 代码实现: #include<cstdio> #include<cstring> #include<queue>
阅读全文
摘要:题面传送门 普通树剖,注意线段树标记下推清零时左右儿子的懒标记要清零 代码实现; #include<cstdio> #include<cstring> #define max(a,b) ((a)>(b)?(a):(b)) using namespace std; int n,m,k,son[1000
阅读全文
摘要:题面传送门 感觉评分虚高。 其实和的软件包管理器差不多,题解 正常操作,直接区间覆盖即可。 一不小心拿了个次优解 代码实现: #include<cstdio> #include<cstring> using namespace std; int d[500039],idea,siz
阅读全文
摘要:题面传送门 卡语言太恶心所以来洛谷上交了。 正常树剖不解释但是有些地方可以写法优化。 比如线段树只要一个数组就够了。 代码实现: #include<cstdio> #include<cstring> #define max(a,b) ((a)>(b)?(a):(b)) using nam
阅读全文
摘要:题面传送门 第一次一遍过国集紫题。好激动。 一看就是树剖,只不过操作有点多。 把每条边的权值放在儿子节点即可。 对于取相反数放懒标记即可。 其他是树剖正常操作。 代码实现: #include<cstdio> #include<cstring> #define max(a,b) ((a)>(b)?(a
阅读全文
摘要:题面传送门 这里可以把边权转化成点权,即把边的值放在儿子节点上,这样能确保唯一性。 而这样的话就不能算了,可以通过处理掉。 树状数组维护即可。 代码实现: #include<cstdio> #include<cstring> using namespace std; int n
阅读全文
摘要:题面传送门 一眼看上去就是树剖裸题。 线段树无所不能,连异或都可以维护。直接树剖即可。 代码实现: #include<cstdio> #include<cstring> using namespace std; int n,m,k,idea,son[100039],siz[100039],d[100
阅读全文
摘要:题面传送门 终于出了一道水题。 因为软件包之间有依赖,所以删除一个要把子树删完。安装一个要把路径上全部安装掉。直接树剖即可。 代码实现: #include<cstdio> #include<cstring> using namespace std; int n,m,k,x,y,son[10
阅读全文
摘要:题面传送门 直接树链剖分即可,还比模板少两个操作。 代码实现: #include<cstdio> #include<cstring> using namespace std; int n,m,k,x,y,idea,son[100039],d[100039],fa[100039],top[100039
阅读全文
摘要:题面传送门 这道题目蛮好的。 首先暴力不可取,会 考虑分类讨论,把一段路径分为上行与下行。 设为节点的深度,则在上行时被观察到当且仅当,下行也可推出当且仅当 那么直接在树上差分哪一段有贡献。 求答案就是在子树内找与那个数相同的
阅读全文
摘要:题面传送门 看到树,想到树剖。 然而线段树维护不了这么高次项的数啊。 再转眼一看, 那不就可以直接前缀和了吗? 这道题在省选时极其卡时限,所以可以先预处理出深度的次方。然后直接树上前缀和即可。 代码实现: #include<cstdio> #include<cstrin
阅读全文
摘要:题面传送门 其实这道弱省省选还蛮简单的。 稍微思考一下我们就可以得出一个结论:集合点肯定在三个点中某两个点的上。 因为无论这个点朝哪个方向移都是靠近一个点远离两个点肯定不会更优。 所以我们可以先跑出三个点的然后再分别算答案输出。 但是这样要跑遍,在
阅读全文
摘要:题面传送门 这道题是树剖模板。 树剖第一步:,找出每个点子树大小,父亲节点,重儿子,深度。 第二步:,找出每个点编号,把原来的权值赋值过来,先标重儿子再标轻儿子,标记每个链顶。 这里最大的点最多只有条链。 因为每更换一条链都要一个轻链,而点数会除以
阅读全文
摘要:题面传送门 这道题很明显是要我们求强连通分量。我们可以用求。 对于的求法,是这样做的: 记录第几个访问到:用一个数组。 记录这个点的子树能访问到的最早访问到的点,为。 记录一个栈,表示没有弹出的点。 记录,表示是否在栈里。 对于每个点,从
阅读全文
摘要:题面传送门 感觉这道紫题质量还是可以的。 我们先跑一遍求出图的割点,然后根据割点将图割开。对于每个连通块,分类讨论: 如果没有接触到割点,那么要设两个点,因为要考虑原来那个塌了的情况。方案数乘上 如果只有一个割点,那么为了防止割点崩塌,得设一个,方案数乘上 如果
阅读全文
摘要:题面传送门 这是一道主席树的模板题。 很遗憾,被我卡掉了 lxl 显然这么小的空间主席树是肯定过不去的,空间复杂度,开满约,只有分。 考虑优化。 我们的主席树的划分是这么写的 m=(l+r)>>1 之所以要开四倍空间,是因为会有这样的东西所以不能用主席树。
阅读全文
摘要:题面传送门 一眼就是势能线段树的模板题。 关于欧拉函数的上界我不会证,这里证一个复杂度下界。 对于每一个数,其最大的约数最大是都必定不是的约数,所以复杂度下界,总复杂度 代码实现: #includ
阅读全文
摘要:题面传送门 明显是换根,转移时讨论一下就好了。 代码实现: #include<cstdio> #include<cstring> #define max(a,b) ((a)>(b)?(a):(b)) using namespace std; int n,m,k,head,h[1000039]
阅读全文
摘要:: 开场感觉的第一题出到来了(滚粗)然后用前缀和水水就过了。第二题感觉像是矩乘板子,推了一下确实满足交换律,然后就打了一个矩阵快速幂(滚粗),感觉复杂度很不可行,于是写了一些常数优化,最后也没卡进。第三题匆
阅读全文