摘要:
这一题不是自己想出来的思路,看了一眼解题报告。题意是这样的,求给定的一棵树中是否存在一条长度为L的路径,注意这个值可能为负数,这也是简洁版的解题报告的最后一句忠告。这题有一个非常好的特性,那就是所有的边的长度要么为1,要么为2,也就是说我们所求得的路径是由若干个1,2组成的。那么也就有了下面的结论:当我们得到一条长度为S的路径时,现在考虑到构成路径S的左右两端的两条边,这两条边的组合情况是(1, 1), (1, 2), (2, 2)那么注意到我们始终可以去掉长度为2的一段,因此有结论:若整个树中最长的偶数边为EM,最长的奇数边为OM,由于任何一个询问不是奇数就是偶数,那么如果这个数是偶数的话, 阅读全文
摘要:
题意:给定一棵树(不一定是二叉树),现在问最多能够删除多少条边使得分开的结点满足分开子树的结点数都是偶数。思路:首先用邻接表建立起一棵树,然后我们得出以下的结论:对于任意结点而言,如果该节点能够找出和与之相连的部分子树构成偶数个点并且这偶数个点不能再分解出偶数个结点的分支出来,那么这个点与其他相连的子树(没有加入前面的集合中)的边全部断掉。之所以可以断掉这些边是因为一个我们去掉的点集都是不能够再进行分割的集合,而且又达到了偶数个点,那么这偶数个点对于其他集合肯定也是没有帮助的,因为%2之后的贡献率为0。代码如下:#include <iostream>#include <cst 阅读全文
摘要:
看了公式之后k的值来源是i或者是j,那么枚举 i = k 的时候满足(j < i)同理 j = k 的时候满足(i < j) 最后在加上i,j都是k。求一个前缀和。注意处理溢出。代码如下:#include <cstdlib>#include <cstdio>#include <cstring>#include <iostream>#define MOD 1000000007using namespace std;int N;long long sa[100005], sb[100005];int cal(int x) { return 阅读全文
摘要:
给定一个集合A,一个集合B,A,B元素个数相等,然后问是否存在一个数X使得A中的元素均与这个数进行按位异或操作后的结果为B集合,如果存在输出最小的数,不存在输出-1。思路:由于给定的N为奇数,所以能够根据二进制位的最右边位确定唯一的分组,然后只需要判定这个分组是否合理即可。分组是这样划分的,如有A、B两组数据,把A组根据末位0和1分成两组,B组同理划分,那么只有00配对或者是01配对,这有各组中数的个数确定。配对模式确定后,再通过30次判定即可。#include #include #include #include #include #include using namespace std;c 阅读全文