04 2021 档案

摘要:题意: 给出一棵树。 对于每个点,求出距离它不超过k的所有点的点权和。 题解: 定义$f(i,j)$表示第i个点的j范围内的点权和。 定义$gg(i,j)$表示第i个点向下j范围内的点权和。 \(gg(i,j)=c_i+\sum_{v \in son_u}gg(v,j-1)\) \(f(i,j)=f 阅读全文
posted @ 2021-04-11 14:45 zlc0405 阅读(32) 评论(0) 推荐(0) 编辑
摘要:题意: 给出一棵树, 每个点有点权,每条边有边权。 定义答案为所有点自身的点权乘上它到根节点的距离之和。 询问怎么选择根节点使得答案最小。 题解: 计算出每个点子树内的所有点权之和。 计算出每个点子树外的所有点权之和。 换根的时候,答案加上子树外的所有点权之和乘上这条边的权值,减去子树内的所有点权之 阅读全文
posted @ 2021-04-11 13:46 zlc0405 阅读(100) 评论(0) 推荐(0) 编辑
摘要:题意: 给出一棵树。 询问最少断几条边,使得存在大小为P的连通块。 题解: 以每个点为根节点跑树上背包即可。 时间复杂度$O(n^3)$ #include<bits/stdc++.h> using namespace std; const int maxn=200; int n,p; vector< 阅读全文
posted @ 2021-04-09 14:31 zlc0405 阅读(56) 评论(0) 推荐(0) 编辑
摘要:题意: 给出一棵树。 每个叶子有点权,每条边有边权。 问你最多选多少叶子,使得总边权小于等于总点权。 题解: 树上背包。 定义状态$f(i,j,k)$表示子树$i$内选取$j$个叶子仅考虑$i$的前$k$个儿子的最优答案。 这里注意状态的转移的一些细节。 //f(i,j,k)表示在子树i内选择j个用 阅读全文
posted @ 2021-04-08 15:59 zlc0405 阅读(64) 评论(0) 推荐(0) 编辑
摘要:题意: 给出n个区间,每个区间有颜色。 m次询问,每次询问:这n个区间中所有被包含在[x,y]这一区间中的区间,它们的颜色是否取遍了[l,r]中的所有颜色。 题解: 先对所有线段的左右端点离散化。将所有线段按左端点排序。 然后对每个左端点x建一颗线段树。 线段树的下标是颜色,值为该颜色左端点大于等于 阅读全文
posted @ 2021-04-07 11:37 zlc0405 阅读(54) 评论(0) 推荐(0) 编辑
摘要:题意: 给定一颗n个节点的树。每个点有点权$v_i$,询问有序对$(x,y)$使得: x不是y的祖先,且y不是x的祖先。 x和y的简单路径之和不超过k。 x和y的点权满足:\(v_x+v_y=2v_{lca(x,y)}\) 题解: 假设当前枚举的点为$x$,子树根节点为$u$。 需要找的点$y$需要 阅读全文
posted @ 2021-04-06 16:24 zlc0405 阅读(108) 评论(0) 推荐(0) 编辑
摘要:题意: 给出一个长度为n的数组a,两个整数p和k。 询问有多少数对$(x,y)(1 \leq x < y \leq n)\(使得\)(a_x2+a_y2)(a_x+a_y)$对p取模的结果为k。 保证p是质数。 题解: \((a_x^2+a_y^2)(a_x+a_y)\%p=k\) \((a_x^2 阅读全文
posted @ 2021-04-05 14:40 zlc0405 阅读(46) 评论(0) 推荐(0) 编辑
摘要:给出n个点。 对每个点,询问它的子树中: 假设距离它为d的点有x个,求最大的x,并输出d。 如果有多个x相同,输出最小的d。 题解: 树上启发式合并。 用数组f维护当前节点子树内第i层的节点数。 数组Max维护当前节点子树内最大的节点数的层。 数组Ans维护当前节点的答案。 在转移时,Max和Ans 阅读全文
posted @ 2021-04-02 15:38 zlc0405 阅读(59) 评论(0) 推荐(0) 编辑
摘要:给出一棵树,每个节点上有一个字符串。 每次询问子树x内的第y层儿子中不重复名字的个数。 题解: 树上启发式合并的过程中,数组f维护第i层中有多少种不同的字符串。 这里不太好直接维护,用set维护f数组即可。 #include<bits/stdc++.h> using namespace std; c 阅读全文
posted @ 2021-04-02 15:16 zlc0405 阅读(70) 评论(0) 推荐(0) 编辑
摘要:给出一个树。 每次询问第x点有多少y代表亲。 两个点互为y代表亲当且仅当它们的第y个祖先相同。 题解: 每个点的y代表亲的答案就是: 先向上找节点的第y个祖先,这个祖先子树内的第dep+y层节点总数就是答案。 那么就可以先对询问离线,然后用倍增LCA找到每个点的第y层祖先,记录dep+y和询问编号这 阅读全文
posted @ 2021-04-02 14:43 zlc0405 阅读(51) 评论(0) 推荐(0) 编辑
摘要:给出一棵树 对每个节点,询问有多少对p代表亲。 p代表亲是指:两个节点的第p个祖先相同。 题解: 离线处理询问 找出当前询问节点的第$p$个祖先,然后那个祖先下面1到p层的节点数量-1就是答案。 定义$f$存储当前节点子树内$x$层的节点总数。 阅读全文
posted @ 2021-04-02 00:23 zlc0405 阅读(43) 评论(0) 推荐(0) 编辑
摘要:一棵以1为根的树,每个节点上都有1个字母,有m个询问。每次询问v对应的子树中,深度为h的这层节点的字母,能否打乱重排组成回文串。根的深度为1,每个点的深度为到根的距离。 #include<bits/stdc++.h> using namespace std; const int maxn=5e5+1 阅读全文
posted @ 2021-04-02 00:22 zlc0405 阅读(60) 评论(0) 推荐(0) 编辑
摘要:给出一个n个点的树。 每次询问点x的子树内出现次数为y的颜色至少有多少种。 题解: 先将询问离线。 用f数组记录每种颜色在当前子树内的出现次数情况 用cnt数组记录当前子树内出现次数大于等于i的不同颜色数量 当前节点的f和cnt来源于重儿子。 然后更新f的状态时,cnt[f[i]]++即可。 然后遍 阅读全文
posted @ 2021-04-01 23:16 zlc0405 阅读(84) 评论(0) 推荐(0) 编辑
摘要:给出一个n个点的树 求出树中每个子树出现次数最多的所有颜色的编号的和。 题解: 搜索的过程中,重儿子所在的子树搜一遍,记录颜色的出现情况 然后把轻儿子往重儿子上合并 #include<bits/stdc++.h> using namespace std; const int maxn=1e5+100 阅读全文
posted @ 2021-04-01 22:46 zlc0405 阅读(61) 评论(0) 推荐(0) 编辑
摘要:只有22种字符。 一个串满足答案的条件是: 每个字符出现次数都为偶数或者出现次数为奇数的字符仅有一个。 因此我们可以考虑: 用0表示这个字符出现次数为偶数,1表示出现次数为奇数。 而对于一个路径上的字符,我们只需要考虑每个字符的出现次数,这样我们用一个整数就可以表示出所有符合条件的状态:0或者(1< 阅读全文
posted @ 2021-04-01 21:57 zlc0405 阅读(51) 评论(0) 推荐(0) 编辑
摘要:一棵n个点的有根树,1号点为根,相邻的两个节点之间的距离为1。树上每个节点i对应一个值k[i]。每个点都有一个颜色,初始的时候所有点都是白色的。 你需要通过一系列操作使得最终每个点变成黑色。每次操作需要选择一个节点i,i必须是白色的,然后i到根的链上(包括节点i与根)所有与节点i距离小于k[i]的点 阅读全文
posted @ 2021-04-01 13:26 zlc0405 阅读(86) 评论(0) 推荐(0) 编辑
摘要:学校实行学分制。 每门的必修课都有固定的学分,同时还必须获得相应的选修课程学分。 学校开设了 N 门的选修课程,每个学生可选课程的数量 M 是给定的。 学生选修了这 M 门课并考核通过就能获得相应的学分。 在选修课程中,有些课程可以直接选修,有些课程需要一定的基础知识,必须在选了其他的一些课程的基础 阅读全文
posted @ 2021-04-01 12:54 zlc0405 阅读(57) 评论(0) 推荐(0) 编辑
摘要:“你,你认错人了。我真的,真的不是食人魔。”--蓝魔法师 给出一棵树,求有多少种删边方案,使得删后的图每个连通块大小小于等于k,两种方案不同当且仅当存在一条边在一个方案中被删除,而在另一个方案中未被删除,答案对998244353取模 #include<bits/stdc++.h> using nam 阅读全文
posted @ 2021-04-01 12:35 zlc0405 阅读(47) 评论(0) 推荐(0) 编辑