算法
文章平均质量分 64
埋没。
这个作者很懒,什么都没留下…
展开
-
二叉搜索树 模板
概念:左节点比根小,右节点比根大。struct Node{ int val; Node * left; Node * right;};Node * insert(Node * p,int x){//插入一个节点 if(p==NULL){ Node * q=new Node; q->val=x; q->left=NULL; q->right=NULL; return q; } else{ if(x<p->val)p->left=i原创 2020-10-05 15:01:26 · 171 阅读 · 0 评论 -
Travelling by Stagecoach POJ No.2686
虽然可以把城市看作顶点,道路看作边建图,但是由于有车票相关的限制,无法直接使用Dijkstra算法求解,不过,这种情况下只需要把状态作为顶点,而把状态的转移看作边来见图就可以有效的避免这个问题。让我们考虑一下"现在在城市v,此时还剩下的车票的集合为S",这样的状态,从这个状态出发使用一张车票i∈S移动到相邻的城市u,就相当于转移到了"在城市u,此时还剩下的车票为S/{i}"这个状态。把这个转移看...原创 2020-03-26 11:47:55 · 193 阅读 · 0 评论 -
分桶法和平方分割
概念分桶法(bucket method)是把一排物品或者平面分成桶,每个桶分别维护自己内部的信息,以达到高校计算的目的的方法。其中,平方分割(sqrt decomposition)是把排成一排的n个元素每n(1/2)分在一个桶内进行维护的方法的总称。这样的分割方法可以使对区间操作的复杂度降至O(n(1/2))和线段树一样,根据维护的数据的不同,平分割可以支持很多不同的操作。1.基于平方分割...原创 2020-03-26 11:15:13 · 378 阅读 · 0 评论 -
树状数组区间更新区间查询
如果给区间[l,r]同时加上x的话,每个节点的值将会如何变化呢?如果令s(i)=加上x之前的Σj=1iajs’(i)=加上x之后的Σj=1iaj那么就有is’(i)=s(i)l<=i<=r->s’(i)=s(i)+x ✖ (i-l+1)=s(i)+x✖i-x✖(l-1)rs’(i)=s(i)+x✖(r-l+1)下面记sum(bit,i(为树状数组bit的前i项和。我...原创 2020-03-26 10:00:49 · 150 阅读 · 0 评论 -
3.4熟练掌握动态规划
状态压缩DP旅行商问题 TSPTSP问题是NP困难的,没有已知的多项式时间得高效算法可以解决这一问题,不过在程序设计竞赛中还是有可能出现这种范围比较小的题目的。所有可能的路线共有(n-1)~.对于这个问题,我们可以用DP来解决。首先我们先试着写出它的递推式。假设现在已经访问过的顶点的集合(起点0当作还问访问过的顶点)为S,当前所在的顶点为v,用dp[s][v]表示从v出发访问剩余的所有顶...原创 2020-03-22 11:27:45 · 135 阅读 · 0 评论 -
HDU 3974 DFS序+区间染色+单点查询
Problem DescriptionThere is a company that has N employees(numbered from 1 to N),every employee in the company has a immediate boss (except for the leader of whole company).If you are the immediate ...原创 2020-03-21 13:34:44 · 112 阅读 · 0 评论 -
HDU 1540 线段树区间合并抽象学习
Problem DescriptionDuring the War of Resistance Against Japan, tunnel warfare was carried out extensively in the vast areas of north China Plain. Generally speaking, villages connected by tunnels la...原创 2020-03-21 11:24:06 · 94 阅读 · 0 评论 -
HDU 4027 线段树区间查询更新
题目A lot of battleships of evil are arranged in a line before the battle. Our commander decides to use our secret weapon to eliminate the battleships. Each of the battleships can be marked a value of...原创 2020-03-20 14:20:47 · 94 阅读 · 0 评论 -
POJ 3264 线段树模板水题
题目For the daily milking, Farmer John’s N cows (1 ≤ N ≤ 50,000) always line up in the same order. One day Farmer John decides to organize a game of Ultimate Frisbee with some of the cows. To keep thi...原创 2020-03-20 10:18:44 · 65 阅读 · 0 评论 -
ZOJ 1610一道疯狂踩坑的线段区间染色问题
题目Painting some colored segments on a line, some previously painted segments may be covered by some the subsequent ones.Your task is counting the segments of different colors you can see at last....原创 2020-03-20 09:59:55 · 279 阅读 · 0 评论 -
HDU 1698 Just a Hook 线段树区间更改模板题
题目描述In the game of DotA, Pudge’s meat hook is actually the most horrible thing for most of the heroes. The hook is made up of several consecutive metallic sticks which are of the same length.Now Pu...原创 2020-03-19 20:41:03 · 128 阅读 · 0 评论 -
POJ 2528线段树区间改值+染色问题+区间离散化
题目描述The citizens of Bytetown, AB, could not stand that the candidates in the mayoral election campaign have been placing their electoral posters at all places at their whim. The city council has fin...原创 2020-03-19 17:52:31 · 153 阅读 · 0 评论 -
线段树-染色问题 模板&POJ 2777题解
原创大佬的博客线段树进阶-染色问题建树线段树的精髓就是利用lazy数组,可以保证不遍历到子节点就可以获得区域的情况。那么染色也要利用这个性质,对于一段区间,我们想要在上层节点上面表示出来,那么我们可以设置3个变量:-1表示当前区段有多种颜色,具体有多少种我们不用管。0表示当前区域未染色。正整数表示当前区域染了单一染色,并且颜色号是这个正整数。这是按照上面的要求写的线段树,-1表示这段有多种...原创 2020-03-19 15:54:16 · 541 阅读 · 0 评论 -
POJ 3468 线段树加lazy标记模板
题目You have N integers, A1, A2, … , AN. You need to deal with two kinds of operations. One type of operation is to add some given number to each number in a given interval. The other is to ask for th...原创 2020-03-19 14:02:13 · 126 阅读 · 0 评论 -
HDU 1754 I Hate It 线段树水题
问题很多学校流行一种比较的习惯。老师们很喜欢询问,从某某到某某当中,分数最高的是多少。这让很多学生很反感。不管你喜不喜欢,现在需要你做的是,就是按照老师的要求,写一个程序,模拟老师的询问。当然,老师有时候需要更新某位同学的成绩。输入本题目包含多组测试,请处理到文件结束。在每个测试的第一行,有两个正整数 N 和 M ( 0<N<=200000,0<M<500...原创 2020-03-19 12:09:45 · 82 阅读 · 0 评论 -
HDU 1166 排兵布阵 线段树和树状数组模板题
线段树解法#include<iostream>#include<cstdio>using namespace std;const int maxn=50005;int tree[maxn<<2],w[maxn];int N;void build(int id,int l,int r){ if(l==r){ tree[id]=w[l]; r...原创 2020-03-19 11:49:50 · 81 阅读 · 0 评论 -
线段树模板
建立线段树,单点更新,单点查询,区间查询模板const int maxn=200005;int maxv[maxn<<2],w[maxn];//一般开4倍大小void build(int id,int l,int r){ if(l==r){ maxv[id]=w[l]; return; } int mid=(l+r)>>1; build(id<&...原创 2020-03-19 09:48:58 · 76 阅读 · 0 评论 -
树状数组
Binary Indexed Tree(树状数组)的概念树状数组是能够完成下述操作的数据结构。给定一个初始值全为0的数列a1,a2,···,an给定i,计算a1+a2+···+ai给定i和x,执行ai+=x基于线段树的实现如果使用线段树,只需要对前一节的RMQ的样例作少许修改就可以实现这两个功能。即线段树的每个节点上维护的是对应区间的和。接下来,我们来看如何求得对应区间的和(s到...原创 2020-03-18 16:16:55 · 78 阅读 · 0 评论 -
线段树
概念线段树是擅长处理区间的。线段树是一颗完美二叉树(所有叶子结点的深度都相同,并且每个节点要么是叶子要么有两个儿子的树),树上的每个节点都在维护一个区间。根维护的是整个区间,每个节点维护的是父亲的区间二等分后的其中一个子区间。当有n个元素时,对区间的操作可以在O(logn)的时间内完成。根据节点中维护的数据的不同,线段树可以提供不同的功能。下面我们以实现了Range Minimum Query...原创 2020-03-17 21:11:10 · 110 阅读 · 0 评论 -
常用技巧精选(一)
尺取法 Subsequence POJ No.3061 (1)求连续子序列中总和不小于S的最小长度。由于所有的元素都大于0,如果子序列[s,t)满足as+···+at-1>=S,那么对于任何的t<t’一定有as+···+at’-1>=S。此外对于区间[s,t)上的总和来说如果令sum(i)=a0+a1+···+ai-1那么as+as+1+···+at-1=sum(t)-...原创 2020-03-15 17:57:08 · 198 阅读 · 0 评论 -
二分
lower_boundint n,k;//在n大小的数组中找到a~i~>=k的最小的i,不存在则输出nint a[maxn];void solve(){ int lb=0,ub=n; while(lb<ub){ int mid=(lb+ub)>>1; if(a[mid]>=k){ ub=mid; } else lb=mid+1; }...原创 2020-03-18 18:04:28 · 87 阅读 · 0 评论 -
2.6数学问题的解题窍门
2.62.6.11.求最大公约数例题:线段上格点的个数枚举的话的时间复杂度为O(|x2-x1| x |y2-y1|),对坐标的绝对值较大的情况难以处理。其实这道题的答案如page114的图所示,是|x1-x2|和|y1-y2|的最大公约数-1(要注意特判|x1-x2=0且|y1-y2|=0时答案为0).辗转相除法:设gcd(a,b)是设计子认输a和b的最大公约数的函数,a除b得到的商和余...原创 2020-03-18 18:04:54 · 419 阅读 · 0 评论 -
学习笔记 2.5 图的应用
2.5.6 图的应用例题:Roadlocks POJ No.3255我们把路口看作顶点,把道路看作边的无向图。虽然用Dijkstra等算法可以简单地求出最短路径,但是次短路应该怎么算呢?Dijkstra地思路是一次确定尚未确定地定点中距离最小地顶点。按照这个思路对算法进行少许修改,就可以简单地求出次短路了。到某个顶点v的次短路要么是到其他顶点u的最短路再加上u->v的边,要么是到u的次...原创 2020-03-18 18:06:07 · 112 阅读 · 0 评论 -
学习笔记 2.5图的理论
2.5.1 图是什么图是由顶点(vertex,node)和边(edge)组成。顶点代表对象。在示意图中,我们使用点或圆来表示。边表示的是两个对象的连接关系。无向图术语两个顶点之间如果有边连接,那么就视为两个顶点相邻。相邻顶点的序列称为路径。起点和终点重合的路径叫做圈。任何两点之间都有路径链接的图叫做连通图。顶点链接的边数叫做这个顶点的度。没有圈的连通图叫做树(tree),没有圈的非连通图叫...原创 2020-03-18 18:07:32 · 756 阅读 · 0 评论 -
学习笔记2.4 加工并储存数据的数据结构
2.42.4.2 优先队列和堆2.4.2.1优先队列能够完成下列操作的数据结构叫做优先队列。1.插入一个数值2.取出最小的数值(获得数值,并且删除)能够使用二叉树高效地解决上述问题地,是一种叫做堆的数据结构。2.4.2.2 堆的结构堆最重要的性质就是儿子的值一定不小于父亲的值。除此之外,树的节点是按从上到下,从左到右的顺序紧凑排列的。在向堆种插入数值时,首先在堆的末尾插入该数值,...原创 2020-03-18 18:06:18 · 144 阅读 · 0 评论 -
学习笔记2.2续
例题:多重部分和问题定义:dp[i+1][j]前i种数字是否能构成j为了用前i种数字加和成j,也就需要能用前i-1种数字加和成j,j-ai,···,j-mi x ai中的某一种。我们可以定义如下递推关系:dp[i+1][k] (0<=k<=mi且k X ai<=j时存在dp[i][j-k X ai]为真的k)int n,K,a[maxn],m[maxn];bool dp...原创 2020-03-18 18:08:28 · 97 阅读 · 0 评论 -
学习笔记2.2一往直前!贪心法(挑战程序设计竞赛)
2.2一往直前!贪心法贪心法就是遵循某种规则,不断贪心地选取当前最有策略地算法设计方法。2.2.1例题:硬币问题挑战程序设计竞赛page 39能用最大的硬币值就用最大的硬币值,然后依次往下迭代。const int V[6]={1,5,10,50,100,500};int C[6];//输入各种硬币的个数int A;//输入的金额void solve(){ int ans...原创 2020-03-18 18:08:13 · 262 阅读 · 0 评论 -
学习笔记第二章挑战程序设计竞赛2.1
2.1最基础的"穷竭搜索"2.1.4深度优先搜索深度优先搜索(DFS,Depth-First Search)是搜索的手段之一。它从某个状态开始,不断地转移状态直到无法转移,然后回退到前一步的状态,继续转移到其他状态,如此不停反复,直到找到最终的解。例题:部分和问题挑战程序设计竞赛page.30思路:从a0开始按顺序决定每个数字加还是不加,在全部n个数都决定后再判断它们的和是不是为k即...原创 2020-03-18 18:03:41 · 144 阅读 · 0 评论 -
学习笔记第一章
假设时间限制为1秒106游刃有余107勉勉强强108很悬,仅结构体非常简单的情况POJ No.1852对于最短的时间来说,所有的蚂蚁都朝向较近的端点走是最快的。对于最长的时间来说,两只蚂蚁遇见后折返,如果我们无视蚂蚁与蚂蚁之间的区别,其实就相当于两只蚂蚁一直以同一个方向前进然后走到终点。所以这个时候我们就可以以所有蚂蚁中离端点最远的一个作为答案。题目链接int L,N;int x...原创 2020-03-18 18:02:54 · 80 阅读 · 0 评论 -
2n皇后问题
问题描述给定一个n*n的棋盘,棋盘中有一些位置不能放皇后。现在要向棋盘中放入n个黑皇后和n个白皇后,使任意的两个黑皇后都不在同一行、同一列或同一条对角线上,任意的两个白皇后都不在同一行、同一列或同一条对角线上。问总共有多少种放法?n小于等于8。输入格式输入的第一行为一个整数n,表示棋盘的大小。 接下来n行,每行n个0或1的整数,如果一个整数为1,表示对应的位置可以放皇后,如果一个整数为0...原创 2020-02-26 14:33:58 · 396 阅读 · 1 评论 -
n个最小和加强版
题目描述给出m个包含n个整数的数组 A1,A2 ··· Am。分别在A1 ,A2,⋯,Am中任意出一个数并且相加,可以得到 nm 个和。求这些和中最小的n个。输入格式输入第一行两个整数 m,n(1 <= m,n <= 1000)。接下来 m行,每行每行n个整数,表示数组 A。1<=Aij<=109输出格式从小到大输出最小的n个和,用空格隔开。样例输入2 4...原创 2020-02-25 16:29:03 · 325 阅读 · 0 评论 -
前序中序还原二叉树并且翻转左右子树输出
题目描述:给定一个二叉树的中序遍历序列和前序遍历序列,先将树左右翻转(对于每个非叶结点,左右子树互换),然后输出翻转后树的层序遍历。二叉树每个结点的值不同。输入格式第一行一个整数 N(1 <= N <= 30)N(1≤N≤30) ,表示二叉树结点个数。第二行N个整数,表示二叉树的中序遍历序列。第三行N个整数,表示二叉树的前序遍历序列。二叉树每个结点的值为不超过 109 的正...原创 2020-02-25 11:54:37 · 246 阅读 · 0 评论 -
NOIP 2009 细胞分裂
传送门算法思想这是一道质因数分解题,按照8年级下册的有关公式,我们可以通过质因数的分解来解决这道题。对于第i种细胞,在经过t秒之后有St个细胞,而对于m1m2个试管,则要求St是m1m2的倍数。而要做到这一点,首先Si必须包含m1的所有质因数,否则Si不可能达到m1的倍数。对m1分解质因数,拿Si来看是否拥有这些质因数。如果拥有,那么就选择该细胞进行计算时间。显然,时间应该不小于m1的所有...原创 2020-02-22 09:33:49 · 229 阅读 · 0 评论 -
前向星、链式前向星、SPFA算法
前向星前向星是一种特殊的编辑数组,我们把编辑数组中的每一条边按照起点从小到大排序,如果起点相同按照终点从小到大排序,并记录下以某个点为起点的所有边在数组中的起始位置和存储长度,那么前向星就构造好了。用len[i]来记录所有以i为起点的边在数组中的存储长度。用head[i]来记录以i为边集在数组中的第一个存储位置。对于下列图输入:1 22 33 41 34 11 54 5那么...原创 2020-02-21 20:15:43 · 205 阅读 · 0 评论 -
NOIP 2014 比例简化
Description在社交媒体上,经常会看到针对某一个观点同意与否的民意调查以及结果。例如,对某一观点表示支持的有 1498人,反对的有 902人,那么赞同与反对的比例可以简单的记为 1498:902。不过,如果把调查结果就以这种方式呈现出来,大多数人肯定不会满意。因为这个比例的数值太大,难以一眼看出它们的关系。对于上面这个例子,如果把比例记为 5:3,虽然与真实结果有一定的误差,但依然能够...原创 2020-02-21 18:00:35 · 224 阅读 · 0 评论 -
二分+链式前向星+spfa([Usaco2007 Jan]Telephone Lines架设电话线)
题目:FarmerJohn打算将电话线引到自己的农场,但电信公司并不打算为他提供免费服务。于是,FJ必须为此向电信公司支付一定的费用。FJ的农场周围分布着N(1<=N<=1,000)根按1…N顺次编号的废弃的电话线杆,任意两根电话线杆间都没有电话线相连。一共P(1<=P<=10,000)对电话线杆间可以拉电话线,其余的那些由于隔得太远而无法被连接。第i对电话线杆的两个端点...原创 2020-02-21 17:53:33 · 167 阅读 · 0 评论 -
快速幂和快速乘
快速幂所谓快速幂,是指一种能够优化求xn的算法。一般来说求xn的朴素算法为n个x相乘,复杂度为O(n),对于一般需求的幂运算来说是足够的。但是在做算法题时我们经常会发现,题目往往会要求我们对一个数求取一个很大的幂,通常还需要对一个很大的数进行取模运算,而这种情况下就算我们用long long去保存也是会溢出的,而就算我们解决掉了取模的问题,朴素算法的求幂所需的时间有时也是我们不能接受的,那么有什...原创 2020-02-21 14:44:53 · 191 阅读 · 0 评论