遍历

洛谷 P2664 树上游戏 题解

烈酒焚心 提交于 2020-01-10 04:34:52
题目传送门 题目大意: 求出所有的 s u m i = ∑ j = 1 n s ( i , j ) sum_i=\sum_{j=1}^n s(i,j) s u m i ​ = ∑ j = 1 n ​ s ( i , j ) ,其中 s ( i , j ) s(i,j) s ( i , j ) 表示 i i i 到 j j j 的路径上有多少种不同的颜色。 题解 树上的路径的统计类型的题目肯定是用点分治来搞嘛。对于当前分治到的一颗子树,我们考虑统计所有子树内经过重心的路径所产生的贡献。 为了方便,先定义几个东西: c o l [ i ] col[i] c o l [ i ] 表示节点 i i i 的颜色 v a l [ i ] val[i] v a l [ i ] 表示 i i i 这种颜色给重心带来的贡献 s i z e [ i ] size[i] s i z e [ i ] 表示以 i i i 为根的子树的大小 r o o t root r o o t 表示重心 那么我们在从重心遍历下去的过程中,对于遍历到的一个点 x x x ,假如这个点的颜色在它到重心的路径上是第一次出现,那么我们让 v a l [ c o l [ x ] ] val[col[x]] v a l [ c o l [ x ] ] 加上 s i z e [ x ] size[x] s i z e [ x ]

SQL中IN和EXISTS用法的区别

别等时光非礼了梦想. 提交于 2020-01-10 00:40:27
结论 1. in()适合B表比A表数据小的情况 2. exists()适合B表比A表数据大的情况 当A表数据与B表数据一样大时,in与exists效率差不多,可任选一个使用. select * from A where id in(select id from B) 以上查询使用了in语句,in()只执行一次,它查出B表中的所有id字段并缓存起来.之后,检查A表的id是否与B表中的id相等,如果相等则将A表的记录加入结果集中,直到遍历完A表的所有记录. 它的查询过程类似于以下过程 List resultSet=[]; Array A=(select * from A); Array B=(select id from B); for(int i=0;i<A.length;i++) { for(int j=0;j<B.length;j++) { if(A[i].id==B[j].id) { resultSet.add(A[i]); break; } } } return resultSet; 可以看出,当B表数据较大时不适合使用in(),因为它会B表数据全部遍历一次. 如:A表有10000条记录,B表有1000000条记录,那么最多有可能遍历10000*1000000次,效率很差. 再如:A表有10000条记录,B表有100条记录,那么最多有可能遍历10000*100次

迭代器模式

南楼画角 提交于 2020-01-10 00:31:25
迭代器模式遍历集合的成熟模式,迭代器模式的关键是将遍历集合的任务交给一个叫做迭代器的对象,它的工作时遍历并选择序列中的对象,而客户端程序员不必知道或关心该集合序列底层的结构。   迭代器模式的结构中包括四种角色。   一、集合:一个接口,规定了具体集合需要实现的操作。   二、具体集合:具体集合石实现了集合接口的一个实例,具体的集合按照一定的结构存储对象。具体集合应该有一个方法,该方法返回一个针对该集合的具体迭代器。   三、迭代器:一个接口,规定了遍历具体集合的方法,比如next()方法。   四、具体迭代器:实现了迭代器接口的类的实例。具体迭代器在实现迭代器接口所规定的遍历集合的方法时,比如next()方法,要保证首次调用将按着集合的数据结构找到该集合的一个对象,并且每当找到集合中的一个对象,立即根据该集合的存储结构得到待遍历的后继对象的引用,并保证一次调用next()方法可以遍历集合。   下列应用程序中,使用了迭代器模式中所涉及的类。该应用程序模拟点钞,使用HashSet类的实例,即一个集合模拟保险箱HashSet类的实例调用iterator()方法返回一个迭代器,用该迭代器模拟点钞机,而且在点钞过程中销毁假钞。 1 package com.iterator; 2 3 import java.util.Collection; 4 import java.util

图的连通性——无向图的连通分量和生成树

心已入冬 提交于 2020-01-09 23:14:50
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> 1.首先举个实例来说明连通性,看下图: 图G1 上图为非连通图,对上图的连接表进行深度优先搜索遍历,3次调用DFS过程,分别从顶点A,D,G出发,得到的顶点访问序列为: A L M J B F C D E G I K H 上面的3个顶点集和所有依附于这些顶点的边,便构成了非连通图的3个连通分量。 2.设E(G)为连通图G中所有边的集合,则从图中任一顶点出发遍历图时,必定将E(G)分成两个集合T(G)和B(G),其中T(G)是遍历图过程中历经的边的集合;B(G)是剩余边的集合。显然T(G)和图中所有的顶点一起构成连通图G的极小连通子图,又成为连通图的一颗生成树,并且称由深度优先搜索得到的为深度优先生成树;由广度优先搜索得到的为广度优先生成树。 对于非连通图,每个连通分量中的顶点集,和遍历走过的边一起构成若干颗生成树,这些连通分量的生成树组成非连通图的生成树林。 上图G1的深度优先生成树林为: 3.深度优先生成森林的算法 来源: oschina 链接: https://my.oschina.net/u/2263272/blog/1610088

图的遍历之深度优先搜索和广度优先搜索

