练习随笔#
洛谷P1120##
注意点:对于数组范围需求较大并且真正存值的元素相对来说较少,那么我们可以使用map<存储类型,存储类型>,他的使用和常规数组一样,并且是访问它的时候才分配内存,既可以防止访问过界,又可以防止内存浪费
洛谷P5836##
它的题意是求路径u-v上是否有颜色H或者G
1)LCA:我们记录从根节点到每个节点的路径上颜色为H/G的个数(树上前缀和即可)(这题有点毛病的就是他默认建树是从1开始)
查询时直接树上差分即可
2)并查集:如果说我们把相邻且颜色一致的归入一个并查集,那么我们在查询路径上u-v时,如果他们不属于一个并查集,那么他们之间一定有阻断,那么两种颜色都有;如果属于一个并查集,那么他们之间的路径颜色唯一且就是u,v点的颜色
洛谷P2671##
他的题意是:给定一个序列,每个序列元素i含有一个值Ai和一个颜色值Bi,序号下标从1开始
符合条件的数对:
1)序号奇偶相同
2)颜色相同
记他们的贡献为(i+j)(Ai+Aj),求满足条件的所有数对的贡献和取模10007
启发:对于一些集合而言,如果每对元素都存在特定关系,且通过某种处理可以使得他们的先后不产生影响,那么我们可以通过研究单一元素,以此普及到集合中所以元素来研究全集合的一些性质。
比如这道题目,要满足颜色是相同的,那么我们要做的就是把所有颜色相同的归入一个集合,那么这个集合中所以元素两两配对,我们现在要求他们的贡献值,一共有n*(n-1)/2组,数据太庞大了。
我们怎么把这个转化为线性的东西嘞?
那么现在对于集合的元素两两都存在一定关系,并且先后的次序并不会影响,所有我们固定研究一个对象i,把(i+j)(Ai+Aj)拆开,发现每个i都要乘上Aj,i还要单独乘上Ai,很显然后者总数量与i配对数量有关,而配对数量是一个定值,而前者补上Ai就成了集合的数值和,所以这样计算每个对象的时候,抓住了一些集合共性,这样就方便很多了。