随笔分类 -  题解

摘要:对于两种权值的分别贪心维护,最后枚举一种权值选多少个,另一个二分出来,总复杂度 \(2\log\)。 点击查看代码 #include<cstdio> #include<iostream> #include<queue> typedef long long ll; inline int min(con 阅读全文
posted @ 2022-05-28 14:57 cunzai_zsy0531 阅读(33) 评论(0) 推荐(0)
摘要:做完 pkusc2022 day2t3 雀圣之后跑来做这题。 首先我们考虑雀圣那题。那个题是说给你一副 \(13\) 张的手牌,让你算向听数。设 \(dp[i][j][0/1][p1][p2][up][dn]=0/1\) 表示考虑到 \(i\) 花色第 \(j\) 张牌,是否已经有雀头,上张牌剩下 阅读全文
posted @ 2022-05-27 20:43 cunzai_zsy0531 阅读(228) 评论(0) 推荐(0)
摘要:题面 \(k=1\) 的时候就是边数 \(\times 2\) 再减去直径长度。考虑 \(k=2\) 的时候,减去的相当于是选出的两条路径的对称差。考虑一个贪心,第一次取某一条直径一定不会更劣,这个感性理解就好。然后把这个直径的边权都设成 \(-1\) 再跑一遍直径就行了。 点击查看代码 const 阅读全文
posted @ 2022-05-20 12:13 cunzai_zsy0531 阅读(29) 评论(0) 推荐(0)
摘要:题面 原题 \(n\leq 5000\),加强版 \(n\leq 10^5\),实际上能做 \(n\leq 10^6\)。 长链剖分。做这种很多点满足限制的题,套路差不多。设 \(f_{u,i}\) 表示 \(u\) 子树内到 \(u\) 距离为 \(i\) 的点数,\(g_{u,i}\) 表示 \ 阅读全文
posted @ 2022-05-20 12:11 cunzai_zsy0531 阅读(49) 评论(0) 推荐(0)
摘要:题面 需要动态维护一个点集的极小联通子图边权和。可以发现,将点集 \(\{a_i\}\) 中的点按照 dfs 序从小到大排序之后,\(dist(a_1,a_2)+dist(a_2,a_3)+\ldots+dist(a_{k-1},a_k)+dist(a_k,a_1)\) 恰好等于我们要维护的那个边权 阅读全文
posted @ 2022-05-20 12:08 cunzai_zsy0531 阅读(33) 评论(0) 推荐(0)
摘要:题面 基环树,树的部分容易发现,每个点的值都是确定的,也就是所有儿子的值的 \(mex\)。直接对非环部分进行树形 dp,考虑环上部分。由于环上的点都还有一条出边,所以如果环上的点通过树形 dp 求得的答案是 \(x\),那么它有两种可能:\(x\) 和所有儿子加入 \(x\) 后的 \(mex\) 阅读全文
posted @ 2022-05-20 12:07 cunzai_zsy0531 阅读(18) 评论(0) 推荐(0)
摘要:题面 由于乘起来不能是完全立方数,考虑对每个数质因数分解之后,所有的指数都 \(\bmod 3\),这样操作完之后,每个数都与唯一一个数对应(乘起来是完全平方数),即对于每个质因子,如果次数为 \(1\),对应的那个数的次数应该为 \(2\),反之同理。这样可以建立起一个一一映射,对于每个映射都只能 阅读全文
posted @ 2022-05-20 12:05 cunzai_zsy0531 阅读(44) 评论(0) 推荐(0)
摘要:题面 首先考虑没有环的情况,那么答案肯定就是 \(1\) 到 \(n\) 简单路径的边权异或和。如果出现环,设这个环边权异或和为 \(c\),从这条 \(1\) 到 \(n\) 简单路径到这个环的路径边权异或和为 \(k\),那么答案为 \(dis_n\oplus k\oplus c\oplus k 阅读全文
posted @ 2022-05-20 12:04 cunzai_zsy0531 阅读(30) 评论(0) 推荐(0)
摘要:题面 首先求出原数组的前缀 xor 数组 \(s\),这样相当于要在其中找两个值使其 xor 起来最大。 维护一个堆,里面有 \(n\) 个元素,分别为当前与 \(s_i\) 异或最大的数。每次取出来一个就把与当前这个 \(s_i\) 异或次大的数放进去,以此类推即可。使用类似线段树二分的方法可以做 阅读全文
posted @ 2022-05-20 12:02 cunzai_zsy0531 阅读(54) 评论(0) 推荐(0)
摘要:题面 题目中条件等价于给你一个点 \(a\),\(b\) 和 \(a\) 的深度差不能超过 \(w\),\(c\) 要同时在 \(a\) 和 \(b\) 的子树中。 考虑分类讨论: 若 \(b\) 是 \(a\) 的祖先,那么答案为 \(\min(dep_a-1,w)\times (siz_a-1) 阅读全文
posted @ 2022-05-20 12:00 cunzai_zsy0531 阅读(49) 评论(0) 推荐(0)
摘要:题面 首先可以注意到一点:如果这棵树确定了根节点,那么所有的蓝边都只能是爷爷-父亲-儿子这样的边,不可能有儿子-父亲-另一个儿子这样的(建不出来)。 基于上述结论的一个 \(O(n^2)\) dp就是:枚举根节点,设 \(f_{u,0/1}\) 表示 \(u\) 节点子树中,\(u\) 是否作为某一 阅读全文
posted @ 2022-05-20 11:58 cunzai_zsy0531 阅读(52) 评论(0) 推荐(0)
摘要:题面 罕见的数位dp好题。 首先感觉这个题想数位dp有点困难,很多东西都在变。注意到每个数位数字和其实最大也才一百多,考虑枚举这个和,统计被这个和整除且数位和等于这个和的数的个数就完事了。 点击查看代码 #include<iostream> #include<cstdio> #include<cst 阅读全文
posted @ 2022-05-20 11:54 cunzai_zsy0531 阅读(30) 评论(0) 推荐(0)
摘要:题面 这个题是二维的情况,一个点向一个矩形连边。一维的时候就是线段树优化建图,这里只能树套树优化建图了。但是这道题空间只有128MB,显然空间不能达到 \(O(n\log^2 n)\) 级别,所以考虑线段树套平衡树 (set) 来解决。 一个通常用来解决这种问题的方案是,不直接连边,而是把每个矩形在 阅读全文
posted @ 2022-05-20 11:53 cunzai_zsy0531 阅读(56) 评论(0) 推荐(0)
摘要:题面 这题很有意思,正解做法是线段树优化建图之后跑tarjan强连通分量然后在DAG上做一些奇奇怪怪的统计,但是这题有神仙 \(O(n)\) 做法!(虽然我不会证明但是跑的的确很快啊) 说的是,首先注意到先点一个,最后爆炸的炸弹一定是一个区间。所以现在问题转化成了对于每个 \(i\) 求爆炸的左右端 阅读全文
posted @ 2022-05-19 16:58 cunzai_zsy0531 阅读(27) 评论(0) 推荐(0)
摘要:题面 dp有后效性,转移看作边之后会成环。这时候一般需要建出图来跑最短路。 这道题的最短路有些不一样,方程为 \(f_i=\max(a_i,b_i+\sum\limits_j f_j)\),比较像最短路的松弛操作。spfa每次从队列里取出 \(u\) 来之后,遍历所有相邻点 \(v\),记录一个和, 阅读全文
posted @ 2022-05-19 16:51 cunzai_zsy0531 阅读(24) 评论(0) 推荐(0)
摘要:题面 看起来就很像是一道数位dp,\(L\) 和 \(R\) 很大,并且限制和大小没关系。考虑状态的设计:剩余长度 \(len\),是否有上限限制 \(lim\),这两个肯定是必须的。因为要统计连续三个位置相同,所以要记录 \(pre1,pre2\) 表示前两位是什么数(当然也可以记录上一位和它们两 阅读全文
posted @ 2022-05-19 16:49 cunzai_zsy0531 阅读(46) 评论(0) 推荐(0)
摘要:题面 开一棵线段树,区间内合并左右儿子的时候,如果颜色相同则赋成此颜色,否则直接赋成 \(0\),第三个操作只需要区间 \([l,r]\) 答案不为 \(0\) 且两边颜色不一样即可。比较简单,复杂度 \(O(n\log n)\)。 点击查看代码 #include<iostream> #includ 阅读全文
posted @ 2022-05-19 16:39 cunzai_zsy0531 阅读(37) 评论(0) 推荐(0)
摘要:题面 前两个操作放过来看似是一道线段树题,但是发现线段树无法维护第三个操作。考虑使用平衡树(fhqtreap)来解决这个问题,前两个操作和线段树差不多,直接split出来打加法和乘法标记即可。第三个操作大概就是把 \(R\) 位置的系数加到 \(R+1\) 位置并且删除,在 \(L\) 的左边加一个 阅读全文
posted @ 2022-05-19 16:37 cunzai_zsy0531 阅读(34) 评论(0) 推荐(0)
摘要:题面 考虑异或可以表示成前缀和的形式,则 \(a[p]\oplus a[p+1]\oplus\ldots \oplus a[n]\oplus x=s[p-1]\oplus s[n] \oplus x\)。后面都是知道的,所以可以拿着 \(s[n]\oplus x\) 的值去01-trie上做匹配。注 阅读全文
posted @ 2022-05-19 16:28 cunzai_zsy0531 阅读(46) 评论(0) 推荐(0)
摘要:题面 本来就是个裸的KMP,但是这个题是有删除的,所以可以维护一个栈,每次的 \(j\) 都继承栈顶元素的 \(j\),然后如果找到了一个匹配,就直接弹栈即可。因为只会进栈 \(O(n)\) 次,所以总复杂度也是 \(O(n)\) 的。这个题算是栈的妙用了。 点击查看代码 #include<iost 阅读全文
posted @ 2022-05-19 16:22 cunzai_zsy0531 阅读(63) 评论(0) 推荐(0)