…衆ロ難τιáo~ 提交于 2020-01-09 23:02:40
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> 深度优先搜索的图文介绍 1. 深度优先搜索介绍 图的深度优先搜索(Depth First Search),和树的先序遍历比较类似。 它的思想:假设初始状态是图中所有顶点均未被访问,则从某个顶点v出发,首先访问该顶点,然后依次从它的各个未被访问的邻接点出发深度优先搜索遍历图,直至图中所有和v有路径相通的顶点都被访问到。 若此时尚有其他顶点未被访问到,则另选一个未被访问的顶点作起始点,重复上述过程,直至图中所有顶点都被访问到为止。 显然,深度优先搜索是一个递归的过程。 2. 深度优先搜索图解 2.1 无向图的深度优先搜索 下面以"无向图"为例,来对深度优先搜索进行演示。 对上面的图G1进行深度优先遍历,从顶点A开始。 第1步 :访问A。 第2步 :访问(A的邻接点)C。 在第1步访问A之后,接下来应该访问的是A的邻接点,即"C,D,F"中的一个。但在本文的实现中,顶点ABCDEFG是按照顺序存储,C在"D和F"的前面,因此,先访问C。 第3步 :访问(C的邻接点)B。 在第2步访问C之后,接下来应该访问C的邻接点,即"B和D"中一个(A已经被访问过,就不算在内)。而由于B在D之前,先访问B。 第4步 :访问(C的邻接点)D。 在第3步访问了C的邻接点B之后,B没有未被访问的邻接点;因此,返回到访问C的另一个邻接点D

hihoCoder 1039: 字符消除

戏子无情 提交于 2020-01-09 22:37:17
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> 时间限制:1000ms 单点时限:1000ms 内存限制:256MB 描述 小Hi最近在玩一个字符消除游戏。给定一个只包含大写字母"ABC"的字符串s,消除过程是如下进行的: 1)如果s包含长度超过1的由相同字母组成的子串,那么这些子串会被同时消除,余下的子串拼成新的字符串。例如"ABCCBCCCAA"中"CC","CCC"和"AA"会被同时消除,余下"AB"和"B"拼成新的字符串"ABB"。 2)上述消除会反复一轮一轮进行,直到新的字符串不包含相邻的相同字符为止。例如”ABCCBCCCAA”经过一轮消除得到"ABB",再经过一轮消除得到"A" 游戏中的每一关小Hi都会面对一个字符串s。在消除开始前小Hi有机会在s中任意位置(第一个字符之前、最后一个字符之后以及相邻两个字符之间)插入任意一个字符('A','B'或者'C'),得到字符串t。t经过一系列消除后,小Hi的得分是消除掉的字符的总数。 请帮助小Hi计算要如何插入字符,才能获得最高得分。 输入 输入第一行是一个整数T(1<=T<=100),代表测试数据的数量。 之后T行每行一个由'A''B''C'组成的字符串s,长度不超过100。 输出 对于每一行输入的字符串,输出小Hi最高能得到的分数。 提示 第一组数据:在"ABCBCCCAA"的第2个字符后插入'C

SQL查询中in、exists、not in、not exists的用法与区别

与世无争的帅哥 提交于 2020-01-09 17:00:46
1、in和exists in是把外表和内表作hash(字典集合)连接,而exists是对外表作循环,每次循环再对内表进行查询。一直以来认为exists比in效率高的说法是不准确的,如果查询的两个表大小相当,那么用in和exists差别不大;如果两个表中一个较小一个较大,则子查询表大的用exists,子查询表小的用in。 例如:表A(小表),表B(大表) 方式一:索引使用 1)select * from A where id in(select id from B)   -->效率低,用到了A表上id列的索引 2)select * from A where exists(select id from B where id=A.id) -->效率高,用到了B表上id列的索引 3)select * from B where id in(select id from A)   -->效率高,用到了B表上id列的索引 4)select * from B where exists(select id from A where id=B.id) -->效率低,用到了A表上id列的索引 方式二:遍历使用 1)in()只执行一次,它查出B表中的所有id字段并缓存起来。然后检查A表的id是否与B表中的id相等,如果相等则将A表的记录加入结果集中,直到遍历完A表的所有记录。

emmm记不住

微笑、不失礼 提交于 2020-01-08 20:39:06
lists: List = new List(); 给后端传的 页面上遍历数组(遍历): kepList: KepglList[] = []; 页面上对象形式(不需要遍历) xueyxq = new Xueyxq(); 来源: CSDN 作者: Imency 链接: https://blog.csdn.net/Imency/article/details/103896249

重建二叉树

房东的猫 提交于 2020-01-08 18:18:58
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> 树中的基本结构,有遍历和递归两种方式来实现: 1、前旬遍历:先中,后左,最后右。-巧记:根左右 2、中旬遍历:先左,后中,最后右。-巧记:左根右 3、后旬遍历:先左子节点,后右子节点,最后中间根节点。-巧记:左右根 如何遍历树? —— DO GET。 题:输入二叉树的前序遍历和中序遍历结果,重建该二叉树。 待. 来源: oschina 链接: https://my.oschina.net/u/4432600/blog/3154983

jQuery高级

*爱你&永不变心* 提交于 2020-01-08 17:55:39
JQuery高级  遍历:     1js的遍历方式       for(初始化值;循环结束条件;步长)     2jq的遍历方式       1jq对象.each(callback)       juqery对象.eahce(funcation(index,element){       index,代表索引       element代表集合中的每个元素对象       this.也代表每一个元素对象 })         2回调函数的返回值         true:如果当前funcation的返回值为true,则继续循环           false:如果当前datction的返回值为false,则结束循环     2$.each(object,[callback])     3. for .. of :jquery3.0版本之后提供的方式       for(元素对象 of 容器对象) 事件绑定     1jquery标准的绑定方式       jq对象.事件方法(回调函数);       注***如果绑定事件,确不传递回调函数,那么会触发浏览器默认行为。例如submit会触发表单的提交事件     2on绑定事件/off解除绑定       jq对象.on(事件名称,回调函数)       jq对象。off(事件名称)       如果off方法不传递任何参数