算法
文章平均质量分 76
RadiumYang
ACM退役打牌选手
展开
-
用红黑树实现map和set
用红黑树实现map和set上一篇文章讲解了如何实现红黑树:https://blog.csdn.net/Radium_1209/article/details/104873813这里我们用已经实现的红黑树来写一个简单的map和set。因为map有两个参数,所以我们要先对原来的代码进行微调,将传入的参数调整为Key和Value。还有一些地方需要微调,详见https://github.com/...原创 2020-03-18 20:50:16 · 542 阅读 · 0 评论 -
对红黑树的一些理解及实现
对红黑树的一些理解及实现红黑树(英语:Red–black tree)是一种自平衡二叉查找树,是在计算机科学中用到的一种数据结构,典型的用途是实现关联数组。以下是我对红黑树的一些理解,可供参考,不保证准确性。参考了以下博文:https://www.cnblogs.com/alantu2018/p/8462017.html特性每个节点是黑色或红色(所以叫红黑树)根节点是黑色的叶节点是...原创 2020-03-18 20:04:40 · 331 阅读 · 0 评论 -
LCA之倍增法(例题:POJ1330)
LCA之倍增法最近公共祖先简称 LCA(Lowest Common Ancestor)。两个节点的最近公共祖先,就是这两个点的公共祖先里面,离根最远的那个。除去朴素算法,LCA还可以用倍增法来求,倍增法在算法中的应用还是比较多的,可以用来求ST表(区间最大最小值),还可以用来求LCA。其中求LCA的方法如下:整体流程预处理用BFS或者DFS处理deg[i]:结点i的深度fa[i...原创 2019-10-14 22:53:24 · 262 阅读 · 0 评论 -
欧拉函数
打巧克力杯周赛的时候,遇到了一道欧拉函数板子题,然而我居然不会(数论全推给队友),结果是我居然用埃氏筛自己打出来了,居然还是对的。下面是那道题:例题:Farey Sequence LengthGiven a positive integer, NN, the sequence of all fractions a/ba/b with 0≤a≤b0≤a≤b, 1≤b≤N1≤b≤N a...原创 2018-12-05 23:47:16 · 124 阅读 · 0 评论 -
状压DP(例题:HDU1074)
状压DP:用到状压的DP。什么是状压?把一系列状态压缩成一个状态(通常用二进制)。 例题:HDU1074Doing HomeworkTime Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 12604 Accepted...原创 2018-11-14 20:55:32 · 285 阅读 · 5 评论 -
树状数组(例题:HDU1166)
树状数组(Binary Indexed Tree(B.I.T), Fenwick Tree)是一个查询和修改复杂度都为log(n)的数据结构。主要用于查询任意两位之间的所有元素之和,但是每次只能修改一个元素的值。 修改和求和的时间复杂度:logn 设节点编号为x,那么这个节点管辖的区间为2^k(其中k为x二进制末尾0的个数)个元素。例如:C1(0001) = A1 ...原创 2018-11-18 23:52:20 · 220 阅读 · 0 评论 -
HDU1074 Max Sum Plus Plus
Max Sum Plus PlusTime Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 38720 Accepted Submission(s): 13890 Problem DescriptionNow I think y...原创 2018-11-13 17:45:57 · 115 阅读 · 0 评论 -
ACM自用模板
目录1 动态规划(DP)1.1 最长上升子序列(LIS)1.1.1 O(n^2)1.1.2 O(nlogn)1.2 最长公共子序列(LCS)1.3区间DP1 动态规划(DP)1.1 最长上升子序列(LIS)1.1.1 O(n^2)//求到第i位的最长子串长度for (int i=0;i<len;i++){ //自己的长度1 dp[i]=1;...原创 2018-11-03 17:02:54 · 191 阅读 · 1 评论 -
马踏棋盘的贪心优化
数据结构上机时发现有一个优化马踏棋盘的方法。仅适用于优化求解一个(或少数),对于求所有解时间不变。优先选取拥有较少可行孙节点的子节点方向。 即dfs查找路径时优先选择孙节点少的子节点。下面附上代码。代码:#include <cstdio>#include <iostream>#include <cstring>#include...原创 2018-10-07 23:32:15 · 242 阅读 · 2 评论 -
LIS路径记录(UVA481)
出自一次很失败的开学测试LIS自然会做可以参见:https://blog.csdn.net/Radium_1209/article/details/79704234由于对于LIS的nlogn算法不熟悉,导致错误理解,记录的路径出现了问题,其中还用了n^2的算法记录路径(好理解),但是不出所料T了。正确的方法应该是:由于nlogn算法中,dp[i]存的是长度为i的最后一位数字,并不是...原创 2018-09-10 22:24:10 · 316 阅读 · 0 评论 -
直线交点问题(例题:POJ1269)
求直线交点求直线交点模板,详见刘汝佳紫书。// 判断有无交点,看Cross(v,w),为0则没有交点。Point GetLineIntersection(Point P,Vector v,Point Q,vector w) { vector u = P-Q; double t = Cross(w,u) / Cross(v,w); return P+v*t;}Intersectin...原创 2019-04-20 19:35:57 · 499 阅读 · 0 评论 -
叉积_点与直线(例题:POJ2318)
叉积_点与直线叉积:向量之间的X运算。假设P(x1,y1,0),Q(x2,y2,0)可得行列式:|i j k||x1 y1 0||x2 y2 0|得P × Q= (x1y2-x2y1)j若 P × Q > 0 , 则P在Q的顺时针方向。若 P × Q < 0 , 则P在Q的逆时针方向。若 P × Q = 0 , 则P与Q共线,但可能同向也...原创 2019-04-17 00:02:10 · 344 阅读 · 0 评论 -
cmath中的y0,y1...
写题的时候遇到了一个很坑的问题,感觉没问题的程序报错了,然后他是这样的:V.cpp:7:8: error: ‘int y1’ redeclared as different kind of symbol int x1,y1,x2,y2,x3,y3; ^~In file included from /usr/include/features.h:424:0, ...原创 2019-05-03 23:31:04 · 993 阅读 · 1 评论 -
匈牙利算法(二分图最大匹配;例题:HDU1083)
匈牙利算法前导知识什么是二分图?设G=(V,E)是一个无向图,如果顶点V可分割为两个互不相交的子集(A,B),并且图中的每条边(i,j)所关联的两个顶点i和j分别属于这两个不同的顶点集(i in A,j in B),则称图G为一个二分图简单的说就是有两个集合的点,每个集合中的点只能和另外一个集合中的点相连。链式前向星一种存图的数据结构,相对不好写但是速度较快。...原创 2019-05-05 20:50:15 · 1217 阅读 · 0 评论 -
POJ3014(最小覆盖点;匈牙利算法)
匈牙利算法需要知道的知识点:最小覆盖点==最大匹配关于匈牙利算法的详解,可以看我的另外一篇博文。例题:AsteroidsTime Limit: 1000MS Memory Limit: 65536KTotal Submissions: 27787 Accepted: 14897DescriptionBessie wants to navigate her spaceshi...原创 2019-05-05 22:24:35 · 228 阅读 · 0 评论 -
线段相交问题(例题:POJ2653)
求线段交点求线段交点问题,依然见刘汝佳紫书。// 每条线段的两个端点都在另一条线段两侧(叉积符号不同)// a1,a2为一条线段,b1,b2为另一条线段bool SegProInt(Point a1,Point a2,Point b1,Point b2) { double c1 = Cross(a2-a1,b1-a1), c2 = Cross(a2-a1,b2-a1), c3 ...原创 2019-04-25 17:14:51 · 286 阅读 · 0 评论 -
直线与线段相交问题(例题:POJ3304)
判断直线与线段是否相交判断直线与线段是否相交,这个刘汝佳的板子上没有,但是稍微分析一下就可以得到了,这个是线段相交的简化版。// 显然只需要b1,b2在a1,a2两侧即可,不需要判断a1,a2是否在b1,b2两侧// 其中a1,a2是直线,b1,b2是线段bool SegLineInt(Point a1,Point a2,Point b1,Point b2) { double c1 = ...原创 2019-04-25 17:31:00 · 691 阅读 · 1 评论 -
2019 Multi-University Training Contest 6——1005 Snowy Smile
杭电多校第六场的第五题这个题目WA了我一天,因为思路和题解的不一样,一直以为是思路错了,结果最后发现居然是线段树写错了,真的是佛了。Snowy SmileTime Limit: 4000/4000 MS (Java/Others) Memory Limit: 524288/524288K (Java/Others) Total Submission(s): 2640 Acce...原创 2019-08-08 22:19:35 · 155 阅读 · 0 评论 -
LCA之朴素求法(例题:HDU2586)
LCA之朴素求法最近公共祖先简称 LCA(Lowest Common Ancestor)。两个节点的最近公共祖先,就是这两个点的公共祖先里面,离根最远的那个。求LCA有很多很多的办法,最简单的就是朴素求法:每次找深度比较大的那个点,让它向上跳。显然在树上,这两个点最后一定会相遇,相遇的位置就是想要求的 LCA。这个极其暴力的做法,复杂度为O(n),我们来尝试一下吧。How far aw...原创 2019-08-21 18:35:43 · 361 阅读 · 0 评论 -
Dijkstra算法(最短路;例题HDU2112)
Dijkstra算法:求单源最短路的算法。主要步骤:1.定义一个dis数组记录起始点到每个点的距离,初始化时不能到达的记为inf(一般用0x3f3f3f3f)。tip:关于inf,使用0x3f3f3f3f有两个好处,一是初始化可以用memset,二是inf+inf不会爆int2.找到离起始点最近的节点从这个点松弛,并标记3.松弛,如果出现s->m >s->k...原创 2018-09-03 23:34:09 · 1896 阅读 · 0 评论 -
字典树(tire tree,例题:HDU1247,HDU1251,HDU4825)
字典树(tire tree):把字母存在树中,其中一条子链(从根节点开始)就是一个单词。 核心代码(主要三部分:结构体,插入,查询):1.创建结构体struct node{ //isEnd是否是最后一字母 //也可以是别的,比较灵活 int isEnd; //此处为26个字母(如果更多的话可以增加) struct node *...原创 2018-08-25 23:31:09 · 497 阅读 · 0 评论 -
素数求法
方法一:暴力求解(慢O(sqrt(n)))从2开始遍历到sqrt(n),如果有能除尽的则不是素数,否则则是素数,需要空间小,速度慢。#include <cstdio>#include <iostream>#include <cmath>using namespace std;int prime(int x){ if (x==0||x==1) ret...原创 2018-05-08 00:06:19 · 646 阅读 · 2 评论 -
记忆化搜索(DP)
记忆化搜索(Memory search):在普通搜索的基础上记录一部分已计算的结果从而避免重复计算。 例题:滑雪 Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 104767 Accepted: 39905 DescriptionMichael喜欢滑雪百这并不奇怪,...原创 2018-05-12 17:42:34 · 245 阅读 · 0 评论 -
斯特林公式
斯特林公式用于求n阶乘的近似值。n!的位数:lg(n!)=lg1+lg2+...+lgn向下取整+1;例题:Big NumberTime Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 41322 Accepted Submission(s):...原创 2018-04-07 22:29:14 · 385 阅读 · 0 评论 -
欧拉回路
例题:欧拉回路Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 17034 Accepted Submission(s): 6579Problem Description欧拉回路是指不令笔离开纸面,可画过图中每条边仅一次,且可以回到起点...原创 2018-04-11 00:21:33 · 142 阅读 · 0 评论 -
拓扑排序
拓扑排序(topsort)核心思想:不停找入度为零的点不断删去,并更新其他节点入度直到为空。适用范围:一些满足一定先后关系的活动排序。John has n tasks to do. Unfortunately, the tasks are not independent and the execution of one task isonly possible if other tasks hav...原创 2018-04-11 00:45:44 · 247 阅读 · 0 评论 -
快速幂(例题:BZOJ1008)
在进行幂运算时一个一个乘需要耗费大量时间可以用一种类似二分的算法来快速运算,这就是快速幂。比如求x^n,n为偶数,x^n=(x^2)^(n/2),n为奇数,x^n=(x^2)^(n/2)*x;不停地分下去,知道n为0时停止。#include <iostream>typedef long long ll;using namespace std;ll mod_pow(ll...原创 2018-03-27 20:47:00 · 510 阅读 · 0 评论 -
最长上升子序列(LIS)
LIS:Longest Increasing Subsequence例题: 单调递增最长子序列时间限制:3000 ms | 内存限制:65535 KB难度:4描述求一个字符串的最长递增子序列的长度如:dabdbf最长递增子序列就是abdf,长度为4输入第一行一个整数0<n<20,表示有n个字符串要处理随后的n行,每行有一个字符串,该字符串的长...原创 2018-03-26 21:41:36 · 271 阅读 · 0 评论 -
二分查找+贪心
疯牛时间限制:1000 ms | 内存限制:65535 KB难度:4描述农夫 John 建造了一座很长的畜栏,它包括N (2 <= N <= 100,000)个隔间,这些小隔间依次编号为x1,...,xN (0 <= xi <= 1,000,000,000).但是,John的C (2 <= C <= N)头牛们并不喜欢这种布局,而且几头牛放在一个隔间里,他们...原创 2018-02-01 18:51:20 · 469 阅读 · 0 评论 -
最长公共子序列(LCS)
LCS:Longest Increasing Subsequence例题:Common SubsequenceTime Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 46089 Accepted Submission(s): 21161Pro...原创 2018-05-08 00:27:12 · 130 阅读 · 1 评论 -
Prim算法(最小生成树;例题:nyoj38)
Prim:求最小生成树的另一个算法 还可以用Kruskal(https://blog.csdn.net/Radium_1209/article/details/80503384)与Kruskal的不同:Kruskal是加边,而Prim是加点具体步骤:以任意点(一般为第一个点)为起点 找到能以最小权能到达的点加入已访问点集合 ...原创 2018-06-04 00:27:12 · 3566 阅读 · 0 评论 -
Lucas定理(求组合数,例题FZU2020,HDU3944)
Lucas定理:用于求C(n,m) mod p,其中p为素数证明等在网上都可以找到,我也不是很懂就略过了(懂了补上)。直接贴出用法吧:主要代码就两行,需要用到的知识有快速幂和求逆元(计算组合数),必要的时候需要打表(计算阶乘)快速幂:https://blog.csdn.net/Radium_1209/article/details/79718918核心代码: ll lu...原创 2018-08-25 20:52:40 · 553 阅读 · 0 评论 -
最大流自用模板(例题:HDU1532)
三种模板:Edmonds_Karp,Dinic,SAP例题:Drainage Ditches(HDU1532)Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 22365 Accepted Submission(s): 1...原创 2018-08-30 17:36:03 · 143 阅读 · 0 评论 -
一个%引发的血案(HDU2048)
这是某一次不知道什么比赛,其中有一道错排的题目。讲道理我是不会错排的,但是这个题目,我暴力找到了规律(好像有点类似错排),然后一直没过,多次以为是精度的问题,结束了也没过,然后搜了一下题解,测了每一个数据,发现完全没有问题。这时候我队友问了我一句,你用两个%%了吗,恍然大悟,改一波提交,AC。谨以此文提醒自己,不要犯一些低级的错误!!!注意%%以下为题目: 神、上帝以及老天...原创 2018-07-03 20:57:47 · 320 阅读 · 2 评论 -
JAVA大数模板
遇到高精度怎么办?用几十行的C/CPP!?显然不是最佳选择。此时用JAVA就能轻松解决:import java.math.BigDecimal;import java.util.Scanner;import java.math.BigInteger; public class Main{ public static void main(String args[]){ ...原创 2018-06-24 00:56:26 · 165 阅读 · 0 评论 -
算数基本定理(例题:LightOJ1341)
算数基本定理:基本形式:(Pn表示质数)导出结论(ACM中会用到的):1. (正因数个数)2. (正因数之和)例题:1341 - Aladdin and the Flying Carpet PDF (English)StatisticsForumTime Limit: 3 second(s)Memory Limit: 32 MBIt's said that Aladdin had ...原创 2018-05-31 23:45:24 · 308 阅读 · 0 评论 -
Floyd算法(最短路;例题UVA10048)
Floyd算法:求最短路的一种算法(最暴力的方法)复杂度O(n3)特点:速度慢,但是任意起点的(与Dijkstra不同),程序不难,但很多题目都是变式,需要较深的理解(原理是动态规划)标程:#include <cstdio>#include <iostream>#define INF 0x3f3f3f3fusing namespace std;int ...原创 2018-06-05 23:57:16 · 1219 阅读 · 0 评论 -
Kruskal算法(最小生成树;例题:HDU1233)
Kruskal:求最小生成树的一个算法。需要了解的知识:并查集(https://mp.csdn.net/postedit/79661568)具体步骤:将边按照价值排序(贪心思想)如果这两个边不通,利用并查集将两个边并起来 加上边的权值例题:还是畅通工程Time Limit: 4000/...原创 2018-05-29 23:15:13 · 862 阅读 · 0 评论 -
Tarjin算法(例题:第八届蓝桥杯国赛C语言B组第4题)
虽然蓝(bao)桥(li)杯已经结束了,但是之前练习的时候做的一个题让我学到了一个新的算法——Tarjin算法。例题:发现环(第八届蓝桥杯国赛C语言B组第4题)小明的实验室有N台电脑,编号1~N。原本这N台电脑之间有N-1条数据链接相连,恰好构成一个树形网络。在树形网络上,任意两台电脑之间有唯一的路径相连。不过在最近一次维护网络时,管理员误操作使得某两台电脑之间增加了一条数据链接,于是网络中出现了...原创 2018-05-29 21:10:50 · 273 阅读 · 0 评论 -
并查集
例题:C. Rumortime limit per test2 secondsmemory limit per test256 megabytesinputstandard inputoutputstandard outputVova promised himself that he would never play computer games... But recently Firestorm...原创 2018-03-22 23:32:54 · 264 阅读 · 0 评论