目录
A.Round Down the Price
B. Polycarp Writes a String from Memory
C. Train and Queries
D. Not a Cheap String
E. Split Into Two Sets
F. Equate Multisets
G1&&G2. Passable Paths (hard version)
A.Round Down the Price
按题意找到比当前数小的最大的10的整数幂的数,然后差值即为答案,我这里写复杂了,用的字符串,记得要考虑前导0
代码如下:
#include
#include
#include
#include
#include
#include
B. Polycarp Writes a String from Memory
题目要求我们每次只能删除3种字母,用map记录下来即可
代码如下:
#include
#include
#include
#include
#include
#include
C. Train and Queries
题目大意:给定一个序列,然后每次询问给定两个数x,y,问序列中x后面是否有y。
思路:因为一个数可能出现多次,因此我们要存下来每个数出现的位置,并且记录下来每个数第一次出现的位置,最后二分查找即可。最后要注意一下,因为数可能很大,所以要离散化
代码如下:
#include
#include
#include
#include
#include
#include
D. Not a Cheap String
题目大意:给定一个字符串,字符串的权值等于每个字母在字母表中的位置的总和,例如a的权值是1,b的权值是2 ,字符串ab的权值就是1+2=3.再给定一个整数k,要求删除尽量少的字符,使得字符串的权值小于等于整数k。
思路:我们可以记录下来每一个字符出现的位置,依次遍历删除字符z到a,删除后的权值是否满足条件,删除的位置标记下来即可。
代码如下:
#include
#include
#include
#include
#include
#include
E. Split Into Two Sets
题目大意:给定n个多米诺骨牌,每张骨牌上面有两个数,要求将所有的骨牌分成两堆,使得每堆中的数字不重复。
思路:这题可以用二分图匹配做,如果一个数出现了三次及以上,那么一定不满足题意,如果一张骨牌上的两个数一样,那么也一定不满足题意。如果一个数只出现过一次,那我们就不用管它,如果一个数出现了两次,那么我就用一条边连接这两个骨牌,表示这两张牌不能分到一堆去,最后做一个二分图匹配,如果能成功匹配,说明满足题意,否则不满足
代码如下:
#include
#include
#include
#include
#include
#include
F. Equate Multisets
贪心
题目大意:给定两个数组a和b,可以在b数组进行两种操作,一种是将b中的任意一个元素变大两倍即×2,另一种是/2,可以进行任意次数的操作,判断能否操作使得a和b相等
思路:其实我们可以用操作1操作数组a,因为假设a=10,b=5,a/2==b*2,因此我们可以将a数组中所有能整除2的数一直整除到不能整除,直至变成一个奇数,这样子a中只有奇数了,那么对于b数组*2的操作就没用了,因为一个数*2是偶数,因此,对于b中的每个数,我们可以首先判断在a中是否有,如果没有的话,我们可以一直整除,直至到1,判断是否a中存在整个数,如果不存在说明不满足题意,如果所有数都可以操作后使得a和b相等, 那么就满足题意
代码如下:
#include
#include
#include
#include
#include
#include
G1&&G2. Passable Paths (hard version)
lca
题目大意:给定一棵树,然后给定q个询问,对于每个询问,给定k个数,判断这k个数在给定的树中是否在一条链上。
思路:对于给定的k个数,我们首先找到两个端点t1,t2,然后找到两个端点的lca(t1,t2)=r,那么对于给定的k个数中的其他数p,要么在t1到r的路径上,要么在t2到r的路径上,如果不在其中任何一条路径上,说明p跟t1和t2不在一条链上,那么如果找到这两个端点呢,对于t1,我们可以让其等于深度最深的节点,对于t2,我们可以让其为跟t1不在一个子树且深度最深的节点,即要满足lca(t1,t2)!=t2,如果找不到满足条件的t2,说明在一条链上
代码如下:
#include
#include
#include
#include
#include
#include