- 博客(48)
- 收藏
- 关注
转载 判断两线段相交
点乘 一个向量在另一个向量上的投影长度,标量,用于判断角度叉乘 垂直两向量的平面,右手定则,矢量,用于判断方向参考博客:点击进入(1)快速排斥试验 设以线段 P1P2 为对角线的矩形为R, 设以线段 Q1Q2 为对角线的矩形为T,如果R和T不相交,显然两线段不会相交。(2)跨立试验 如果两线段相交,则两线段必然相互跨立对方。若P1P2跨立Q...
2019-02-27 20:37:00
192
转载 背包问题
0-1背包问题描述: 有n个重量和价值分别是wi,vi的物品,从这些物品中挑选出总重量不超过W的物品,求所有方案中价值总和的最大值分析: dp[ i ][ j ] 表示在前 i 个物品中能装入容量为 j 的背包的最大价值,则有: dp[i][j] = dp[i - 1][j] j < wi dp[i][j] = max(dp[i - 1][j]...
2019-01-25 10:45:00
173
转载 最小生成树(Prim + Kruskal)
Prim算法 构造过程: 1)任选一个点,以这个点开始,寻找该点可以访问的所有的边; 2)在可以访问的所有边中找到最小边,这个边必须有一个点还没有访问过(防止出现回路),将还没有访问的点加入集合,并记录添加的边;(加点法) 3)寻找当前集合可以访问的所有边,重复2过程,直到没有新的点可以加入,即成功构造出最小生成树。K...
2019-01-23 16:36:00
158
转载 树状数组
先贴一个模板代码:int lowbit(int i){ return i & -i;}//这里的查询以区间和为例void query(int i){ int ans = 0; while(i > 0) { ans += c[i]; i -= lowbit(i); ...
2019-01-22 13:58:00
110
转载 LCS
思路: 明显的可以想到,状态转移方程为: 当x[i] == y[j]时,dp[i][j] = dp[i-1][j-1]+1 当x[i] != y[j]时,dp[i][j] = max(dp[i-1][j], dp[i][j-1]) 这种方法可以结合下面的决策矩阵和代码加深理解(参考自https://blog.youkuaiyun.com/linraise/article/de...
2019-01-21 14:42:00
108
转载 LIS
方法一:O(n2)的dp 状态定义:dp[i] 表示以数 a[i] 结尾的 LIS 值 状态转移方程:dp[i] = max(dp[j] + 1, dp[i]) 1 <= j < i && a[i] > a[j] 代码: 1 #include<iostream> 2 using namespace std; ...
2019-01-21 14:39:00
100
转载 最优三角剖分
问题描述: 给一个有n个顶点的凸多边形,有很多方法进行三角剖分(polygon triangulation) 。给每个三角形规定一个权函数w(i,j,k)(比如三角形的周长或者三顶点的权和或者三角形的面积等等),求让所有三角形权和最大的方案。分析: 这个问题的关键在于状态的定义,因为如果允许随意切割,显然任意“半成品” 多边形的各个顶点可以是原多边形中随意选取的...
2019-01-20 13:37:00
348
转载 最优矩阵链乘
问题描述: 一个n×m矩阵由n行m列共n×m个数排列而成。两个矩阵A和B可 以相乘当且仅当A的列数等于B的行数。一个n×m的矩阵乘以一个m×p的矩阵等于 一个n×p的矩阵,运算量为m×n×p。矩阵乘法不满足分配律,但满足结合律,因此A×B×C可以按顺序(A×B)×C进行也可以按A×(B×C)来进行。假设A、B、C分别 是2×3,3×4,4×5的,则(A×B)×C的运算量为2×3×4...
2019-01-19 20:39:00
206
转载 由数字三角形问题理解动态规划
先看几类数字三角形的问题,通过对这几个问题的分析来理解有关动态规划的基本思想数字三角形I问题描述: 有一个由正整数组成的三角形,第一行只有一个数,除了最下行之外 每个数的左下方和右下方各有一个数,从第一行的数开始,每次可以往左下或右下走一格,直到走到三角形底端,把沿途经过的数全部加起来作为得分。如何走,使得这个得分尽量大?分析: 如何走,是一个决策问题,...
2019-01-19 17:31:00
282
转载 堆排序
堆: 每个结点的值都大于或等于其左右孩子结点的值,这样的完全二叉树称为大顶堆;同理,每个结点的值都小于或等于其左右孩子结点的值,这样的完全二叉树称为小顶堆。思路: 1.将初始序列按照实际需求构造成大顶堆或小顶堆(一般升序大顶堆,降序小顶堆); 2.将顶堆元素与末尾的元素交换,使最大的数排在数组的末端; 3.调整堆中元素的位置,使其符合相应堆的定义,然后继续执行...
2018-12-03 21:03:00
59
转载 快速排序
思路: 选定一个基准数,每次一轮排序完成后要满足基准数左边的都是比它小的数,右边的都是比它大的数。然后再分别对左表和右表进行同样的操作,直到所有排序完成。其实不难发现,每一轮排序都使得一个数(基准数)放在了它“正确的”位置上。时间复杂度: O(nlogn)至O(n2),平均时间复杂度为O(nlogn)代码:(这里给出了每一轮排序后的情况,直到最后的排序完成) ...
2018-12-03 21:01:00
101
转载 冒泡排序
思路: 从第一个数开始,依次与下一个数比较,若下一个数比它小,则发生交换。这样每一次遍历都将其中最大的数冒泡到顶端,直到所有数冒泡完成则排序完成。时间复杂度: 最好情况一次排序就完成,O(n)复杂度;最坏情况逆序,O(n2)复杂度。平均时间复杂度为O(n2)。代码: 1 #include<iostream> 2 using namespace ...
2018-12-03 20:59:00
77
转载 矩阵快速幂
快速幂 先来讨论整数的快速幂算法,相比于一般的计算a^b时间复杂度O(n),快速幂的复杂度是O(logn),效率要更高。比如要计算x^19,19的二进制表示是10011,分别找到二进制1出现的位置对应的数值,1,2,16。而19也正好可以写成1+2+16,所以x ^ 19 == (x ^ 1) *(x ^ 2) *(x ^ 16)。要找1出现的位置,可以依次移位判断。代码如下,可以...
2018-12-03 20:26:00
100
转载 CF#524-C
题目链接http://codeforces.com/contest/1080/problem/C题意 给出一个n*m规格的矩形方块,这个矩形方块初始状态是严格的黑白相间的,现在有两次操作,第一次操作是将一块区域的矩形全部变为白色,第二次操作是将一块区域的矩形覆盖成黑色,要求的是经过两次操作之后白色方块和黑色方块的数量,矩形的区域用两个坐标表示,分别是左下角坐标和右上角坐标。...
2018-11-28 19:02:00
110
转载 CF#524-B
题目链接http://codeforces.com/contest/1080/problem/B思路数学规律题代码 1 #include<iostream> 2 using namespace std; 3 int main() 4 { 5 int n; 6 while(cin >> n) 7 ...
2018-11-26 16:47:00
86
转载 hdu3308—LCIS
题目链接 http://hdu.hustoj.com/showproblem.php?pid=3308问题描述 给出n个整数,有两种操作 1)U A B:用B取代第A个数(下标从0开始) 2)Q A B:输出在[A,B]中最长连续递增子序列的长度分析 给出一个序列,两种操作,分别是单点更新值和查询区间的最长连续递增子序列长 度,典型的线段树问题 首先考虑线段树的节点需要记录哪些...
2018-11-24 11:02:00
170
转载 最长回文子串(Manacher算法)
枚举中心位置法: 1 //枚举中心位置法 2 #include<iostream> 3 #include<string.h> 4 using namespace std; 5 6 const int MAXN = 1e5; 7 8 int LongestPalindrome(char *s, int len) 9 {...
2018-11-19 21:27:00
97
转载 回文串之判断
1 //从左右两边开始比较判断 2 #include<iostream> 3 #include<string.h> 4 using namespace std; 5 const int MAXN = 1e5; 6 bool is_palindrome(char *s, int len) 7 { 8 if(s == NULL...
2018-11-17 12:17:00
277
转载 字符串旋转
描述: 给定一个字符串,要求把字符串前面若干个字符移位到字符串的尾部。思路与代码: 1 //暴力法 2 #include<stdio.h> 3 #include<string.h> 4 5 const int MAXN = 1e5; 6 void move_one(char *s, int n) //移动一个字符到尾部...
2018-11-05 18:02:00
87
转载 hdu-2045 简单递推 水
题意: 一行长度为n的方格,只能使用三种颜色R、P、G来填充,且满足相邻方块不能同色,首尾方块不能同色。给出n,输出满足条件的着色方案数。思路: 简单递推,由n-1个方块推导出n个方块的情况,有以下两种情况: 1.第n-1个方块与第1个方块不同色,满足条件。直接在n-1的满足基础上添加第n个,且第n个只有一种选择。即F[n-1]; 2.第n-1个方...
2018-09-22 23:45:00
161
转载 错排公式
错排问题 错排问题是组合数学中的问题之一。一个含有n个元素的排列,若这个排列中所有的元素都不在自己原来的位置上,那么这样的一个排列就是原排列的一个错排。求解方法 对于情况较少的排列,可以使用枚举法。 当n=1时,只有一种排列情况且不是错排,D1=0; 当n=2时,全排列有两种,1、2和2、1,后者是错排,D2=1; 当n=3时,全排列有3!=6种,错排有...
2018-09-22 22:29:00
255
转载 ACM-ICPC 2018 南京赛区网络预赛
B. The writing on the wall数矩阵个数的题目。先来看看常规的无小黑块限制的矩阵个数怎么数。高度为1的话,很容易知道对于长度为L的矩阵一共有L+(L-1)+(L-2)+...+1个矩阵。那么对于高度为H的情况,只需要将高度从1遍历到H,但是注意到的是,对于特定长度的矩阵,高度每增加1,多出来的矩阵有h(当前高度值)个(详情见上图)。所以对于常规无黑块...
2018-09-16 14:57:00
101
转载 平面分割问题
直线分割平面: n条直线最多将一个平面划分成几个区域这个问题比较简单,当添加第n条直线时,要使结果最大化,那么要让第n条直线与其他n-1条直线都相交。这样就会产生n-1个交点,这n-1个交点将第n条直线分成n段,而每一段都将原有区域划分成两个区域,这样就增加了n个区域。 推导过程: F[n]=F[n-1]+n =F[n-2]+(n-1)+n ...
2018-09-09 23:50:00
357
转载 CodeForces - 95B (dfs)
题目链接:http://codeforces.com/problemset/problem/95/B题意: 给你一个数字,要你求出不小于它的最小的超级完美数。超级完美数的定义是:这个数字每一位都是4或者7,并且4的总位数要等于7的总位数。思路: 我刚开始推算的思路是:要是这个数有奇数位,那么就只需要加一位,加了一个位数的话肯定是比原来的数要大的,就只需要求出加了一位之...
2018-08-07 14:22:00
214
转载 poj2236(并查集)
题目链接:http://poj.org/problem?id=2236题意: 关于电脑之间的连接问题,给出一个距离限制,一台电脑与一台电脑是连接的有两种情况,一种是他们之间的距离小于限制距离,另一种是他们之间的距离超过了限制距离,但是他们间接通过其他在限制距离内的电脑互相连接。当然要连接的话首先要保证电脑是激活的状态,然后S表示询问,叫你判断询问的两台电脑之间是否连接。思路...
2018-08-04 16:44:00
139
转载 hdu5441(并查集+离线处理)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5441题意: 根据输入的三个整数n、m、q,表示有n座城市,m条路,q次询问。下面给出m行,每行三个数start、end、w,分别是这条道路的起点城市、终点城市、“权值”。然后给出q次询问的数值,每次询问的结果是符合条件的路有多少条。条件就是:如果这条路的权值比给的限制值要小,那么这...
2018-08-03 23:41:00
204
转载 CodeForces - 589J(dfs / bfs)
题目链接:http://codeforces.com/problemset/problem/589/J题意: 有一个扫地机器人,它的起始点是在有代表方向的方格上,它的行动规则是:按照它起始点的代表方向移动,如果遇到家具(*)或者撞墙(越界)就往右转继续走(往右转了一次之后如果还是不能走就继续往右转,所以就是顺时针方向)。思路: 可以用bfs,也可以用dfs。这里我用的...
2018-08-03 13:50:00
132
转载 CodeForces-589B(思维/排序)
题目链接:http://codeforces.com/problemset/problem/589/B题意: 有很多长方体蛋糕,高度默认为1,所以可以看作是矩形,你要做的是通过切割蛋糕来使得相同的蛋糕叠放起来达到最大的体积。你可以任意旋转长和宽。思路: 首先既然可以任意旋转长和宽,那么不妨把输入的长和宽先按first < second的方式排好序,然后对整体排序...
2018-08-01 16:02:00
181
转载 链式前向星
参考自:https://blog.youkuaiyun.com/acdreamers/article/details/16902023前向星: 前向星是一种数据结构,以储存边的方式来存储图。通常用在点的数目太多,或两点之间有多条弧的时候。除了不能直接用起点终点定位以外,前向星几乎是完美的。 再来看看前向星的构造方法:把边集数组中的每一条边按照起点从小到大排序,如果起点相同就按照终点从...
2018-08-01 15:14:00
125
转载 hdu1698(线段树区间更新)
题目链接:http://hdu.hustoj.com/showproblem.php?pid=1698题意:没啥好说的,读题吧(;¬_¬)思路:典型的线段树区间更新代码: 1 #include<iostream> 2 using namespace std; 3 4 const int maxn = 1e5 + 10; 5 stru...
2018-08-01 14:50:00
141
转载 hdu-1394(暴力 / 线段树)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1394题意: 输入一个整数n,接下来随意顺序输入0到n-1之间的数,然后你可以将每一串这样的数的第一个数移到最后一位去,形成新的数字串。要求你输出这样的操作得到的不同数字串中逆序数的最小个数。思路: 首先需要了解一下什么是逆序数,逆序数就是与标准列顺序相反的数。比如标准列是...
2018-07-29 16:15:00
153
转载 UVALive-6434(思维)
题目链接:https://vjudge.net/problem/UVALive-6434题意:给你一串n个数字,要求你将这串数字分成m组,使得分组后他们的消耗和最小。其中消耗是这样定义的:每一组的消耗等于这组数据中最大数与最小数的差值。思路:不难想到,两个数的差值要尽可能小的话,首先要对这组数进行排序,那么分组情况一定是在这组排序数中间进行切断分割。那么剩下的一个问题就是怎么去切...
2018-07-28 14:46:00
140
转载 hdu1166(线段树单点更新、查询)
题目链接:http://hdu.hustoj.com/showproblem.php?pid=1166题意: 第一行一个整数T,表示有T组数据。 每组数据第一行一个正整数N(N<=50000),表示敌人有N个工兵营地,接下来有N个正整数,第i个正整数ai代表第i个工兵营地里开始时有ai个人(1<=ai<=50)。 接下来每行有一条命令,命令有4种形式: ...
2018-07-25 12:34:00
108
转载 线段树
转载自:https://www.cnblogs.com/TenosDoIt/p/3453089.html 1 const int INFINITE = INT_MAX; 2 const int MAXNUM = 1000; 3 struct SegTreeNode 4 { 5 int val; 6 int addMark;//...
2018-07-25 12:15:00
88
转载 CodeForces 669D(小思维+负数取模)
题目链接:http://codeforces.com/problemset/problem/669/D题意:q次按顺序操作,操作1:整体移动给定单位距离;操作2:奇偶位互换,要求输出q次操作后的情况思路:不管是整体移动还是奇偶互换,所有的奇数之间的相对位置是不变的,这也意味着所有的偶数相对位置也是不变的。(1后两位是3,3后两位是5;2后两位是4,4后两位是6……依此类推)代...
2018-07-24 14:47:00
149
转载 并查集
概念: 并:合并两个元素所在的组 查:查询两个元素是否属于同一个组核心代码: 1 int par[MAX_N]; //父节点 2 int rank[MAX_N]; //树的高度 3 4 //初始化 5 void init(int n) 6 { 7 for(int i = 0; i < n; i++)...
2018-07-11 11:09:00
64
转载 博弈——Bash、Nim、Wythoff
一、巴什博弈(Bash Game) 有一堆n个物品,两个人轮流从中取出(1~m)个;最后取光者胜。 结论:n = k * (m + 1) + r,r = 0,先手必输;r != 0,先手必胜。二、尼姆博弈(Nimm Game) 有任意堆物品,每堆物品的个数是任意的,双方轮流从中取物品,每一次只能从一堆物品中取部分或全部物品,最少取一件,取到最后一件物品的人获胜...
2018-06-06 17:55:00
203
转载 博弈——SG函数模板
之前遇到博弈的题老是无从下手,今天学习了下博弈题的一个“小套路”,叫做Sprague-Grundy函数。Sprague-Grundy函数定义为不出现在F(X)中每一个元素的Sprague-Grundy函数的最小非负数。听着有点绕,其实举个例子就很好理解了。举例子前先说几个名词: x:当前状态量 F(x):表示一个点能到达点的集合 SG[]:0-n的SG函数值...
2018-06-05 20:49:00
227
转载 数据结构——二叉树
树的一些基本术语:(针对我个人觉得要必要列出来的结点的度:结点拥有的子树数。树的度:树内各结点度的最大值。非终端结点:度不为0的结点称为非终端结点或分支结点。除根结点外,非终端结点也称为内部结点。层次:根为第一层,不是第零层。树的深度:树中结点的最大层次,深度也称为高度。森林:是m(m>=0)棵互不相交的树的集合。对树中每个结点而言,其子树的集合即为森林...
2018-05-30 12:31:00
139
转载 数据结构——链式队列
1 #include<iostream> 2 #include<stdlib.h> 3 using namespace std; 4 5 typedef int ElemType; 6 typedef int Status; 7 #define OK 1 8 #define ERROR 0 9 #defin...
2018-05-30 01:26:00
149
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人