![](https://img-blog.csdnimg.cn/20201014180756913.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
hdu
文章平均质量分 71
johsnows
正在静下心来学算法的acmer
展开
-
hdu 5927 Auxiliary Set (dfs)
题意;一棵大小为n的有根树,根为1,有q次查询,每次查询给定一个set,set里的点为不重要点,不在set里的点为重要点,问树上有多少个点满足一下两个条件1.是重要的点.2.是两个重要的点的最近公共祖先解题思路:这题的结题方法比较巧.考虑一个不是重要的点能满足条件,需要它有两个子树存在重要的点,如果我们从不是重要的点里深度最深的点开始考虑,如果这个点有两个子树,那么就一原创 2017-02-16 20:03:19 · 383 阅读 · 0 评论 -
Math Magic hdu 4427 (dp)
题意:一个长度为k的数量sum为n,lcm为m,问这样的数列能构造出多少个,结果对1e9+7取模。解题思路:计数问题,一般就是dp了。首先想到的是,一个数列的lcm已知,那么数列 里所有的数应该都要是lcm的因子,不可能出现其它数,这一点想到,dp状态其实也不难想了。dp[i][j][k]表示长度为i的数列和为jlcm为k的方案数。转移就是dp[i+1][j原创 2017-07-22 10:21:57 · 278 阅读 · 0 评论 -
hdu 6050 Funny Function (矩阵快速幂)
二维的一个矩阵。如果只有一维,用一下矩阵快速幂求前缀和是很简单的。比如我构造出一个矩阵从[f(1,1),f(1,2), sum(1,2)]推到[f(1,2), f(1,3), sum(1,3)],这是不难的。由于我们是要求f(m,1),就是要求sum(m-1,n)所以还要构造矩阵从f(m-1, 1)推到f(m, 1)也就是sum(m-2,n)到sum(m-1, n)。但是第一维构造原创 2017-08-07 23:44:32 · 337 阅读 · 0 评论 -
hdu 4417 Super Mario(主席树||cdq分治+树状数组)
主席树和cdq分治都可以,而且都是很入门的做法。这道题主席树的写法要好写一些,但是如果带修改的话,就得用cdq分治了。主席树代码:#include using namespace std;const int maxn=1e5+5;struct node{ int l, r, x;}val[maxn*40];int tot, root[maxn], a[ma原创 2017-08-09 17:43:35 · 431 阅读 · 0 评论 -
hdu 6034 Balala Power!(贪心)
题意:n串字母,总长度不超过1e6,让你给出a-z到0-25的映射,使26进制的字符串对应的数字之和最大。解题思路:每个字母所在位置对应权值加和,肯定存不下。但我们只需要26个字母对应值之间的关系即可,开一个数组a[i][j]分别记录字母i在j这个位置上出现了多少次,对于大于26的值进位,这样我们就得到了26个字母对应的值对应的系数,按照字典序比较的方式去排序即可。但是原创 2017-07-25 19:16:55 · 1408 阅读 · 0 评论 -
hdu 6035 Colorful Tree(dfs)
题意:一棵有n个点的树,树上每个点都有颜色c[i],保证每两个点之间的路径只有一天,定义每条路径的值为这条路径上经过的不同颜色数量和。求所有路径的值。解题思路:可以把问题转化为对每种颜色有多少条不同的路径至少经过这种颜色的点,然后加和。求有多少条路径经过可以转换为总路径数-没有经过的路径数,只要求出没有经过的路径数就好了。对于每种颜色没有经过自己的路径条数我们可原创 2017-07-26 09:51:17 · 962 阅读 · 0 评论 -
hdu 1024 Max Sum Plus Plus(dp)
题意:求m段连续子序列和。解题思路:首先想到二维的dp状态dp[i][j]表示前i个数j段得到的最大值。转移有两种情况,首先是不增加新的组,加在前面一组上,转移就是dp[i][j]=max(dp[i][j], dp[i-1][j]+a[i]);第二种是增加新的一组,这里需要注意,不增加新的一组的时候由于是连续的一定和i-1相连,而增加新的一组就不需要了,中间可以很多原创 2017-07-27 08:11:12 · 224 阅读 · 0 评论 -
hdu 6097 Mindis(几何)
因为PO = QO, 所以直接将PQ平移到平行于x轴的位置,这样比较好建立椭圆方程。为什么会联系到椭圆呢,因为椭圆上任意一点到两焦点的距离等于定值,所以建立以PQ为焦点的椭圆,再求椭圆与圆相交时,最小的a,就求出答案了。这里只知道c,需要二分一下b,b的范围就是r-h,h是圆心到PQ中点的距离。http://www.cnblogs.com/chen9510/p/7341215.html原创 2017-08-11 19:49:28 · 442 阅读 · 0 评论 -
hdu 6096 String(AC自动机)
转换还是比较巧妙的。因为要求前缀后缀都包含的个数,所以可以把字符串a转换成a#a这样一个字符串,比如abca就转换成abca#abca然后对于一组前缀a后缀b转换成b#a,比如ab ca,就是ca#ab,然后对前缀后缀的串建立AC自动机,让主串去匹配,如上述例子,ca#ab满足为abca#abca的一个子串,也就是abca满足这个前缀后缀,所以问题,就转换成了典型的ac自动机匹配问题。原创 2017-08-12 00:07:17 · 897 阅读 · 0 评论 -
hdu 6053 TrickGCD(筛法+容斥)
题意:给出a数组,问有能构成多少个长度与a相等的b数组,每个对应位置b比a小,并且gcd(b[1],b[n])>1.a[i]解题思路:看着大神的代码补的:http://www.cnblogs.com/jhz033/p/7246028.html看范围就知道要去枚举gcd,对于每个gcd,在a[i]这个位置上有gcd/a[i]个数能满足条件构成b[i],只要把每个位原创 2017-07-27 21:00:32 · 1249 阅读 · 0 评论 -
hdu 6133 Army Formations(线段树合并)
其实题目要求的就是一颗子树上把所有的权值从小到大排序,每个值对应第k大,把k和值乘在一起加和,就是这个子树对应的根的答案。说到底就是有多少个数大于一个值,这个值就要多加几次。然后我就死在这个理解上,因为要考虑值相同的情况,这句话没错,但是容易忽略值相同的情况。对于每个点我们建一颗权值线段树,表示以这个点为根的子树上的权值分部情况。然后右子树上有多少值大于左子树上的值,以及左子树上有原创 2017-08-20 17:26:35 · 507 阅读 · 0 评论 -
hdu 5238 Calculator(线段树+中国剩余定理)
非常巧的一个题。运算过多,肯定得用数据结构维护一些东西,这里要维护的是映射关系,运算的本质其实就是函数,也就是映射。但是答案对29393取模,对0-29393的数维护映射在空间上和时间上都是撑不住的。如果仔细观察这个数可以发现,这个数本身不是素数,但是可以分解为4个素数的乘积7*13*17*19。如果你学过中国剩余定理,就应该知道已知一个数x对m1,m2,m原创 2017-07-29 08:20:00 · 381 阅读 · 0 评论 -
hdu 5450 Traversal(状压dp)
题意比较迷,第一句话的意思是那k个数不存在不用管,出题人的英语.....但是这个题还是比较难的。每个点只能到差值1, p, p+2的点,要求每次走数量大于等于3的环,不能重复走完所有点。走完所有点形成环其实相当于,每个点出度入度两次,要超过3个点意味着不能两两成环,更不能自环。由于最多只能到达p+2之外的点,所以每个点一定要在p+2的距离只能形成一个环。可以维护原创 2017-08-23 21:24:21 · 444 阅读 · 0 评论 -
hdu 6183 Color it(cdq分治+线段树)
题意:两种操作1:在x,y这个点上涂上颜色c。2:查询1,y1和x,y2组成的矩形包含多少种颜色。代码:矩形区域查询点,赛时直接把之前cdq分治+bit的代码贴上然后开了50个树状数组去做,时间复杂度是n*logn*logn*50,直接十几e的复杂度,tle,而且因为树状数组的logn和50是不随数据变的,所以跑起来还没有暴力快,然后暴力代码ac了。。。50原创 2017-09-01 11:31:27 · 824 阅读 · 0 评论 -
hdu 1166 敌兵布阵(cdq分治)
第一次写cdq分治。感觉这个题就是按时间递归分治,然后通过每次计算左区间内(时间早)操作对右区间(时间晚)中的查询结果的影响。代码:#include using namespace std;const int maxn=5e5+5;struct node{ int inde; int val; int type; ope原创 2017-06-26 11:21:37 · 365 阅读 · 0 评论 -
hdu 1074 Doing Homework (状压dp)
题意:小明有n个作业,没个作业有ddl,有完成需要的时间t,一个作业如果超过ddl一个时间,就扣去一分,问最后做完所有作业扣去的分数最少是多少,并输出做作业的顺序。解题思路:基础dp题,以为应该很easy,xjb贪了3发,发现不对。其实很容易想到作业,只不过觉得有点麻烦。但是想到去写状压了,也就简单了。用一个1dp[i][j],i表示第几天,j就是上面的二进制数原创 2017-07-11 17:34:09 · 292 阅读 · 0 评论 -
hdu 5925 counts (二维离散化+dfs)
题意:在一个R*C的地图上,有n个障碍点,问最终有多少个联通块,R,C的范围是1到1e9结题思路:第一次将一个二维地图离散化.考虑x这一维的离散化,我们将障碍物之间那块长度压缩成一个点,用vetor记录下来,每个障碍物也记录下来,y这一维相同,这样我们就得到了一个最大是400*400的点,那么我们就用普通的dfs求联通块的办法去做就行了.代码:#incl原创 2017-02-16 20:13:03 · 415 阅读 · 0 评论 -
hdu6012(bestcoder 91) Lotus and Horticulture(离散化+前缀和)
题意:这几天Lotus对培养盆栽很感兴趣,于是她想搭建一个温室来满足她的研究欲望。Lotus将所有的nn株盆栽都放在新建的温室里,所以所有盆栽都处于完全相同的环境中。每一株盆栽都有一个最佳生长温度区间[l,r][l,r],在这个范围的温度下生长会生长得最好,但是不一定会提供最佳的研究价值(Lotus认为研究发育不良的盆栽也是很有研究价值的)。Lotus进行了若干次试验,发现若第ii原创 2017-01-23 19:50:34 · 448 阅读 · 0 评论 -
hdu 5945 Fxx and game(单调队列,dp)
题意:一开始你将会得到一个数\:XX,每次游戏将给定两个参数\:k,tk,t, 任意时刻你可以对你的数执行下面两个步骤之一:1.\:X = X - i(1 1.X=X−i(1=i=t)。2.\:2.若\:X\:X为\:k\:k的倍数,X = X / kX=X/k。现在Fxx想要你告诉他最少的运行步骤,使\:X\:X变成\:11。思路:从x变成1其实等同于从1变成原创 2017-01-15 10:33:22 · 368 阅读 · 0 评论 -
hdu 3400 Line belt(三分套三分)
题意:在一个二维空间中给出两条线段AB,CD,线段AB,CD上的运动速度分别为p,q。在这两条线段之外的空间上运动的速度为r。求从A到D的最短时间。思路:我们可以列出式子time=ab/p+cd/q+bc/r;ab表示在线段AB上运动的距离,cd在线段CD上运动距离,bc表示从线段AB到CD运动的距离。可以看出来,这个式子是一个凹形函数而time2=cd/q+bc/r也是一个凹原创 2016-12-06 10:06:11 · 369 阅读 · 0 评论 -
hdu 3359 Kind of a Blur(高斯消元求浮点型解)
题意:模糊处理的图是将图中每个点的值改为距离本身曼哈顿距离d以内的点的平均值,先给你一个高为h,宽为w的模糊处理后的图让你还原为原图。思路:简单的高斯消元,只要对图中h*w个点找出曼哈顿距离d以内的点再列个方程,求高斯消元就行。没注意看题习惯性的把第一个输入的w当做行数了,跪了快十几发,改了就A,QAQ。代码:#include #include #i原创 2016-11-17 11:05:16 · 460 阅读 · 0 评论 -
hdu 5929 CCPC东北四省赛H - Basic Data Structure
题意:定义一个可以反转栈顶的栈,有push,pop操作,每次push只push 0,1这两种元素,除此之外还有reverse操作,即把栈顶反转为栈尾, 栈尾反转为栈顶,另外有一个query操作,查询的是从栈顶到栈尾的元素进行一种nand运算所得到的值,nand运算其实就是&&运算的非,具体规则如下:∙ 0 nand 0 = 1 ∙ 0 nand 1 = 1 ∙ 1 na原创 2017-02-15 19:43:45 · 571 阅读 · 0 评论 -
hdu 5316 Magician (线段树)
题意:给一个长度为n的序列,m个操作,操作有两种,1种是将a位置的数改为b,第2种是查询a到b位置的区间完美子段和,完美子段和要求相邻的两个数的位置的奇偶性不同。n,m范围都是【1,100000】, b的范围是【1000000000 ,1000000000】解题思路:线段树简单题查询次数过多肯定不能去暴力,需要用到线段树去维护。虽然是简单题但是弱渣还是做了蛮久。这个题的难点就是原创 2017-03-13 16:18:41 · 297 阅读 · 0 评论 -
hdu 5221 Occupation (树剖+线段树)
题意:一棵树每个点都有权值,有三种操作1 从x节点走到y节点,并将路径中的点的权值都取出来2 将x节点的权值减去3 将以x为根节点的子树的所有节点的值取出来。每次操作后查询一次现在取出来的值为多少。解题思路:入门树剖+线段树题吧第一次写树剖,写错了一个地方wa了好几发。 while(ty!=tx) { if(dee原创 2017-05-11 16:43:43 · 408 阅读 · 0 评论 -
hdu 1698 Just a Hook(线段树)
三个区间覆盖操作的线段树题,蛮简单的,貌似我多写了一个query,不过写了就算了吧代码:#include #define lson o<<1#define rson o<<1|1using namespace std;const int maxn=1e5+5;int n;struct p{ int sum; int lazy;}a[maxn<<4]原创 2017-04-21 19:49:00 · 348 阅读 · 0 评论 -
hdu 4542 未知剩余系(反素数)
题意:求x内约数为k的最小的数,以及求x内约数是x-k的最小的数。解题思路:第一种数用dfs去搜索就行了,第二种的话,先打个表跑出来即可。代码:#include #define LL long long using namespace std;const unsigned long long inf=~0ULL;const long long INF =原创 2017-06-05 16:05:08 · 316 阅读 · 0 评论 -
hdu 2222 Keywords Search(AC自动机)
AC自动机模板题。next数组开成char蜜汁mle。。hdu的tle和mle已经让我不敢相信了。代码:#include #define totNode 500005#define maxn 1000006using namespace std;struct acho{ struct st{ int next[26];原创 2017-06-06 21:35:42 · 267 阅读 · 0 评论 -
hdu 2196 Computer(树dp)
题意:给出n个点, n-条边,每条边有权值,问从每个点出发能得到的最大值,不返回。解题思路:第一道树dp。树dp的话只不过是转移的关系是在当前节点和几个孩子节点上,也就是从孩子节点转移到当前节点,但由于是一棵树,当前节点的父节点其实也是自己的一个前驱,也可以从父亲节点转移到当前节点,树dp比较麻烦的就是这一步了。这道题,一个节点出发的最大值的路径无非就是过父亲节原创 2017-06-20 11:23:57 · 434 阅读 · 0 评论 -
hdu 3065 病毒侵袭持续中(AC自动机)
AC自动机第三题了,交上去1A真的爽,(题目没说多组坑了一发不能算,哼!)其它oj不知道,hdu貌似对内存的统计是按使用过的内存来的,而不是按你申请的内存,然后静态字典树的话,只要动态使用数组就不会(其实就是不要一开始就整个初始化了)mle了。然后当next[now][i]==-1的时候,直接让其等于next[fail[now]][i]这个优化真的不要太好,不仅时间上优化了原创 2017-06-20 12:43:14 · 252 阅读 · 0 评论 -
hdu 6348 序列计数(dp+bit)
像2015ccpc的一道题..赛时直接贴代码上去,果断mle到死,因为数据范围加到了1e4,所以没法开出这么大的二维数组。一个优化思路就是,当长度大于序列的最长上升子序列时,上升序列的数量一定是0,所以dp[i][j],定义长度为前i个数里面长度为j的上升序列个数,j这一维只需要开到最长上升子序列的个数,用vector动态开就行,超过最长上升子序列长度的直接输出0,。然后这题序列是随机的,根据结论...原创 2018-08-11 11:36:49 · 230 阅读 · 0 评论