自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(56)
  • 资源 (1)
  • 收藏
  • 关注

原创 求质因子

int sum=0;int tmp = n;for(int i=2;i*i<=tmp;i++){ if(tmp%i==0) { a[sum++]=i; while(tmp%i==0) tmp=tmp/i; }}if(tmp>1) a[sum++]=tmp;

2016-07-31 00:27:36 613

原创 spoj 405 求不同子串的个数 后缀数组和高度数组的应用

传送门:spoj 405 求不同子串的个数题目大意求一个字符串不同子串的个数。解题思路后缀数组和高度数组的应用! 因为每个子串都是每个后缀的前缀,那么原问题等价于求所有后缀之间不相同的前缀的个数如果后缀按照sa[1],sa[2]….sa[n]这样的顺序来计算的,那么不难发现每次增加的子串的个数为n-sa[i]+1,但是其中是有height[i]个和前面字符串的前缀相同的,所以对应于每个sa[i]对

2016-07-30 21:44:04 709

原创 poj 1743 Musical Theme 较为简单的后缀数组+高度数组的应用

传送门:poj 1743 Musical Theme题目大意题意:有N(1 <= N <=20000)个音符的序列来表示一首乐曲,每个音符都是1..88范围内的整数,现在要找一个重复的主题。“主题”是整个音符序列的一个子串,它需要满足如下条件: 1. 长度至少为5个音符。 2. 在乐曲中重复出现。(可能经过转调,“转调”的意思是主题序列中每个音符都被加上或减去了同一个整数值) 3. 重复

2016-07-30 18:54:08 1551 1

原创 hdu 1874畅通过程续 所有最短路算法集合

传送门:hdu 1874畅通过程续 这篇文章并不是为了这个题目而做过多的描述,是为了说几种最常用的最短路的算法单源最短路单源最短路就是以一个特定的点为起始点,求这个点到所有点的最短路。如果终点固定的话就叫做两点之间最短路问题。Dijkstra这个算法在数据结构书里面被划分到贪心张姐里面,但是在《运筹学》这类书里面被划分到了动态规划里面! 当然这个算法是有一个前提条件的,就是没法变得权值必须是正值

2016-07-28 18:32:49 662

原创 ACdream 1216 Beautiful People 最长上升子序列变形

传送门:ACdream 1216 Beautiful People题目大意有n个人,分别对应着有拥有钱数ai和能力数bi,求ai和bi全部严格递增的子序列的数量,并且要求打印路径解题思路先将这个数组按照ai从小到大排序,如果ai相等的时候就按照bi的从大到小排序。这样一来就转换为求bi的最长上升子序列。 比如说下面这个例子: 1 10 2 12 2 11 2 10 3

2016-07-27 17:27:21 452

原创 csu 1555 Inversion Sequence 线段树反求逆序数

传送门:Inversion Sequence题目大意告诉逆序数,求出原逆序数解题思路我们可以先看样例怎么推倒出来的: 1 2 0 1 0 1. 在1前面有1个比这个数大的,所以1只能在第二个位置 2. 在2前面有两个比他大的数,其中1又排在了第二个位置,所以2只能排在第四个位置 3. 在3前面有0个比3大的,所以3只能排在第一个位置 4. 在4前面有一个比4大的,所以4只能在最后一个位置

2016-07-27 00:53:39 361

原创 hdu 5687 Problem C 字典树

传送门:hdu 5687 Problem C 中文题目就不做过多的解释解题思路定义一个结构体,里面有26个字母,就像下面这样:struct Node{ int next[26]; int sum; void init() { sum = 0; memset(next,-1,sizeof next); }};然后定义一个这个类

2016-07-26 22:36:39 695

原创 hdu 5441 Travel 离线操作+并查集

#include<cstdio>#include<cstring>#include<algorithm>using namespace std;const int MAXN = 5005;const int INF = 0x3f3f3f3f;int pre[MAXN<<2];int M,N;struct Node{ int a,b,val;}e[MAXN<<5];bool

2016-07-26 01:57:31 335

原创 hdu 3367 Pseudoforest 最大生成树

传送门:Pseudoforest题目大意就是求最大生成树,但是前提是要组成一个环解题思路按照边的最大到小排序一下,当变为一个环的时候就是要求的最大生成树,当然肯定不是当变为一个环就退出,当变为两个环的时候就不加这个边了,直到结束!AC代码#include<cstdio>#include<cstring>#include<algorithm>using namespace std;const

