![](https://img-blog.csdnimg.cn/20201014180756927.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
HDUOJ
小胡同的诗
千里之行,始于足下
展开
-
HDU1007 Quoit Design(分治)
题目链接:hdu1007题目大意给定一个整数 n ,下面跟着 n 对二维坐标 (x, y),其中x、y均为实数,表示平面内的 n 个点。问平面内这 n 个点之间的最短距离是多少?输出这个答案的一半。解题思路枚举时间复杂度 O(n2)O(n^2)O(n2),具体做法略。分治对于分治的做法我们大致可以分为三个步骤:预处理,分离区间,合并区间。首先我们把平面的点一分为二,然后计算各自的最小距离,回溯后取其中最小后并枚举两个区间一个点在左另一个点在右的情况,计算距离看是否能够更新最小值。以下是对原创 2020-09-11 10:37:39 · 298 阅读 · 0 评论 -
HDU1226超级密码(BFS+数位+同余剪枝)
题目链接:超级密码题目大意:给n,c,m以及m个数字(可能是包括16进制内的任意数),问组合成的数组能整除n的最小是多少,c位每个数字的进制。解题思路:求最小,即数位最短以及字典序最小,先把m个数排个序,然后bfs,注意m+k与m%n+k对于n来说一定是同余的,即:(m+k)%n == (m%n+k)%n。所以当前面搜到余数位s的时候就标记一下。同时,每次搜一种可能的状态都要先把数字做模处理,...原创 2019-01-31 08:17:48 · 122 阅读 · 0 评论 -
HDU1541、POJ2352<Start>(树状数组入门题)
题目链接:POJ2352,HDU1541题目大意:给n个星星的坐标,输入保证纵坐标y按非递减序输入,并且不会两个星星位置重复。如果某个星星左下角(包含边界)共包含k个星星,则成该星星的等级为k。分别输出0~n-1等级的星星数量解题思路:虽说这是道树状数组的入门题,但仍没反应过来。个人理解是:c数组维护的是<=idx的前缀和,每次将横坐标为x加入的时候可以先查询一下目前小于等于x的个数,这...原创 2019-02-16 12:17:32 · 164 阅读 · 0 评论 -
HDU4546比赛难度(优先堆+思维 好题)
题目链接:hdu4546题目大意:给n长度的数字序列,从中取出k个元素(0<k<=n)求和,找出k个元素之和为第m小的和值。解题思路:第一次做这样组合的题,第一直觉会想用爆搜穷举出所有组合,然后扔进multiset中维护这些值,搜索的复杂度是指数级,内存也超限。发现找到第m个小的可以直接用优先队列来模拟,因为m<10000,所以可以模拟到第m大就结束(其实用multiset也...原创 2019-02-08 23:18:34 · 468 阅读 · 0 评论 -
HDU2572终曲(枚举+STL)
题目链接:hdu2572解题思路:水题…但是WA了好几发,一直想在原串中剪切,然后得到符合的串。不过要考虑的case很多。数据规模小,完全可以暴力枚举所有字串,然后匹配。AC代码:#include <cstdio>#include <cstring>#include <cstdlib>#include <cmath>#include ...原创 2019-02-07 17:29:04 · 187 阅读 · 0 评论 -
HDU3336Count the string(dp+kmp_next表性质)
题目链接:hdu3336题目大意:给一串n长度的字符串str,问str所有前缀(包括本串)在str中的匹配次数。解题思路:利用kmp爆搜得到一发TLE,参考kmp+dp 以及dp状态方程解释博客思路学会利用next数组的性质进行dp优化:next[i]表示不包含下标为i的字符(i下标之前的串)的最长前后缀相等长度,那么我们设dp[i]表示以第i个字符为结尾 (或者说长度为i)的前缀能够匹配到的...原创 2019-02-06 23:59:36 · 258 阅读 · 0 评论 -
HDU2609How many(最小表示法+set去重)
题目链接:hdu2609题目大意:给n段01串,问这些串中共有几组同构串。同构串定义:两个字符串存在 分别从x,y下标开始直到x-1,y-1(循环表示)字符都相等的表示,则这两个串同构。解题思路:用暴力O(n^2)搜索的话显然会超时,这里引进O(n)的 字符串最小表示法,并且将串利用set去重。最小/大表示法:同kmp的next数组类似,都是利用减少重复状态搜索的思路进行优化。最小表示法...原创 2019-10-11 08:40:44 · 237 阅读 · 0 评论 -
HDU1305Immediate Decodability(字典树)
题目链接:hdu1305题目大意:给一大堆01串,并以9表示一组01串输入结束,问这些串之间是否至少有一个串是另一个串的前缀。解题思路:毫无疑问,可以用Trie来维护这些串,每次插入时判断是否含有当前串str的前缀串或者自己是别的串的前缀串,代码种的查询时query2。查询的复杂度O(n)。字典树介绍字典树又称单词查找树,Trie树,是一种树形结构,是一种哈希树的变种。典型应用是用于统计,...原创 2019-02-05 21:37:38 · 208 阅读 · 0 评论 -
HDU2647Reward(拓扑排序+反向建图思维)
题目链接:HDU2647题目大意:给一张n节点m条边的图,(n<=10000,m<=20000)。并且要求每次输入的u,v节点 v的价值大于u的价值。最终输出总价值的最小值。解题思路:利用拓扑排序输出的序列价值要递增比较容易建图,这张m边有向图边的方向满足 (v,u):u的价值大于v的价值 这样一个偏序关系。关键点在于 反向建图 。AC代码:#include <cstd...原创 2019-02-05 14:38:02 · 181 阅读 · 0 评论 -
HDU3333Turing Tree(思维+树状数组+离线+Map)
题目链接:hdu3333题目大意:给一段n长度的数字序列,以及q长度的区间询问,问区间不同数字大小之和。解题思路:跟区间数种类这题类似只不过种类数改成不同种类数字之和。树状数组改成维护不同种类数字之和。注意数字之和会爆int,C数组设置成long longAC代码:#include <cstdio>#include <cstring>#include <...原创 2019-02-19 18:03:23 · 410 阅读 · 0 评论 -
HDU1166敌兵布阵(线段树入门,单点更新区间查询)
前言线段树是用来维护一段区间某种操作的树形数据结构,由于设计到区间,成员节点中l,r表示区间[l,r]。对于线段树的构造实际上是利用了二分的思想,从而使操作降到log级。数据结构struct Node { int l,r; int sum;};Node LTree[maxn &lt;&lt; 2];表示每个节点维护[l,r]区间的operator(这里的操作是区间和),由于二分每...原创 2019-02-20 22:43:22 · 154 阅读 · 0 评论 -
HDU1754I Hate It(线段树维护区间最大值)
题目链接:hdu1754题目大意:给n个数以及q组操作,操作可能是查询或者更新。问区间最大值或更新。解题思路:线段树裸题。看代码AC代码(可能是写不好2800ms卡时限过得找个快点得板子)#include <cstdio>#include <cstring>#include <cstdlib>#include <cmath>#inc...原创 2019-02-20 23:43:02 · 175 阅读 · 0 评论 -
匈牙利算法(二分图最大匹配)
前言这个算法网上讲解有很多,就不在细说,主要是给每个点找一条增广路,核心思路是在发现对面被配对后让之前的配对点腾个位置,腾位置成功的话此时找到一条增广路。要注意的地方是建边的方向和谁配对谁要联系起来,也就是说男生A到女生B连一条有向边后你就要用男生去找女生配对实现HDU2063#include <bits/stdc++.h>using namespace std;#def...原创 2019-09-03 12:28:41 · 316 阅读 · 0 评论 -
HDU2860(dijkstra+堆优化)
解题报告:同朴素的O(n2)O(n^2)O(n2)写法一样,也能够记录路径,要在松弛的阶段用一个数组保存前缀节点。关于堆优化写法的注意事项:更新的时候注意那个三角不等式的意思是:我当前的最短路为dist[u],它加上新节点的w能够比源点到它的原本距离,这个w不要写成u弹出的那个节点的w!Code:#include <bits/stdc++.h>using namespac...原创 2019-05-07 23:10:18 · 167 阅读 · 0 评论 -
HDU1874(最短路+dijkstra+堆优化)
解题报告:同O(n2)O(n^2)O(n2)算法类似,不过用邻接表存图在松弛的时候优化了遍历不相邻点的复杂度,在查询当前最短径的时候直接用小根堆弹出,复杂度从O(n)O(n)O(n)降到O(logE)O(logE)O(logE)。Code:#include <stdio.h>#include <iostream>#include <queue>#inc...原创 2019-05-07 22:51:11 · 200 阅读 · 0 评论 -
HDU2680(最短路+反向建图+spfa)
解题报告:关于spfa的实现关键点:用vector实现邻接表存图vis数组表示某个点是否在队列中(因为一个点可能多次入队)cnt表示某个点入队的次数(如果存在负环的时候可以直接判断)dist数组同dijkstra一样表示该点与源点当前的距离,inf表示不通spfa可以证明每个点平均入度的次数不超过两次,但判断负环的条件一定是cnt[v] > n,而不能单纯判断是否大于2,平均情况...原创 2019-05-07 22:46:17 · 210 阅读 · 0 评论 -
HDU1874(最短路+spfa模板题)
解题报告:虽然没有负环,不过用spfa效率也不错。Code:#include <stdio.h>#include <iostream>#include <queue>#include <algorithm>#include <string.h>using namespace std;const int maxn = (in...原创 2019-05-07 22:38:00 · 157 阅读 · 0 评论 -
HDU1269(强连通分量+Tarjan)
题目链接题目大意:求给出的有向图是否为一个强联通图解题思路:Tarjan的入门题,对于Tarjan的理解关键是low数组与dfn数组的理解,前一个是当前搜索树的第一次扫描的tot值,也就是最早的时间戳,我们整个算法就是为了更新它!而dfn是每个点被搜的时间节点,显然,每个点的dfn都不同并且dfn[i] >= low[i]。由于Tarjan是基于深度优先搜索的算法,所以被搜的点的先后次序...原创 2019-05-08 15:52:32 · 409 阅读 · 2 评论 -
HDU1215七夕节(约数和定理)
题目链接:思路:这题数据规模不大,用下这个定理1ACode:#include <math.h>#include <stdio.h>const int mod = 1e9+7;int qpow (int a, int b) { int ans = 1; while (b) { if (b & 1) { ans = ans * a % mo...原创 2019-04-25 11:27:47 · 151 阅读 · 0 评论 -
HDU1716排列2(DFS排列+去重)
题目链接:排列2解题思路:排序一下,每次从0到3把没有枚举的加进来,关于去重,在里面可以加一个这样的判断,如果在该位置后有一个跟它一样的字符并且该字符被放到我们的结果数组里了,我们当前这个字符就不应该再被考虑,否则就相当于这两个位置调换了一下,重复。这种题还是直接用next_permutation快点。#include <cstdio>#include <cstring&g...原创 2019-03-16 17:36:41 · 268 阅读 · 0 评论 -
HDU3342Legal or No(拓扑排序判环)
题目链接:HDU3342题目大意:给一个n个点m条边的有向关系图,问这图中是否存在环,即判断是否是DAG 。解题思路:拓扑排序判环模板题AC代码:#include <cstdio>#include <cstring>#include <cstdlib>#include <cmath>#include <iostream>...原创 2019-02-04 23:55:44 · 440 阅读 · 0 评论 -
HDU1285确定比赛次序(拓扑排序+堆)
解题思路:裸拓扑排序 ,由于要输出字典序最小的ans,所以用堆作容器,复杂度由原来的O(V+E)变为O((V+E)*logV),题中输入的数据都符合DAG 的要求,所以不必判环。解题细节拓扑排序写法:初始化:将入度为0的节点V入队将入度为0的节点加入排序结果集中删除与入度为0的节点相连的边删除,相连的边入度-1将跟新边后入度为0的节点入队AC代码:#include &lt;c...原创 2019-02-04 18:27:30 · 165 阅读 · 0 评论 -
hdu1015基础dfs
直接上15ms代码,还没想好记忆化怎么弄 应该还能更快一点AC代码如下:#include#include#include#includeusing namespace std;char s[2000],sr[2000];int res,book[20],n,flag;int cmp(char a,char b){ return a>b;}void dfs(in原创 2018-01-15 15:24:31 · 244 阅读 · 0 评论 -
hdu通畅工程(并查集入门)
思路:题目给你城市之间的道路信息,即哪些城市畅通,1如果和2畅通,2又和3畅通,则1和3是畅通的,并查集思想,找场上有几条畅通的干路呗(就是擒贼先擒王的几个王嘛)AC代码如下:#include#include#includeusing namespace std;#include#includeint city[2000];void init(int n){ int i;原创 2017-12-29 16:14:49 · 165 阅读 · 0 评论 -
hdu1213How Many Tables(并查集入门)
题目大意:a认识b,b认识c,他们三个相互认识,为一组,依次给你一张数据表关于所有人的关系表解题思路:找相同类的结构,并查集的解题思路,poj食物链的一种情况,并查集入门AC代码如下:#include#include#includeusing namespace std;#define Max_N 2000int book[Max_N];void init(int n)原创 2018-01-03 16:10:49 · 189 阅读 · 0 评论 -
hdu5427A problem of sorting
题目大意:输入人名以及出生年份,从年轻到老输出名字思路:水题,注意名字有空格代码如下:#include#includetypedef struct{ char name[300]; int year;}ex;int main(){ int t,old,n,i,l; char k[300]; ex a[300]; scanf("原创 2017-08-23 19:11:02 · 298 阅读 · 0 评论 -
hdu1242Rescue(dfs基础)
题目大意:给你一张n*m大小的地图,a是天使,r是士兵,#是墙,x是妖怪,.是路,遇到x要停一秒,问士兵到达天使的最短时间,移动一格也要一秒思路:这题说是士兵找天使,不如说是天使找士兵,士兵有多个,天使只有一个,当天使能最快找到士兵也符合题意,我直接dfs,方法有点土,不过感觉比bfs好些,当然也牺牲了一些时间,bfs肯定快一些代码如下:#include#includeint bo原创 2017-08-23 11:02:09 · 288 阅读 · 0 评论 -
hdu2299Largest Triangle
题目大意:输入一个整数n,表示二维坐标内点的数量,接下来的n行输入n个点,输出其中三个点构成的最大三角形的面积思路:这里有一个叉乘的几何意义,平面内两个向量的叉乘的模为一这两条向量模长为边的平行四边形的面积,公式为|a×b|=|x1*y2-x2*y1|,最后记得除2,因为是三角形代码如下:#include#includeint main(){ int a[100][原创 2017-08-14 23:34:16 · 288 阅读 · 0 评论 -
HDU2816I Love You Too(水题)
题目大意:输入一段数字,每两个代表一个大写的英文字母,转换法则和我们手机9键盘打字规则类似,第一个代表输入的字母所在的数字按键中,第二个代表字母在该按键的第几个位置。得到的字符串再根据电脑键盘从Q到M的顺序按顺序转换(Q->A,W->B...),最后再将这段字母二分,前面一个后面一个地输出出来。思路:就是模拟啦,电脑键盘转换那边可以建一个整型数组,下标代表电脑键盘字母的ASCII值,内容存要转原创 2017-08-18 18:33:45 · 393 阅读 · 0 评论 -
hdu2627Life(水题)
题目大意:输入一个数n,再输入一段长度为n只含01的字符串,然后输入n个数,如果该数对应字符串中为1,把这个数加到sum中,然后根据范围输出相应结果思路:直接上码代码如下:#includeint main(){ char a[20000]; int s[20000],n,i,t,sum,year,cnt; scanf("%d",&t); while(t--) { sc原创 2017-08-17 13:43:30 · 199 阅读 · 0 评论 -
HDU2069暴力
AC代码如下:#include<stdio.h>#include<string.h>#include<stdlib.h>#include<math.h>#include<iostream>#include<algorithm>#include<queue>#include<stack&a原创 2018-03-10 00:19:20 · 267 阅读 · 0 评论 -
HDU2052
题目大意:输出图形AC代码如下:#include<stdio.h>#include<string.h>#include<stdlib.h>#include<string>#include<math.h>#include<stack>#include<queue>#include<map&原创 2018-02-25 23:48:20 · 147 阅读 · 0 评论 -
HDU1711(kmp模板题)
题目大意: 给一段长度为n的整数s1以及相对较小长度为m的整数s2,问在s1中s2第一个成功匹配的位置在哪?不存在输出-1.解题思路: kmp模板AC代码:#include <stdio.h>#include <string.h>#include <stdlib.h>#include <iostream>#include <al...原创 2019-01-03 20:20:26 · 205 阅读 · 0 评论 -
HDU1166敌兵布阵(树状数组)
题目链接:hdu1166题目大意:RT,多次查询与更新。解题思路:单点更新,区间查询,利用树状数组二分的特性将复杂度均摊到O(logn),注意cin会卡超时,用scanf稳过。AC代码:#include <cstdio>#include <cstring>#include <cstdlib>#include <cmath>#incl...原创 2019-02-14 17:01:52 · 194 阅读 · 0 评论 -
HDU2511(汉诺塔结论)
题目链接:汉诺塔X解题思路:单纯的模拟由于数据规模比较大,会爆栈或者超时。可以利用汉诺塔的移动次数的2^(n-1)+1的结论进行优化。AC代码:/*汉诺塔:移动k个盘需要2^(k-1)+1次数,其中1,3阶段镜像,故次数相同。1: 2^(k-1)+12: 13: 2^(k-1)+1*/#include <cstdio>#include <cstring&...原创 2019-01-22 23:54:24 · 327 阅读 · 0 评论 -
HDU1175(搜索+剪枝)
题目链接: 连连看题目大意: 给一张n*m大小的图,问查询的两个点k1与k2之间能不能消掉,消掉的条件是通过走没有东西的路径拐弯不超过两次到达目标点。(0表示没有东西,>1的物品表示相应的东西),并且不能够走外围。解题思路: 从起点向终点搜索可行解,有一个重要的剪枝是:当无转弯的次数时,还没到达与终点相同的行或列时排除该条搜索分枝。AC代码:#include <cstdio&g...原创 2019-01-16 15:38:15 · 888 阅读 · 0 评论 -
HDU1429(BFS+二进制状态压缩)
题目链接:HDU1429解题思路:正常搜最短路的图,但是走过的路可能重复走,因为可能拿到钥匙后沿路返回。要有一个记录口袋中钥匙相应状态的数组,由于有“a-j”10把钥匙,可以用10位二进制的数将其状态压缩到这个数中0表示没有,1表示有。可以加一个步数即使走最短路也到达不了终点的剪枝。注意记录行走状态的数组book要提前标记,不能等到pop了才标记,不然会爆内存…(PS:这题题目没说清楚被魔王抓回...原创 2019-01-26 12:21:06 · 190 阅读 · 0 评论 -
HDU4561连续最大积(DP+优化 or 贪心模拟)
题目链接: hdu4561题目大意:给一段n长的序列,由-2,0,2组成,问连续乘积最大的幂是多少?如果乘积为0或负数幂输出0。解题思路:解法1:dp[i][0]: 表示考虑到i位置的元素且积为负数的2的幂dp[i][1]: 表示考虑到i位置的元素且积为正数的2的幂转移方程:当elem[i] == 2若dp[i-1][0] != 0, 则dp[i][0] = dp[i-1][...原创 2019-01-17 17:24:37 · 265 阅读 · 0 评论 -
HDU2709(线性DP)
题目大意: 输入n,拆解n为多个2的幂之和,问拆解的方法数解题思路:设DP[i]为i的拆解种类数解法1:罗列出在N内能出现的偏移量,即2的幂,然后把会产生该偏移量的结果值都计算一次,即加上这个数在没有该偏移量之前值得拆分方法数解法2:正确高效的解法: 直接考虑i本身得拆解方法数,如果他是奇数,一定含有1,所以状态由之前的第一个偶数的状态转移过来。否则是偶数时,一定由之前的第一个奇数或...原创 2019-01-06 23:47:01 · 225 阅读 · 0 评论 -
HDU1358(next数组的性质)
题目链接: HDU1358题目大意: 给一段长度为n的字符串,让你求出长度为s的完美前缀字串(含k段循环节)的字串长度len以及循环次数k,k取最大(即循环节长度取最小)解题思路: 关于next数组性质的应用/** * HDU_1358 * * 输入: n以及长度为n的串。0表示输入结束 * 输出:循环节的长度以及循环的周期(循环周期取最大) * *//** * * n...原创 2019-01-06 19:24:57 · 306 阅读 · 1 评论