HDOJ
如题
Yuhan の Blog
这个作者很懒,什么都没留下…
展开
-
HDU 1850 Being a Good Boy in Spring Festival(Nim游戏)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1850思路:1.Nim游戏的N-position(即先手必胜态)为nnn堆石子的异或和不为0;2.反之必败态为nnn堆石子的异或和为0,那么就需要给对手创造必败态;3.遍历每一堆扑克牌,假设当前堆扑克牌数量为aaa,算出其它n−1n-1n−1堆扑克牌数量的异或和为bbb,我们需要做的即让...原创 2020-03-10 17:17:30 · 90 阅读 · 0 评论 -
HDU 2037 今年暑假不AC
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2037思路:贪心思想,将节目结束时间从小到大排序,依次选取可以观看的节目;代码:#include<bits/stdc++.h>using namespace std;struct Pro { int s, e; bool operator < ( Pro ...原创 2020-03-01 19:15:58 · 103 阅读 · 0 评论 -
HDU 3948 The Number of Palindromes(后缀数组+RMQ)
题目链接:3948 The Number of Palindromes思路:我们使用后缀数组+RMQ可以实现查找回文的功能,这题的重点的去重过程;为了方便去重,我们不按字符串的下标来遍历,而按以及排好的rk[]的顺序去遍历;维护一个变量cnt记录上次的回文串长度和此次高度数组两者的最小值,如果此次RMQ查询结果大于cnt,说明有新的回文串,否则就是重复的。代码:#includ...原创 2019-12-27 19:43:26 · 105 阅读 · 0 评论 -
HDU 2196 Computer(树形DP)
题目链接:2196 Computer思路:1.对于每一个结点iii,我们需要计算三个值:dp[i][0]:dp[i][0]:dp[i][0]:以iii为根的子树里,iii往下能达到的最大长度;dp[i][1]:dp[i][1]:dp[i][1]:以iii为根的子树里,iii往下能达到的次大长度;dp[i][2]:dp[i][2]:dp[i][2]:结点iii往上走,能达到的最长长...原创 2019-12-26 17:10:49 · 70 阅读 · 0 评论 -
HDU 1520 Anniversary party(树形DP)
题目链接:1520 Anniversary party思路:1.题意:父亲和儿子不能一起出现,问能一起出现的所有结点值的最大值;2.设dp[i][0]dp[i][0]dp[i][0]和dp[i][1]dp[i][1]dp[i][1]分别是以iii为根的子树、iii结点出现和不出现时的结点值最大值,设sonsonson为结点iii的儿子,则有dp[i][0]+=max{dp[son]...原创 2019-12-26 16:56:48 · 102 阅读 · 0 评论 -
HDU 1205 吃糖果(鸽巢原理)
思路:1.记最多的糖果为ans,剩下糖果总数为sum;2.如果想将ans个糖果隔开,我们至少需要ans-1个其它糖果,因此sum如果小于ans-1则不行;3.如果sum大于等于ans-1,将ans个糖果隔开的区间认为是一个空间,我们可以在放满这ans-1个空间的基础上,其余每个糖果最多放在一个空间,自然不会重复,因此这种情况一定可以;代码:#include<iostream&g...原创 2019-12-14 21:09:59 · 151 阅读 · 0 评论 -
HDU 6030 Happy Necklace(矩阵快速幂)
思路:1.我们用r表示红色,用b表示蓝色,对于一串长为s的珠子,它的末尾情况一共会有三种:(1)***b(2)***br(3)***brr(其中第三种包括了b在离末尾更远的地方),我们设这三个情况的种数分别为a,b,c;2.此时这串珠子在情况(1)只能继续加红色珠子,得到长度为s+1的情况(2)的珠子;原珠子在情况(2)也只能继续加红色珠子,得到长度为s+1的情况(3)的珠子;原珠子在情况三...原创 2019-12-03 12:24:24 · 130 阅读 · 0 评论 -
HDU 3506 Monkey Party(区间dp)
思路:1.这题是经典区间dp问题“石子合并”的一个变型;2.“石子合并”是没有围成环的情况,设dp[i][j]为将从i到j的石子合成一堆的最小花费(本题即是i到j所有猴子认识的花费的时间),则有递推dp[i][j]=min(dp[i][j],d[i][k]+dp[k+1][j]+sum(i,j))其中sum(i,j)是i到j所有石子的总数目,k从i遍历到j-1;3.这种算法的时间复杂度为O...原创 2019-12-01 21:19:52 · 216 阅读 · 0 评论 -
HDU 2588 GCD(欧拉函数)
思路:1.题意是给出nnn和mmm,让我们找出有多少个x(1<=x<=n)x(1<=x<=n)x(1<=x<=n)满足gcd(n,x)>=mgcd(n,x)>=mgcd(n,x)>=m;2.设nnn和xxx的最大公约数是ddd,则我们可以将nnn和xxx表示成{n=p∗dx=q∗d\begin{cases}n=p*d\\x=q*d...原创 2019-11-30 20:33:04 · 122 阅读 · 0 评论 -
HDU 3015 Disharmony Trees(树状数组)
思路:1.我们首先hashhashhash一下,计算出每棵树它的xxx和hhh的排名,用pair<int,int>类型的数组存储每颗树,然后按hhh的排名降序排列;2.我们用降序排列好的数组,来一个个进行遍历;遍历之前我们应该先建好两个BITBITBIT,两个树状数组的计算函数(cal(i,1)和cal(i,0),其中i代表位置,1代表第一个树状数组,0代表第二个树状数组)的意思...原创 2019-11-30 17:01:22 · 234 阅读 · 0 评论 -
HDU 1754 I Hate It(线段树解决RMQ问题)
思路:这是线段树的裸题,可以解决区间最大/最小值查询、点修改问题;如果涉及区间修改,那就需要采用lazy方法了~代码:#include<iostream>#include<algorithm>using namespace std;const int MAX_N=2e5+5; int n,m,N;int dat[MAX_N<<2];voi...原创 2019-11-29 18:35:18 · 104 阅读 · 0 评论 -
HDU 2795 Billboard(线段树查询区间最大值)
思路:1.采用线段树存储区间最大值;2.左子树和右子树均满足条件时优先选择左子树;3.区间长度取min(h,n)即可,直接取h数组开不到那么大;4.注意边界情况,即区间长度为1,此时线段树只有第0个值,在查询到的下标>h-1时不可直接返回,应该判断该点是不是真的大于(等于)我们要查询的值;代码:#include<iostream>#include<algo...原创 2019-11-27 18:57:57 · 223 阅读 · 0 评论 -
HDU 1698 Just a Hook(线段树的区间修改)
思路:这题考察线段树的区间修改,如果不做优化会使复杂度非常糟糕,优化的办法就是用lazy-tag方法。当修改的区间覆盖当前遍历到的区间时,只对当前结点做出修改,不继续深入,并给它做标记,在代码中体现在rcd[]数组中。当需要继续深入时,采用push_down方法去更新它的子节点;代码:#include<iostream>using namespace std;templa...原创 2019-11-27 16:06:39 · 125 阅读 · 0 评论 -
HDU 1394 Minimum Inversion Number(树状数组)
思路:1.有一道求逆序数的问题,用树状数组可以解决;2.将最前面的数(a[i])移到最后面时,掌握inversion number之间递推关系就可以了:ans=ans+n−1−2∗a[i]ans=ans+n-1-2*a[i]ans=ans+n−1−2∗a[i]代码:#include<iostream>#include<algorithm>using nam...原创 2019-11-26 14:54:05 · 96 阅读 · 0 评论 -
HDU 1257 最少拦截系统(LIS)
思路:1.该题题意是求不严格递减的子序列(即序列中相邻元素可以相等)个数最少有多少个;2.有一个结论:该序列中最长递增子序列(LIS)的长度即为不严格递减子序列最少的个数;严格证明(有一部分不会证orz):(1)首先证明LIS中任意两个元素都来自不同的递减序列:如果存在a和b,在原序列中,a的位置在b之前,如果它们在LIS中,则满足a<b,如果在同一递减序列中则满足a>=b...原创 2019-11-23 17:24:39 · 129 阅读 · 0 评论 -
HDU 2602 Bone Collector(0/1背包)
思路:1.设dp[i][j]为前i个物品中,可以装进体积为j的背包里,所有物品的最大值;2.设val[i]为第i个物品的价值,vol[i]为第i个物品的体积,则我们可以得到dp[i][j]={dp[i−1][j]j<vol[i]max(dp[i−1][j],dp[i−1][j−vol[i]]+val[i])j>=vol[i]dp[i][j]=\begin{cases}dp[...原创 2019-11-23 14:48:19 · 142 阅读 · 0 评论 -
HDU 2069 Coin Change
思路:1.设dp[i][j]表示用i个硬币可以组成j元的种数;2.我们需要避免出现类似5+1和1+5这种同一情况的重复计算,因此我们分先后次序依次递推所有面值的硬币(即将对面值的遍历放到循环最外圈);3.设coin[k]是当前遍历到的面值,我们可以得到递推关系dp[i][j]=dp[i][j]+dp[i-1][j-coin[k]];代码:#include<iostream>...原创 2019-11-23 13:42:46 · 92 阅读 · 0 评论 -
HDU 5976 Detachment
这道题目是向这位博主学习的,链接贴出来:☆HDU 5976 Detachment 详细题解(贪心+逆元+前缀和,积),讲的很细致,很感谢;思路:1.题意是将数x分成若干个正整数和,使得这些整数的乘积最大,并求出这个最大乘积除以1e9+7的余数;2.要使得乘积最大,那么我们需要尽可能的分出更多的数(1除外),又因为分出的数需要各不相同,由贪心思想,我们可以从最小的2开始往后分...原创 2019-11-22 18:49:03 · 175 阅读 · 0 评论 -
HDU 3117 Fibonacci Numbers(矩阵快速幂求斐波那契)
思路:对于小于1e8的斐波那契数,直接打表输出即可;对于大于1e8的数,我们需要分别计算它的前四位和后四位;计算前四位:1.斐波那契数的通项公式为:f(n)=15[(1+52)n−(1−52)n]f(n)=\frac{1}{\sqrt{5}}[(\frac{1+\sqrt{5}}{2})^n-(\frac{1-\sqrt{5}}{2})^n]f(n)=51[(21+5)n−(2...原创 2019-11-19 16:36:08 · 160 阅读 · 0 评论 -
HDU 1003 Max Sum
思路:1.用一个变量max_s记录最大的字串和,初始为-1001;2.我们需要发现一个规律,和最大的子串的前n(0<n≤len)一定是正数,否则砍去这个前n项我们能得到一个和更大的子串,除非这个子串只由一个负数组成;3.使用一个变量ans记录当前子串的和,如果ans>max_s则更新max_s和最大串的左右端点;如果ans<0则抛弃当前子串,即更新ans为0;代码:...原创 2019-11-18 14:04:36 · 127 阅读 · 0 评论 -
HDU 1002 A + B Problem II
思路:1.用字符串来存储大数;2.判断两个数的正负性;3.按位相加存储在数组中,然后判断和的正负性;4.根据和的正负分别对每位进行处理;5.记得处理和为0的情况;代码:#include<iostream>#include<vector>#include<string>#include<cstring>#include<...原创 2019-11-17 15:34:29 · 148 阅读 · 0 评论