2016-07-26 01:51:34 327

原创 poj 1318 Word Amalgamation map的使用

传送门:Word Amalgamation 这个题目只要会熟练使用STL中的map就好了AC代码#include<cstdio>#include<map>#include<algorithm>#include<iostream>using namespace std;map<string,string>m;int main(){ string dic,str,tmp; i

2016-07-26 01:42:49 377

原创 POJ 1611 The Suspects (并查集)不相交集合+合并优化

传送门:POJ 1611 The Suspects (并查集)题目大意有很多组学生,在同一个组的学生经常会接触,也会有新的同学的加入。但是SARS是很容易传染的,只要在改组有一位同学感染SARS,那么该组的所有同学都被认为得了SARS。现在的任务是计算出有多少位学生感染SARS了。假定编号为0的同学是得了SARS的。解题思路向这种题目明显是并查集的一种变形叫不相交并查集。 父节点里面保存的是元素的

2016-07-26 01:40:07 363

原创 Codeforces292D Connected Components 经典好题并查集

传送门:Codeforces292D Connected Components题目大意一个无向图,给出m条边,有k次询问,每次询问将第l到r条边暂时删去,求这时候有多少个连通分量。解题思路最朴素的思想,每次查询[a,b]的时候的时候,把从1到a-1和从b+1到最后做并查集,然后看有几个连通分量。但是很不幸的是这种做法的复杂度太高了,是o(m*n). 我们可以换一个想法用PL[i]这个数组存储前i个

2016-07-26 01:28:51 597

原创 hdu 2122 Ice_cream’s world III 最小生成树kruskal+并查集

传送门:hdu 2122题目大意判断输入的几个节点能不能组成最小生成树,如果能输出最小生成树的值,如果不能疏忽impossible解题思路刚开始用的prim一直WA一直WA就改为kruskal了,就kruskal果断过了! kruskal和prim不同的是,prim主要是针对节点的,也就是把节点加入集合里面,kruskal是把边也就是权值从小到大的加入到集合里面,如果这两个边不在同一个连通分量里面

2016-07-24 00:50:07 362

原创 poj 1258 Agri-Net 基本&经典最小生成树

传送门:poj 1258 Agri-Net题目大意n个农场,已知这n个农场都互相相通,有一定的距离,现在每个农场需要装光纤,问怎么安装光纤能将所有农场都连通起来,并且要使光纤距离最小,输入的是邻接矩阵,输出安装光纤的总距离解题思路裸prim, 1. 随便找一个元素进行寻找 2. 找出和这个元素相邻的所有权值,如果不能到达表示无限大 3. 找到和这个元素相邻的最小权值,记录下来 4. 最小权值

2016-07-23 20:56:06 305

原创 hdu 1272 小希的迷宫 并查集

传送门:小希的迷宫 中文题目不做过多的解释解题思路输出yes的条件就是: 1. 只能是一个树 2. 树中不能有环 当然还有一个特判就是只输入0,0的时候也输出yes,当然这个题目的数据弱,考虑重复添加遍的情况,比如输入3,5和5,3应该是满足条件的,不判断也是可以过的#include<cstdio>#include<cstring>const int MAXN = 100005;int

2016-07-23 14:52:15 356

原创 hdu 1231 畅通工程 并查集初步

