算法竞赛进阶指南
神探小小迪
回头看,呀!这代码是我以前写的啊,写的是啥啊~
展开
-
单源最短路径
1、Dijkstra算法算法流程:初始化 dis[1] = 0,其余节点的 dis值为正无穷; 找出一个未被标记的、dis[x] 最小的节点 x,然后标记节点 x; 扫描节点 x 的所有出边(x, y, z),若 dis[y] > dis[x] + z,则使用 dis[x] + z 更新 dis[y]; 重复上述两个步骤,直到所有节点都被标记。Diskstra算法基于贪心思想,...原创 2018-12-01 20:38:43 · 245 阅读 · 0 评论 -
POJ 1733 Parity【扩展域并查集】
题目链接:http://poj.org/problem?id=1733Now and then you play the following game with your friend. Your friend writes down a sequence consisting of zeroes and ones. You choose a continuous subsequence (f...原创 2018-09-25 16:57:15 · 208 阅读 · 0 评论 -
POJ 1456 Supermarket【并查集+贪心】
A supermarket has a set Prod of products on sale. It earns a profit px for each product x∈Prod sold by a deadline dx that is measured as an integral number of time units starting from the moment the s...原创 2018-09-24 21:08:45 · 211 阅读 · 0 评论 -
BZOJ 4195 程序自动分析【并查集+离散化】
Description 在实现程序自动分析的过程中,常常需要判定一些约束条件是否能被同时满足。考虑一个约束满足问题的简化版本:假设x1,x2,x3,…代表程序中出现的变量,给定n个形如xi=xj或xi≠xj的变量相等/不等的约束条件,请判定是否可以分别为每一个变量赋予恰当的值,使得上述所有约束条件同时被满足。例如,一个问题中的约束条件为:x1=x2,x2=x3,x3=x4,x1≠x4,这些...原创 2018-09-24 19:58:50 · 183 阅读 · 0 评论 -
CHOJ 5202 自然数拆分Lunatic版 【完全背包模型】
描述给定一个自然数N,要求把N拆分成若干个正整数相加的形式,参与加法运算的数可以重复。求拆分的方案数 mod 2147483648的结果。1≤N≤4000。输入格式一个整数n。输出格式输出一个数,即所有方案数因为这个数可能非常大,所以你只要输出这个数 mod 2147483648 的余数即可。样例输入7样例输出14样例解释输入7,则7拆分的结果是...原创 2018-09-24 16:14:29 · 564 阅读 · 0 评论 -
POJ 2248 Addition Chains【迭代加深搜索】
DescriptionAn addition chain for n is an integer sequence with the following four properties: a0 = 1 am = n a0 < a1 < a2 < ... < am-1 < am For each k (1<=k<=m) there exi...原创 2018-09-13 22:05:31 · 273 阅读 · 0 评论 -
BZOJ 2252 矩阵距离【BFS】
描述给定一个N行M列的01矩阵 A,A[i][j] 与 A[k][l] 之间的曼哈顿距离定义为:dist(A[i][j],A[k][l])=|i-k|+|j-l|输出一个N行M列的整数矩阵B,其中:B[i][j]=min(1≤x≤N,1≤y≤M,A[x][y]=1){dist(A[i][j],A[x][y])}即求与每个位置曼哈顿距离最近的1N,M≤1000。输入格式第一...原创 2018-09-13 22:00:57 · 588 阅读 · 0 评论 -
TYVJ 1340 送礼物【双向搜索+二分查找】
描述作为惩罚,GY被遣送去帮助某神牛给女生送礼物(GY:貌似是个好差事)但是在GY看到礼物之后,他就不这么认为了。某神牛有N个礼物,且异常沉重,但是GY的力气也异常的大(-_-b),他一次可以搬动重量和在w(w<=2^31-1)以下的任意多个物品。GY希望一次搬掉尽量重的一些物品,请你告诉他在他的力气范围内一次性能搬动的最大重量是多少。输入格式第一行两个整数,分别代表W和N。以...原创 2018-09-13 20:49:08 · 547 阅读 · 0 评论 -
POJ 1182 食物链【扩展域 | 边带权并查集】
动物王国中有三类动物A,B,C,这三类动物的食物链构成了有趣的环形。A吃B, B吃C,C吃A。 现有N个动物,以1-N编号。每个动物都是A,B,C中的一种,但是我们并不知道它到底是哪一种。有人用两种说法对这N个动物所构成的食物链关系进行描述: 第一种说法是"1 X Y",表示X和Y是同类。 第二种说法是"2 X Y",表示X吃Y。 此人对N个动物,用上述两种说法,一句接一句地说出K句话,...原创 2018-09-25 18:01:23 · 176 阅读 · 0 评论 -
POJ 2311 Cutting Game【博弈论---SG函数】
题目链接:http://poj.org/problem?id=2311DescriptionUrej loves to play various types of dull games. He usually asks other people to play with him. He says that playing those games can show his extraordi...原创 2018-09-14 21:29:47 · 198 阅读 · 0 评论 -
CHOJ 4302 Interval GCD【区间最大公约数+线段树+树状数组】
描述给定一个长度为N的数列A,以及M条指令 (N≤5*10^5, M<=10^5),每条指令可能是以下两种之一:“C l r d”,表示把 A[l],A[l+1],…,A[r] 都加上 d。“Q l r”,表示询问 A[l],A[l+1],…,A[r] 的最大公约数(GCD)。输入格式第一行两个整数N,M,第二行N个整数Ai,接下来M行每条指令的格式如题目描述所示。输出格...原创 2018-10-03 12:48:53 · 629 阅读 · 0 评论 -
POJ 3696 The Luckiest Number【欧拉函数+快速幂+快速乘】
Chinese people think of '8' as the lucky digit. Bob also likes digit '8'. Moreover, Bob has his own lucky number L. Now he wants to construct his luckiest number which is the minimum among all positiv...原创 2018-10-14 17:26:27 · 250 阅读 · 0 评论 -
树与图的深度优先遍历,树的DFS序、深度和重心
深度优先遍历:时间复杂度为 O(n+m)void dfs(int x){ v[x] = 1;// 记录点 x 已被访问过 for(int i = head[x]; i; i = next[i]) { int y = ver[i]; if(v[y]) continue;// 点 y 已经被访问过了 dfs(y); }}...原创 2018-09-06 22:33:09 · 1735 阅读 · 1 评论 -
HDU 1556【区间更新+单点查询 树状数组】
N个气球排成一排,从左到右依次编号为1,2,3....N.每次给定2个整数a b(a <= b),lele便为骑上他的“小飞鸽"牌电动车从气球a开始到气球b依次给每个气球涂一次颜色。但是N次以后lele已经忘记了第I个气球已经涂过几次颜色了,你能帮他算出每个气球被涂过几次颜色吗?Input每个测试实例第一行为一个整数N,(N <= 100000).接下来的N行,每行包括2个整数...原创 2018-09-27 21:11:17 · 194 阅读 · 0 评论 -
POJ 3468 【区间修改+区间查询 树状数组 | 线段树 | 分块】
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 the ...原创 2018-09-27 21:01:12 · 195 阅读 · 0 评论 -
CHOJ 4201 楼兰图腾【树状数组】
描述在完成了分配任务之后,西部314来到了楼兰古城的西部。相传很久以前这片土地上(比楼兰古城还早)生活着两个部落,一个部落崇拜尖刀(‘V’),一个部落崇拜铁锹(‘∧’),他们分别用V和∧的形状来代表各自部落的图腾。西部314在楼兰古城的下面发现了一幅巨大的壁画,壁画上被标记出了N个点,经测量发现这N个点的水平位置和竖直位置是两两不同的。西部314认为这幅壁画所包含的信息与这N个点的相对位置有...原创 2018-09-27 17:49:56 · 234 阅读 · 0 评论 -
CHOJ 4301【线段树+区间最大子段和】
描述给定长度为N的数列A,以及M条指令 (N≤500000, M≤100000),每条指令可能是以下两种之一:“2 x y”,把 A[x] 改成 y。“1 x y”,查询区间 [x,y] 中的最大连续子段和,即 max(x≤l≤r≤y) { ∑(i=l~r) A[i] }。对于每个询问,输出一个整数表示答案。输入格式第一行两个整数N,M第二行N个整数Ai接下来M行每行3...原创 2018-10-04 20:05:57 · 427 阅读 · 0 评论 -
HDU 2689 Sort it【树状数组求逆序对】
Problem DescriptionYou want to processe a sequence of n distinct integers by swapping two adjacent sequence elements until the sequence is sorted in ascending order. Then how many times it need.For...原创 2018-09-26 22:55:20 · 188 阅读 · 0 评论 -
ST算法
给定一个长度为N的序列A,ST算法能在 O(NlogN)时间的预处理后,以O(1)的时间复杂度在线回答“数列A中下标在 l ~ r 之间的数的最大值是多少”这样的区间最值问题。 一个序列的子区间个数显然有 O(N^2)个,根据倍增思想,我们首先在这个规模为O(N^2)的状态空间里选择一些 2 的整数次幂的位置作为代表值。 设 F[i , j] 表示...原创 2018-09-26 21:04:40 · 461 阅读 · 1 评论 -
TYVJ 1096 数字组合【0-1背包模型】
题目描述在N个数中找出其和为M的若干个数。先读入正整数N(1<N<100)和M(1<M<10000), 再读入N个正数(可以有相同的数字,每个数字均在1000以内), 在这N个数中找出若干个数, 使它们的和是M, 把满足条件的数字组合都找出来以统计组合的个数,输出组合的个数(不考虑组合是否相同)。要求你的程序运行时间不超过1秒。输入格式第一行是两个数字,表示N和...原创 2018-09-23 22:25:46 · 563 阅读 · 0 评论 -
CHOJ 2101可达性统计
描述给定一张N个点M条边的有向无环图,分别统计从每个点出发能够到达的点的数量。N,M≤30000。输入格式第一行两个整数N,M,接下来M行每行两个整数x,y,表示从x到y的一条有向边。输出格式共N行,表示每个点能够到达的点的数量。样例输入10 103 82 32 55 95 92 33 94 82 104 9样例输出16332...原创 2018-09-07 15:56:40 · 1866 阅读 · 1 评论 -
POJ 1845 Sumdiv【数论+递归+分治+快速幂】
Consider two natural numbers A and B. Let S be the sum of all natural divisors of A^B. Determine S modulo 9901 (the rest of the division of S by 9901).InputThe only line contains the two natural n...原创 2018-08-20 21:36:46 · 213 阅读 · 0 评论 -
POJ 2018 Best Cow Fences【二分答案+最大子段和+前缀和】
Farmer John's farm consists of a long row of N (1 <= N <= 100,000)fields. Each field contains a certain number of cows, 1 <= ncows <= 2000. FJ wants to build a fence around a contiguous g...原创 2018-08-20 21:03:08 · 2354 阅读 · 0 评论 -
兔子与兔子【字符串Hash】
描述很久很久以前,森林里住着一群兔子。有一天,兔子们想要研究自己的 DNA 序列。我们首先选取一个好长好长的 DNA 序列(小兔子是外星生物,DNA 序列可能包含 26 个小写英文字母),然后我们每次选择两个区间,询问如果用两个区间里的 DNA 序列分别生产出来两只兔子,这两个兔子是否一模一样。注意两个兔子一模一样只可能是他们的 DNA 序列一模一样。输入格式第一行一个 DNA 字符串...原创 2018-08-30 20:25:42 · 835 阅读 · 0 评论 -
POJ 3349 【Hash】
题目链接:http://poj.org/problem?id=3349You may have heard that no two snowflakes are alike. Your task is to write a program to determine whether this is really true. Your program will read information a...原创 2018-08-30 17:59:52 · 165 阅读 · 0 评论 -
邻值查找【链表or set】
题目描述:给定一个长度为 n(n<=10^5)的序列 A,A 中的数各不相同。对于 A 中的每一个数 Ai,求: 以及令上式取到最小值的 j(记为 Pi)。若最小值点不唯一,则选择使 Aj 较小的那个。分析:我们维护一个有序集合,则集合中与 Ai 最接近的值要么是 Ai 的前驱,要么是 Ai 的后继。比较前驱、后继与Ai的差即可。#include <cstdio>#i...原创 2018-08-30 17:04:17 · 955 阅读 · 0 评论 -
TYVJ 1305最大子序和【单调队列】
单调队列:即一个具有单调性的队列,可以递增也可以递减。它的思想是在队列中及时排除一定不是最优解的选择,题目描述:给定一个长度为N的整数序列(可能有负数),从中找出一段长度不超过M的连续子序列,使得子序列中所有数的和最大。N,M<=3*10^5。分析:我们先求出前缀和,则连续子序列 [L,R] 中数的和就等于 S[R] - S[L-1]。所以原问题就转换为:找出两个位置 x,y,使得...原创 2018-08-22 19:58:41 · 442 阅读 · 0 评论 -
递归
1、递归实现排列型枚举:从 1~n 这n(n < 20)个整数中随机选取任意多个,输出所有可能的选择方案。递归求解:这等价于每个整数可以选或者不选,所有可能的总数共有 2^n种。在每次递归中分别尝试某个数选或不选两条分支,将尚未确定的整数数量-1,从而转化为一个规模更小的同类问题。代码:#include <iostream>#include <cstdi...原创 2018-08-19 23:09:14 · 220 阅读 · 0 评论 -
HDU 4699 Editor【对顶栈】
题目描述:维护一个整数序列的编辑器,有以下五种操作:I x: 光标前插入x这个数,插入以后光标移动到 x 之后D: 删除光标前的数L: 光标左移一位 若已到最左边移不动,就不移R: 光标右移一位 若移不动,就不移了Q k: 输出在位置 k 之前的最大前缀和。分析:建立两个栈,栈 A 存储当前光标位置之前的序列,栈B存储当前位置到序列结尾的序列。用一个数组 f 维护栈 A ...原创 2018-08-26 14:48:05 · 216 阅读 · 0 评论 -
Codeforces 670C【排序+离散化】
题目链接:http://codeforces.com/problemset/problem/670/CMoscow is hosting a major international conference, which is attended by nscientists from different countries. Each of the scientists knows exactly...原创 2018-08-21 20:57:45 · 757 阅读 · 0 评论 -
质因数分解
算术基本定理:任何一个大于 1 的整数都能唯一分解为有限个质数的乘积。试除法:结合质数质数判定的“试除法”和质数筛选的“Eratosthenes筛法”,我们可以枚举 2~sqrt(n) 中的每个数 d ,若 d 能整除 N,则从 N 中除掉所有的因子 d ,同时累计除去因子 d 的个数。因为一个合数的因子一定在扫描到这个合数之前就从 N 中被除掉了,所以在上述过程中能整除 N 的一定是质数...原创 2018-09-04 16:46:46 · 2346 阅读 · 0 评论 -
阶乘分解【分解质因数】
描述给定整数 N(1≤N≤10^6),试把阶乘 N! 分解质因数,按照算术基本定理的形式输出分解结果中的 p_i 和 c_i 即可。输入格式一个整数N。输出格式N! 分解质因数后的结果,共若干行,每行一对pi, ci,表示含有pi^ci项。按照pi从小到大的顺序输出。样例输入5样例输出2 33 15 1样例解释5! = 120 = 2^3 * 3...原创 2018-09-04 20:07:17 · 5117 阅读 · 2 评论 -
树与图的广度优先遍历、拓扑排序
树与图的广度优先遍历:用一个队列来实现。起初,队列中仅包含一个起点,在遍历过程中,我们不断从队头取出一个节点 x ,对于 x 面对的多条分支,把沿着每条分支到达的下一个节点(如果未访问过)插入队尾,重复上述过程直至队列为空。void bfs(){ memset(d, 0, sizeof d); queue<int> q; q.push(1), d[1] =...原创 2018-09-07 11:00:59 · 1329 阅读 · 0 评论 -
POJ 3090【欧拉函数】
A lattice point (x, y) in the first quadrant (x and y are integers greater than or equal to 0), other than the origin, is visible from the origin if the line from (0, 0) to (x, y) does not pass throug...原创 2018-09-06 16:15:47 · 183 阅读 · 0 评论 -
质数的筛选
问题描述:给定一个整数 N,求出 1~N 之间的所有质数,称为质数的筛选问题。Eratothenes筛法:任意整数 x 的倍数 2x,3x,...都不是质数。我们从 2 开始,由小到大扫描每个数 x,把它的倍数2x,3x,...[ N / x]*x 标记为合数。当扫描到一个数时,若它尚未标记,则它不能被 2 ~ x-1 之间的任何数整除,该数就是质数。实际上,小于 x^2 的 x 的倍数在...原创 2018-09-03 16:17:42 · 956 阅读 · 0 评论 -
CHOJ Hankson的趣味题【最大公约数的应用】
描述Hanks博士是BT(Bio-Tech,生物技术)领域的知名专家,他的儿子名叫Hankson。现在,刚刚放学回家的Hankson正在思考一个有趣的问题。今天在课堂上,老师讲解了如何求两个正整数c1和c2的最大公约数和最小公倍数。现在Hankson认为自己已经熟练地掌握了这些知识,他开始思考一个“求公约数”和“求公倍数”之类问题的“逆问题”,这个问题是这样的:已知正整数a0,a1,b0,b...原创 2018-09-05 21:43:56 · 371 阅读 · 0 评论 -
CHOJ 2201 小猫爬山【DFS】
背景Freda和rainbow饲养了N只小猫,这天,小猫们要去爬山。经历了千辛万苦,小猫们终于爬上了山顶,但是疲倦的它们再也不想徒步走下山了(呜咕>_<)。描述Freda和rainbow只好花钱让它们坐索道下山。索道上的缆车最大承重量为W,而N只小猫的重量分别是C1、C2……CN。当然,每辆缆车上的小猫的重量之和不能超过W。每租用一辆缆车,Freda和rainbow就要付1...原创 2018-09-08 23:09:05 · 492 阅读 · 0 评论 -
BZOJ 1257余数之和
Description给出正整数n和k,计算j(n, k)=k mod 1 + k mod 2 + k mod 3 + … + k mod n的值其中k mod i表示k除以i的余数。例如j(5, 3)=3 mod 1 + 3 mod 2 + 3 mod 3 + 3 mod 4 + 3 mod 5=0+1+0+3+3=7Input输入仅一行,包含两个整数n, k。1<...原创 2018-09-05 16:19:18 · 235 阅读 · 0 评论 -
字符串的最小表示法
定义:给定一个字符串 S[1~n] ,如果我们不断把他的最后一个字符放到开头,最终会得到 n 个字符串,称这 n 个字符串是循环同构的。 这些字符串中字典序最小的一个,称为字符串 S 的最小表示。例如 S = "abca",那么它的 4 个循环同构字符串为 "abca","aabc”,"caab","bcaa",S 的最小表示为 "aabc"。因为一个与 S 循环同构的字符串可以用该字符串在 .原创 2018-09-02 16:19:31 · 1145 阅读 · 0 评论 -
约数【试除法+倍数法】
定义:若整数 n 除以整数 d 的余数为 0,即 d 能整除 n ,则称 d 是 n 的约数,n 是 d 的倍数,记为 d | n。 求 N 的正约数集合------试除法 若 d >= sqrt(n) 是 n 的约数,则 n/d <= sqrt(n)也是 n 的约数。总之,约数是成对出现的(除了完全平方数,sqrt(n) 会单独出现)。因此,只需要扫描 d...原创 2018-09-04 20:44:19 · 839 阅读 · 0 评论