
hiho
朝气
想法太多, 做的太少,
展开
-
hiho 113 Fibonacci
问题描述给定一个数组,其中数子小于10000, 求fibonacci 子串的个数。解法容易想到如果当前数字是fibonacci数列中的一个,那么以其结尾的fibonacci 子串个数为前一个fibonacci数字前一个的子串的个数。如果当前数字不是fibonacci 数列中的数字,则不需要考虑。代码#include <bits/stdc++.h>using namespace std;enum{原创 2016-08-28 22:07:13 · 562 阅读 · 0 评论 -
hiho 55 连通性·四
问题http://hihocoder.com/problemset/problem/1190?sid=787105 求点的连通分量解法使用tarjan,用堆栈记录边,在割点处弹栈,注意边可能有两次进入堆栈,我们记录边是否已经进入堆栈。#include <bits/stdc++.h>using namespace std;enum{maxn = 20000+5, maxm = 100000+5}原创 2016-05-03 22:43:34 · 269 阅读 · 0 评论 -
hiho 35 二分图三·二分图最小点覆盖和最大独立集
二分图最小点覆盖 = 最大匹配数 最大独立集 = 顶点数- 最大匹配数转载 2016-04-19 19:36:03 · 229 阅读 · 0 评论 -
hiho 34 二分图二•二分图最大匹配之匈牙利算法
问题二分图的最大匹配算法解法寻找一条交错路径,路径中的边进行翻转。 优化:1, 只要计算一个集合中的顶点。 2, 在每个顶点处,记录已经查找过的另一集合的顶点,防止重复。#include <bits/stdc++.h>using namespace std;enum{maxn = 1000+5};vector<int> G[maxn];int color [maxn];int res[原创 2016-04-19 17:15:12 · 239 阅读 · 0 评论 -
hiho 32 二分图判定一
问题http://hihocoder.com/contest/hiho33/problem/1解法先找一个节点染成白色,将子节点染成黑色,做宽度优先搜索进行染色,如果发现两个节点有边链接,但是颜色相同就返回错误。当存在多个联通分量时,要多次选择节点。#include <bits/stdc++.h>using namespace std;enum {maxn = 10000+4};vector<原创 2016-04-19 15:14:31 · 250 阅读 · 0 评论 -
hiho 31 扫雷二
问题http://hihocoder.com/contest/hiho31/problem/1解法首先要理解题意,共有三种规则,这三种规则要独立使用。每个规则都是应用在输入数据上求得结果。 第三种规则两两相交有24种情况。#include <bits/stdc++.h>using namespace std;enum{maxn = 200+5, isB = 9, notB = 10};int原创 2016-04-17 17:16:32 · 229 阅读 · 0 评论 -
hiho 30 扫雷一
问题http://hihocoder.com/contest/hiho30/problem/1解法枚举第一个位置为0, 或1两种情况。最后综合两种情况的结果给出答案。 需要注意有可能一种情况不满足,则忽略。#include <bits/stdc++.h>using namespace std;enum {maxn = 100000+5};int one[maxn];int zero[max原创 2016-04-17 12:24:58 · 307 阅读 · 0 评论 -
hiho 57 高斯消元 二
问题http://hihocoder.com/problemset/problem/1196?sid=785572解法转换成异或表达式, 然后使用高斯消元的到解。#include <bits/stdc++.h>using namespace std;enum{maxn = 30, n=5, m=6};int a[maxn][maxn];int b[maxn];int delt[5][2]转载 2016-04-29 23:14:43 · 235 阅读 · 0 评论 -
hiho 23 最短路径 一(Dijstra)
问题描述万圣节的早上,小Hi和小Ho在经历了一个小时的争论后,终于决定了如何度过这样有意义的一天——他们决定去闯鬼屋!在鬼屋门口排上了若干小时的队伍之后,刚刚进入鬼屋的小Hi和小Ho都颇饥饿,于是他们决定利用进门前领到的地图,找到一条通往终点的最短路径。鬼屋中一共有N个地点,分别编号为1..N,这N个地点之间互相有一些道路连通,两个地点之间可能有多条道路连通,但是并不存在一条两端都是同一个地点的道路原创 2015-12-27 12:53:45 · 365 阅读 · 0 评论 -
hiho 29 最小生成树三·堆优化的Prim算法
问题描述最小生成树算法,在稀疏图时,Kruscal复杂度更低,我们可以使用堆优化的prim算法达到与Kruscal一样的复杂度。 Prim算法本身的时间复杂度是O(N^2)的,而在这个算法中,使用了堆来维护所有的边,操作数一共是O(M)级别的,所以复杂度是O(MlogM)的!而Kruscal算法的时间复杂度是O(MlogM + M * Ackermann’(M)),总的说来,是优化到了和Krusc原创 2016-01-23 16:54:02 · 4001 阅读 · 0 评论 -
hiho 28 堆
问题描述堆是一种数据结构,堆有两种,小根堆和大根堆,先说大根堆,如果对于一个节点上带有权值的完全二叉树,每个节点的权值都比它的左右子节点的权值大的话,这颗二叉树就被称为大根堆。算法描述(以大顶堆为例)堆上有两种操作,第一种是向堆中加入一个新元素。我们在堆得末尾加入新元素,此时新加入的元素可能比其父节点大,此时和父节点交换,交换之后可能还存在违反堆定义,依次交换,直到当前节点比父节点小。 第二种转载 2016-01-23 15:27:57 · 298 阅读 · 0 评论 -
hiho 27 最小生成树二·Kruscal算法
问题描述最小生成树算法。算法描述prime算法中有一个结论:对于城市i(i≠1),如果i与城市1的距离不超过其他任何城市j(j≠1)与城市1的距离,那么(1, i)这一条边一定存在于某一棵最小生成树中么?” 可以证明图中最短的边是属于最小生成树的,然后将最短边相连的两个顶点看做一个顶点,再找图中最短的边,依次类推进行N-1次就可以找到整棵树。 我们可以在开始时就讲图中的边排序,从小到大依次将边加原创 2016-01-22 18:23:55 · 349 阅读 · 0 评论 -
hiho 26 最小生成树 prime
问题描述生成树这个名词是相对于一个确定的图G来的,也就是说你不能说一棵树T是生成树,只能说T是G的生成树,而生成树的意思就是,T的结点与G的结点是一样的,而且T的边集是G的边集的子集,这就是所谓的生成树。而最小生成树——意思就是G的所有生成树中边权和最小的一棵。”算法描述首先我想证明一个结论:对于城市i(i≠1),如果i与城市1的距离不超过其他任何城市j(j≠1)与城市1的距离,那么(1, i)这一原创 2016-01-19 15:53:56 · 274 阅读 · 0 评论 -
hiho 25 最短路径 SPFA
问题描述 无向图中,两点之间最短距离。 算法描述: SPTA算法是针对稀疏图的,其复杂度只与边的个数有关,为O(V); 基本思想是广度优先搜素+剪枝;#include <cstdio>#include <vector>#include <cstring>#include <queue>using namespace std;enum {maxn = 100000+5, maxm =原创 2016-01-17 16:15:28 · 262 阅读 · 0 评论 -
hiho 24 最短路径 二 Floyd算法
问题描述: 对于无向图, 求任意两点之间最短路径。 算法描述: floyd 算法基本思想是,“那我这么说吧,首先,最开始的时候,MinDistance(i, j)——即从第i个点到第j个点的最短路径的长度,拥有一个限制:这条路径不能经过任何节点。”小Hi道。“那就是说如果从i个点到第j个点之间没有直接相连的边的话,这个长度就是无穷大咯?”小Ho总结道:“只需要把输入的边填进MinDistanc原创 2016-01-17 16:11:30 · 313 阅读 · 0 评论 -
hiho 36 划分
快速排序的划分方式: 注意划分后等于key的值可能在左边也可能在右边。key也不一定在中间。int partion(int L, int R, int key){ --L; ++R; for(;;) { do{ L++;} while(a[L] < key); do{ R--;} while(a[R] > key);转载 2016-04-19 21:22:47 · 190 阅读 · 0 评论 -
hiho 37 二分查找k小数
问题http://hihocoder.com/contest/hiho37/problem/1解法二分求解。复杂度nlogn#include <bits/stdc++.h>using namespace std;int *a;int partition(int L, int R){ int pos = L; R++; for(;;){ do{++L;}原创 2016-04-19 22:31:49 · 241 阅读 · 0 评论 -
HiHo 112 Total Highway Distance
问题http://hihocoder.com/contest/hiho112/problem/1问题分析题目给定一课最小生成树,求所有节点对之间的距离,然后将所有距离相加之后的和。而且之后要修改一些边的权重,再查询距离。 很容易想到一个方法是:统计每条边会被用到几次,最终答案就是 每条边的权重*用到的次数 然后所有边求和。 由于树的形状是不变的,因此每条边被用到的次数是可以复用。每次修改边的长度后转载 2016-08-28 20:32:46 · 515 阅读 · 0 评论 -
hiho 98 搜索一 24点
问题给定四个数, 使用加减乘除四中操作, 得到24, 每个数只能使用一次。解法暴力枚举法, http://hihocoder.com/contest/hiho98/problem/1##include <bits/stdc++.h>using namespace std;int a[4];enum{add=0, sub, mul, divid, rsub, rdiv, OPNUM};int转载 2016-05-21 13:25:21 · 382 阅读 · 0 评论 -
hiho 47 48 拓扑排序
问题http://hihocoder.com/problemset/problem/1174?sid=782321 http://hihocoder.com/contest/hiho48/problem/1代码首先找出所有入度为0的节点加入队列 1,每次从队列中拿出一个入度为0的节点,删除这个节点和其边 2,将入度为0的点加入队列。 重复1,2 直到队列为空。#include <bits/s转载 2016-04-24 22:44:25 · 260 阅读 · 0 评论 -
hiho 46 博弈游戏·Nim游戏·三
问题http://hihocoder.com/problemset/problem/1173代码Sprague-Grundy#include <bits/stdc++.h>using namespace std;int main(){ int n; scanf("%d", &n); int ret =0; for(int i=0; i<n; ++i) {转载 2016-04-24 17:44:11 · 247 阅读 · 0 评论 -
hiho 45 博弈游戏·Nim游戏·二
问题http://hihocoder.com/contest/hiho45/problem/1代码将局面划分成多个子局面,转化成Nim游戏#include <bits/stdc++.h>using namespace std;int main(){ int n; scanf("%d", &n); getchar(); int ret =0; for(in转载 2016-04-24 15:31:05 · 239 阅读 · 0 评论 -
hiho 44 博弈游戏·Nim游戏
问题http://hihocoder.com/contest/hiho44/problem/1代码博弈论中的Nim游戏是经典的公平组合游戏(ICG)#include <bits/stdc++.h>using namespace std;int main(){ int n; int a =0; scanf("%d", &n); int ret =0; fo转载 2016-04-24 14:13:55 · 237 阅读 · 0 评论 -
hiho 数位dp
问题http://hihocoder.com/problemset/problem/1301?sid=791127 数位dp + 二分查找。解法1, 数位dp 基本思路是: 对于一个小于n的数, 肯定是从高位到低位出现某一位 < n的那一位 如 n = 58 n为十进制数。 x = 48 此时x 的 十位 < n x = 51 此时x的个位 < n 有了上述性质,我们就原创 2016-05-08 15:40:45 · 241 阅读 · 0 评论 -
图形学博客
Alex Nankervis http://www.naixela.com/alex/原创 2016-04-22 17:20:42 · 322 阅读 · 0 评论 -
hiho 43 骨牌覆盖问题·三
问题http://hihocoder.com/contest/hiho43/problem/1代码程序递归查找状态转移矩阵。#include <bits/stdc++.h>using namespace std;enum {maxk = 7, max2k = 1<<maxk, mod=12357};int M[32][max2k][max2k];int d[max2k][max2k];in转载 2016-04-21 22:24:50 · 346 阅读 · 0 评论 -
hiho 42 骨牌覆盖问题·二
问题http://hihocoder.com/contest/hiho42/problem/1 3*n解法推到状态转移矩阵,然后转换为矩阵幂次。#include <bits/stdc++.h>using namespace std;int m[32][8][8];int d[8][8];const int mod= 12357;void mul(int C[8][8], int a[8]转载 2016-04-20 17:45:18 · 367 阅读 · 0 评论 -
hiho 41 骨牌覆盖问题·一
问题快速求得斐波拉切数列的某一位。解法首先将递推公式写成矩阵相乘的形式,然后计算出所有2的幂次的矩阵。对任意数,分解成2的幂次求得。 复杂度O(logn)#include <bits/stdc++.h>using namespace std;const int mod = 19999997;struct M{ long long a, b, c, d;};M m[32];M m原创 2016-04-20 16:20:19 · 309 阅读 · 0 评论 -
hiho 40 三分·三分求极值
问题描述对于一个凸函数。 http://hihocoder.com/contest/hiho40/problem/1解法先确定搜索范围,【-∞\infty, −b/2a-{b/2a}】 还是【−b/2a-{b/2a},+∞\infty】; 然后不断缩减区间直到结果符合要求。#include <bits/stdc++.h>using namespace std;double a, b, c,转载 2016-04-20 15:18:26 · 344 阅读 · 0 评论 -
hiho 39 二分·归并排序之逆序对
问题寻找逆序数 http://hihocoder.com/contest/hiho39/problem/1解法归并排序,复杂度o(nlogn)#include <bits/stdc++.h>using namespace std;enum {maxn = 100000+5};int a[maxn];int temp[maxn];int n;long long ret;void mer原创 2016-04-20 11:37:57 · 276 阅读 · 0 评论 -
hiho 38 二分·二分答案
问题http://hihocoder.com/contest/hiho38/problem/1解法二分搜索+bfs 如果换做dfs会超时。#include <bits/stdc++.h>using namespace std;enum {maxn = 10000+5};int n, m, k, t;vector<int> G[maxn];vector<int> len[maxn];in原创 2016-04-20 10:02:50 · 341 阅读 · 0 评论 -
hiho 54 连通性·三
问题http://hihocoder.com/contest/hiho54/problem/1解法首先使用tarjan 求出强连通分量,将强连通分量看做一个节点,就消除了图中的环, 然后使用拓扑排序寻找一条权值最大的路径。#include <bits/stdc++.h>using namespace std;enum{maxn = 20000+4};vector<int> G[maxn];v原创 2016-04-29 10:23:01 · 241 阅读 · 0 评论 -
hiho 52 连通性一·割边与割点
问题http://hihocoder.com/problemset/problem/1183?sid=785036解法#include <bits/stdc++.h>using namespace std;enum{maxn = 20000+5};vector<int> G[maxn];int visit[maxn];int low[maxn];int dfn[maxn];int pa转载 2016-04-28 21:56:41 · 302 阅读 · 0 评论 -
hiho 53 连通性二·边的双连通分量
问题http://hihocoder.com/problemset/problem/1184?sid=785059解法Tarjan算法+ 栈#include <bits/stdc++.h>using namespace std;enum{maxn = 20000+4};vector<int> G[maxn];int n;int parent[maxn];int low[maxn];in转载 2016-04-28 21:59:41 · 321 阅读 · 0 评论 -
hiho 16 RQM_st(区间最值查找)
问题描述 描述 小Hi和小Ho在美国旅行了相当长的一段时间之后,终于准备要回国啦!而在回国之前,他们准备去超市采购一些当地特产——比如汉堡(大雾)之类的回国。 但等到了超市之后,小Hi和小Ho发现者超市拥有的商品种类实在太多了——他们实在看不过来了!于是小Hi决定向小Ho委派一个任务:假设整个货架上从左到右拜访了N种商品,并且依次标号为1到N,每次小Hi都给出一段区间[L,原创 2015-12-13 10:09:37 · 317 阅读 · 0 评论 -
hiho 14 并查集
问题描述对于一堆数据,有些数据之间存在关系,现在给出所有的关系,然后给出两个数据,问这两个数据是否有关系。并查集并查集的查找和更新都非常方便,也非常的高效,因为查找的过程就是一个优化的过程。平均查找时递归深度接近于两次。 代码#include <cstdio>#include <cstring>#include <algorithm>#include <string>#include <m转载 2015-11-27 21:04:43 · 253 阅读 · 0 评论 -
hiho 15 最近公共子祖先(二)
问题描述假设现小Ho现在知道了N对父子关系——父亲和儿子的名字,并且这N对父子关系中涉及的所有人都拥有一个共同的祖先(这个祖先出现在这N对父子关系中),他需要对于小Hi的M次提问——每次提问为两个人的名字(这两个人的名字在之前的父子关系中出现过),告诉小Hi这两个人的所有共同祖先中辈分最低的一个是谁? 1<=N, M <= 10^5问题分析由于关系数比较多,如果按照算法1进行复杂度为O(N*M),原创 2015-11-28 21:42:38 · 286 阅读 · 0 评论 -
hiho 13 最近祖先问题
问题描述在树结构中,找到两个节点的最近最先节点。解决方法问题规模较小时,比如100个节点,我们可以先将一个节点的所有祖先存储起来,然后另外一个节点在查找祖先的过程中查看是否有相同的祖先。std::map的使用:*map< key, val> 访问时可以map[key] 返回val值,如果key不存在也会返回一个默认值,而且会在map中插入一个key的节点,这里要非常注意!!,我们在读取之前一定要先原创 2015-11-24 23:27:26 · 317 阅读 · 0 评论 -
hiho 12 树的dp
问题描述:给定一棵由n个节点组成的树,并对每个节点标定一个权重值 wiw_i, 现在要求由m个节点组成的且包含1号节点的连通子树,使得这m个节点的wiw_i之和最大。分析:对于一棵子树,根节点为t,可以这样枚举:首先必须包含根节点,然后对于每个儿子节点s,可以将其看做一棵子树,为每个s分配选择的节点数为cic_i 定义f(s, c) 表示对以s为根的子树,分配c个节点,能够得到的最大权重值。 那原创 2015-11-22 15:02:25 · 275 阅读 · 0 评论 -
hiho 11 树的最长路径
问题描述树中两个结点之间的最长距离, 距离指两个节点之间的边数。解决方法首先选择一个点作为树的根节点,对于以t为根的子树,L1和L2表示从t到叶子节点的最长距离和次长距离,那么子树对应的结果是 L1+L2; 树在存储时,可以按照无向边存储,在dfs访问时,传入父节点的指针,遍历时,如果是父节点就跳过。#include <vector>#include <cstring>#include <cs原创 2015-11-20 23:02:16 · 409 阅读 · 0 评论