传送门:hdu 1231 畅通公路 中文题目就不做过多的解释了解题思路这个题目主要考察的并查集简单合并和查找,没有压缩路径。 但是在这里说一下路径压缩的两种方法(递归和非递归) 递归:int find(int x){ return pre[x] = (x!=pre[x])?find(pre[x]):pre[x];}非递归的就相对来说有点麻烦了int find(int x){

2016-07-23 12:10:43 284

原创 hdu 1305 Immediate Decodability 简单字典树

传送门:hdu 1305 Immediate Decodability题目大意查询一个单词是不是另一个单词的前缀。解题思路简单地字典树题目!!AC代码#include<cstdio>#include<cstring>#include<algorithm>#include<cmath>#include<iostream>using namespace std;#define lson l,

2016-07-21 23:06:06 522

原创 Find MaxXorSum 经典字典树求异或最大值

传送门:Find MaxXorSum题目大意给出n个数,求在这n个数中取两个数使得他们异或最大解题思路非常经典利用字典树求异或的最大值。 读懂这个题目之后,对于初学者我们可能会思考下面的问题: 1. 两层循环o(n^2)肯定能求出了,但是肯定会超时 2. 这道题怎么做呢? 3. 思考一阵(在不知道用什么算法的情况下),会不会用把每个数转换为二进制,然后按位进行比对 4. 就算转换为二进制

2016-07-21 19:26:43 4504 1

原创 poj 3667 Hotel 经典线段树区间合并

传送门:poj 3667 Hotel题目大意题意: 1 a:询问是不是有连续长度为 a 的空房间,有的话住进最左边 2 a b:将[a,a+b-1]的房间清空解题思路当我们读懂这个题目的时候,我们一般会考虑下面几个问题 1. 怎么解决空房间不连续的问题 2. 怎么快速找到查询时候的下标 3. 父节点保存的什么,也就是pushUp应该怎么写? 下面我们来一步步的解决上面的疑问? 第三个

2016-07-21 03:54:22 282

原创 hdu 1251 统计难题 字典树

传送门:hdu1251统计难题 中文题目不做过多的解释解题思路已经接近于字典树的模板题目,每次把字典中的单词加入到树里面。 先是要创建这棵树, 1. 线定义结构体,先看我们定义的结构体typedef struct Trie{ int v; Trie *next[26];}Trie;创建字典树函数,字典树的创建如下图:, 这个图对应的过程就是, 首先是一个根节点,他是所有

2016-07-20 23:40:29 377

原创 codeforces 676C C. Vasya and String 尺取法

传送门:codeforces 676C C. Vasya and String(二分)题目大意问最多改变k个字母才能使相同字母组成的子串最长;解题思路因为题目中给定的只有a或者b字符,最长的方式无非就两种把a变为b,或者把b变为a。 //就那把b变为a举例子 我们想从左向右一直记录b的的个数,当b的个数大于能改变数的时候就记录下这个值,一这个点为终点,起始点为开始找到b,然后终点继续向右走这个过

2016-07-20 11:44:46 408

原创 codeforces 616D Longest k-Good Segment 尺取法

传送门:Longest k-Good Segment题目大意输入n和k 然后第二行输入n个整数值 最后输出含有k个不同整数最长连续的子序列的两个下标解题思路尺取法 如果每次不同整数的数量大于k的话就减去前面的那一个AC代码#include<cstdio>#include<cstring>#include<algorithm>#include<cmath>using namespace

2016-07-20 00:17:36 387

原创 CF#321-B - Kefa and Company 二分+前缀和

传送门:题目大意Kefa 有n个朋友,她请客,为了让所有的朋友不感到彼此之间的贫穷,她请客的朋友的钱数最小值和最大值之间不能超过d。 输入的时候输入n和d 下面的n行代表n个朋友,第一个数代表这个朋友的钱数,第二个整数代表Kefa 和他的友情值,最后输出在最大值和最小值不超过d的情况下获得友谊的最大值。解题思路我们先来对朋友所拥有的钱数按照升序排列,sum[i]表示前i个朋友的友谊值总和。 然

2016-07-20 00:05:46 458

原创 poj 3104 Drying 二分+基本数学

传送门:poj 3104 Drying题目大意有一些衣服,每件衣服有一定水量,有一个烘干机,每次可以烘一件衣服,每分钟可以烘掉k滴水。每件衣服没分钟可以自动蒸发掉一滴水,用烘干机烘衣服时不蒸发。问最少需要多少时间能烘干所有的衣服。解题思路要知道如果想要晾干衣服的话,最好的方法就是使用机器冲干x1秒,然后等待风干x2秒。我们来二分答案mid,表示能在mid秒钟晒干。 机器烘干需要x1秒钟,自然烘干需

2016-07-19 23:52:30 1321

原创 51nod 1058 N的阶乘的长度 数学

传送门:1058 N的阶乘的长度解题思路因为是要求位数,也就是相当于求:10^x = n!。根据数学知识取log10就可以了AC代码#include<stdio.h>#include<math.h>const int MAXN = 100005;int main(){ int n; while(~scanf("%d",&n)) { double tmp;

2016-07-18 23:58:01 517

原创 51nod 1106 质数检测

传送门:1106 质数检测解题思路根据质数的定义,在判断一个数n是否是质数时,我们只要用1至n-1去除n,看看能否整除即可。但我们有更好的办法。先找一个数m,使m的平方大于n,再用<=m的质数去除n(n即为被除数),如果都不能整除,则n必然是质数。如我们要判断1993是不是质数,50*50>1993,那么我们只要用1993除以<50的质数看是否能整除,若不能即为质数.AC代码#include<std

2016-07-18 22:44:04 535

原创 51nod 1183 编辑距离 DP

传送门:51nod 1183 编辑距离 在题目中给定了一个定义,编辑距离,想要把a串变为b串对于a中的每个字符可以有三种操作:在a串中增加一个字符,删除一个字符,还有改变一个字符。 这就对应的一个阶段的三种状态 我们来设定阶段dp[i][j]表示a串中的前i个长度和b串中前j个长度中种编辑距离的最小值。 - 当i==0&&j==0的时候,也就是dp[0][0]是0 - 当i==0的时候也就

2016-07-18 21:48:45 369

原创 hdu 2577 How to Type 经典DP

传送门:hdu 2577 How to Type题目大意给你一些字符串a~z||A~Z,然后我们按键最少能把他们都打出来,如果开始Cap大写灯是亮的,我们需要打a的话,可以按下cap键,然后再按a,需要两步,但是这下状态变为了大写灯亮,当然我们也可以按下shift,再按下a,需要两步,但是这下状态就变成了大写灯灭。题目要求的是,把这些字母打出来需要的最小按键数目。有一点需要注意,按键完成之后需要使c

2016-07-18 13:04:03 355

原创 hdu 1176 免费馅饼 二维动态规划

传送门:hdu 1176 免费馅饼 中文题目就不解释了解题思路这个题目是水DP题目,但是还有有一个难点就是找阶段,是选择位置是阶段还是时间是阶段好! 我们这两种阶段都讨论一下: 1. 位置是阶段也就是dp[i][j]表示i位置在j秒的掉饼数量,但是每一个阶段的状态又是和上一个阶段的状态有联系的。也就是这个阶段的状态中用到上一个状态的时间。所以假设这种阶段是不成立的 2. 时间是阶段,也就是d

2016-07-17 23:56:42 329

原创 hdu 5327 Olympiad 前缀和

传送门:hdu 5327 Olympiad题目大意给定一个整数如果这个整数的每一位都不相同的话,就说这个数叫美丽的数, 给定一个区间,求这个区间美丽数的数量解题前缀和试水题目,先打表,然后输出AC代码#include<cstdio>#include<algorithm>#include<cstring>using namespace std;const int MAXN = 200008;

2016-07-17 18:48:15 456

原创 cf#336-B-Hamming Distance Sum 前缀和

传送门:cf#336-B-Hamming Distance Sum题目大意给定两个字符串a,b,求b串中长度为a的子串中的Hamming Distance之和解题思路根据数据范围所以肯定不能有两层循环。 我们可以先求出b串从第一个到某一位中字符1的个数,one[i]就表示b前i个位置中字符1的个数。 然后我们在挨个遍历a字符串,如果a[i]能够访问的b重最长的下标为lenB-lenA+i,所以如

2016-07-17 14:53:39 441

原创 hdu 1069 Monkey and Banana DP

传送门:hdu 1069 Monkey and Banana题目大意一堆科学家研究猩猩的智商,给他M种长方体,每种N个。然后,将一个香蕉挂在屋顶,让猩猩通过 叠长方体来够到香蕉。现在给你M种长方体,计算,最高能堆多高。要求位于上面的长方体的长要小于(注意不是小于于等于)下面长方体的长,上面长方体的宽小于下面长方体的宽。解题思路每一种长宽高不同的箱子来说,最多有六种摆放方式, 把这六种摆放的样式全部

2016-07-17 00:58:08 348

原创 hdu 1789 Doing Homework again 贪心

传送门:hdu 1789 Doing Homework again 题目大意一个人从WF回来要写作业,但是每次只能做一个,每个作业都有对应的截止时间,如果过了截止时间就会扣相应的分数,求扣的最小分数 输入:第一行输入多组则是用例t 下面的一行输入有几门作业n, 再下面一行对应的这n门作业的截止时间, 再下面一行对应的是n门作业的过了截止时间扣的分数 输出扣的最小分数解题思路先对截止时间排序

2016-07-16 21:07:19 388

原创 hdu 2844 coins DP多重背包

传送门:hdu 2844 coins题目大意给定商品种类n和背包容量m以及对应的价值/容量和数量,求组合成不大于背包容量m有多少种可能。解题思路这是一个多重背包的题目,价值等于重量。我们根据每种硬币的价值和数量进行判断是转换为完全背包还是01背包。当一种硬币的(数量*价值)大于背包的总容量的时候,也就是相当于在不大于容量m的情况下该种物品满足完全背包的定义所以对于这一种物品来说使用完全背包的思想来求

2016-07-16 16:25:38 384

原创 hdu 1231 最大连续子序列 DP

传送门:hdu 1231 最大连续子序列解题思路首先我们先要确定一下状态方程, 我们必须先要找到哪个子序列的和最大,所以dp[i]里面保存的是前i-1个中子序列中和最大的。 所以状态方程就能写出:dp[i] = max(a[i],dp[i-1]+a[i])其中a[i]表示的是输入的第i个数,如果a[i]<0的话,肯定是dp[i] = a[i]的所以这样就能保存了前i-1个中子序列的和的最大。通过

2016-07-16 00:47:45 1516 2

原创 poj 3061 Subsequence 取尺法

传送门:poj 3061 Subsequence题目大意给定长度为n的数列整数a0,a1,a2…an-1以及整数S。求出总和不小于S的连续子序列的长度的最小值,如果解不存在输出0解题思路先介绍一下取尺法。 取尺法通常是指对数组保存一对下标(起点和重点),然后根据实际情况交替推进两个端点直到得到答案的方法。对应于这道题目来讲,由于每个元素都大于零,如果子序列[s,t)满足as+as+1+…+at-1

2016-07-15 01:51:34 849

原创 poj 1276 Cash Machine 多重背包

传送门:poj 1276 Cash Machine题目大意有各种不同面值的货币,每种面值的货币有不同的数量,请找出利用这些货币可以凑成的最接近且小于等于给定的数字cash的金额。 输入的前两个数表示背包容量,第二个数字表示有N种货币 接下来的N组两个数。第一个数表示货币数量,第二个数表示货币的价值 输出最接近并且小于等于背包容量的价值。解题思路在理解的01背包的基础上, 完全背包,指每个物品有

2016-07-13 13:07:56 313

原创 01背包详解

动态规划和贪心的区别先来看一个普通的题目:现在有一个容量为50的背包,超市中有几种商品,每种商品只有一件价值分别为vi,体积为wi,求在不超过背包容量的情况下取得的最大价值。 如果按照贪心的思想,就是去vi/wi最大的数,但是不是那样,我们先看下面的图就能理解: 基本思路这是个典型的01背包问题,每种物品有一件,可以选择放或者不放。 dp( i,j ) = Max( dp( i-1, j ),

2016-07-13 02:22:10 728

原创 poj 1077 Eight 八数码问题( 康拓展开+BFS状态压缩)

传送门:poj 1077 Eight题目大意输入的八数码 将一个八数码最后转换为 1 2 3 4 5 6 7 8 x 的格式,然后打印出路径康拓展开如果按照平常的思路,把x的位置看做0,一共有8!个状态,来判断某一个状态是否被访问过。 但是问题来了?怎么把一个带有x的数组转变为转变为数字呢?第一个联想到的就是STL中的map,但是map的速度太慢了,会超时,这个时候我们就要用一种快速的

2016-07-12 15:11:45 1685 2

原创 csu Kick the ball! 概率+DFS

传送门:csu Kick the ball!题目大意足球点球,两个队伍轮流踢,看最后的比分。如果某一个队伍已经不可能取胜了,就提前终止比赛,比如说比赛进行到了第九局第一只队伍踢完之后变为了4-2的比分那么就没有踢下去的必要了,就提前终止比赛,如果第九局之后是3-2的比分的话,那么第二组的球员还是有必要踢下去的,因为比赛是允许平局的。解题思路DFS一直搜下去如果到达的预测比分的状态并且比赛结束就可以了

2016-07-11 23:06:47 455

HTML5温蒂数据库

HTML5温蒂数据库

2016-11-27

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除