数据结构
hexianhao
这个作者很懒,什么都没留下…
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
hdu 5367(线段树+区间合并)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5367官方题解:对于求“高山脉”长度,可以利用线段树。树节点中保存左高度连续长度,左高度连续区间的高度,左高度连续区间的状态(即是否高于第一个高度不同的山),右高度连续长度,右高度连续区间的高度,右高度连续区间的状态,每段区间内的“高山脉”数量。每次更新时更新高度即可,在pushup过程中去计算原创 2016-07-17 16:33:41 · 611 阅读 · 0 评论 -
hdu 1394(树状数组求逆序数)
解题思路:这道题是求循环数组中逆序数最小值,求逆序数这里肯定是用树状数组。只是这里有一点点变化,由于题目中n位数是0-n-1的一个排列,所以num[i]可表示为比num[i]小的数的个数。把第一位的数挪到最后一位,那么整个序列的逆序数变化为ans =ans - num[0] + (n-1-num[0]),num[0]表示后面的n-1位对逆序数的贡献,n-1-num[0]表示把最后一位挪过来对逆序原创 2016-03-14 15:57:07 · 562 阅读 · 0 评论 -
hdu 1506(dp || 单调栈)
题意:这题是要找最大的矩形面积。解题思路:这题的关键是要找每个条形能够往左和往右能够到达的最大长度。我最开始的思路是单调栈去维护,只要入栈的元素比栈顶元素小,栈顶就要出栈,并且知道其最右能够到达的最远距离。当要入栈的元素已经找到了位置,那么它左边的元素所在的位置就是其能到达的最左距离。这道题比较坑,要用__int64位,而且在当栈为空时,加入的新元素的最左是能够到达1的,这里我开始原创 2016-04-08 16:00:44 · 539 阅读 · 0 评论 -
hdu 3564(线段树+LIS)
题意:给出1~n的插入顺序,要求每次插入之后的LIS解题思路:这道题确实挺难想的,我最开始想用树状数组每插入一个数就更新一次,如果这么想,那么你就输了。它这里的想法是先将1-n的最终位置都保存起来,然后再一个个去找LIS。这里有点离线算法的意思,至少了解到更新时可以先别急着处理。还有这里要总结一种线段树的用法,就是在空格处去填充数字,确实结合了这道题的特点把线段树用的很灵活。。。原创 2016-03-27 12:00:27 · 539 阅读 · 0 评论 -
hdu 4193(单调队列)
题意:给你一个n项的序列,每次可以把序列的首项移动到末尾,显然一共可以构成 n 种序列,问一共有多少种序列满足条件:序列的前 i 项和都大于等于0(i:1~n)。解题思路:这道题我想的复杂了,实际上单调队列的做法并不复杂。求前缀和就可以用sum[j]-sum[i-1],这个式子表示以第i的元素为首位的序列,然后以第j个元素结尾的前缀和。同一个序列的不同结尾的前缀和每次都是减sum[i-1],只原创 2016-04-29 17:37:38 · 429 阅读 · 0 评论 -
hdu 2461(线段树求面积并)
题意:给出N个矩形,M次询问每次询问给出R个,问这R个矩形围成的面积解题思路:对于每次询问,做一次线段树求面积的并操作。每个节点保存的信息有l,r,cover,len分别表示该节点表示的区间[l,r],该区间被线段完全覆盖的次数以及被线段覆盖的长度。#include#include#include#include#incl原创 2016-05-05 16:37:55 · 457 阅读 · 0 评论 -
poj 1151(线段树求面积并)
解题思路:线段树求面积并,水题#include#include#include#include#include#includeusing namespace std;const int maxn = 1005;const double eps = 1e-8;struct Segment{ int l,r,cover; double len;}tree[max原创 2016-05-05 17:37:49 · 500 阅读 · 0 评论 -
hdu 4831(线段树---待解决)
Scenic PopularityTime Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Problem Description 临近节日,度度熊们最近计划到室外游玩公园,公园内部包括了很多的旅游景点区和休息区,由于旅游景点很热门,导致景点区和休息区都聚集了很多人原创 2016-05-18 20:44:35 · 356 阅读 · 0 评论 -
hdu 5444 Elven Postman(二叉树的遍历)
Elven PostmanTime Limit: 1500/1000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others)Problem DescriptionElves are very peculiar creatures. As we all know, they can live for a原创 2016-06-08 15:21:11 · 395 阅读 · 0 评论 -
hdu 4533(树状数组区间更新+单点查询)
题意:给你N个矩形,每个矩形给出左下角坐标,右上角坐标,有M个询问,每个询问给出一个时间t,问(0,0),(t,t)的范围内矩形的面积和(重叠的也算)。参考博客:http://blog.youkuaiyun.com/shiqi_614/article/details/8869676#include #include #include using namespace std;const int转载 2016-06-29 11:09:50 · 545 阅读 · 0 评论 -
hdu 5124(线段树区间更新+lazy思想)
http://acm.hdu.edu.cn/showproblem.php?pid=5124题意:区间覆盖次数问题。解题思路:线段树水之。#include#include#include#includeusing namespace std;const int maxn = 100005;struct Node{ int x,y;}p[maxn];struct原创 2016-06-29 14:50:16 · 321 阅读 · 0 评论 -
hdu 5195(拓扑排序+线段树优化)
DZY Loves Topological SortingTime Limit: 4000/2000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others)Total Submission(s): 1064 Accepted Submission(s): 327Problem Description原创 2016-07-11 11:45:45 · 433 阅读 · 0 评论 -
poj 2985(并查集+线段树求K大数)
解题思路:这道题并查集很容易,合并时找到父节点就直接加上去就ok了。关键是如何求K大数,我一直在想用线段树怎么写,一开始想如果直接记录数的大小那肯定是没戏了,借鉴了一下别人的思路:区间[a,b]记录的是所有的数里面,等于a,a+1,a+2,......,b-1,b的个数。看到这里就应该明白了,这里线段树的用法是把它看做是一个1-n的数轴。到时候要修改某一个数,就直接在数轴上修改它。至于记录[a,b原创 2016-03-28 20:40:09 · 518 阅读 · 0 评论 -
hdu 3954(线段树区间更新)
转载标记处:http://www.cnblogs.com/wang-jue/articles/2920341.html思路:这道题所得到的经验与每个英雄的等级有关,一般的可能就用线段树一直更新到每一个英雄,但这样肯定会超时的。所以我就在想如何使用lazy思想,我发现如果这一段区间内的英雄都已经是最高等级了,那么这一段内肯定是可以用lazy标记的,写完之后TLE了。于是搜到这篇博客,他最原创 2016-03-24 17:00:59 · 465 阅读 · 0 评论 -
hdu 5497 Inversion(树状数组)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5497解题思路:用树状数组维护一段区间L,区间长度为m,依次枚举该区间的终点ai,即将该点加入到区间L来,把ai-m从原来的L中删除;删去ai+m,影响就是少了后面所有比它小的逆序对数,以及前面所有比它大的逆序对数 添加ai,同理,多了所有比它小的逆序对数,以及前面所有比它大的逆序对原创 2016-07-21 10:11:45 · 566 阅读 · 0 评论 -
poj 1990 MooFest(转化成树状数组求和)
题目大意:一群牛参加完牛的节日后都有了不同程度的耳聋,第i头牛听见别人的讲话,别人的音量必须大于v[i],当两头牛i,j交流的时候,交流的最小声音为max{v[i],v[j]}*他们之间的距离。现在有n头牛,求他们之间两两交流最少要的音量和。解题思路:先将v按从小到大排序,这样对于vi,那么vi之前的牛所交流的声音就是vi,vi很好确定,但关键就是怎么算距离了。我们可以用两个树状数组,一个维护原创 2016-07-22 10:46:37 · 385 阅读 · 0 评论 -
poj 3321 Apple Tree(dfs序+树状数组求和模型)
题目链接:http://poj.org/problem?id=3321解题思路:先dfs求出序列,将子树转化到dfs序列的区间内,接下来就是简单的树状数组求和模型了。水题。#include#include#includeusing namespace std;const int maxn = 100005;struct Edge{ int to,next;}edge[原创 2016-07-22 11:11:46 · 418 阅读 · 0 评论 -
nyoj 1217 GLaDOS的耳机
GLaDOS的耳机时间限制:3000 ms | 内存限制:65535 KB难度:4描述 GLaDOS是个耳机控。对于他来说,已经不满足于只是听出供电设备是水电、核电还是火电了。GLaDOS有更大的目标,他想听出宇宙中最神秘的代号为"Y_A_FL"的声音。为了实现这个目的,GLaDOS决定为他的耳机加工升级。但是笨手笨脚的GLaDOS表示加工原创 2016-08-19 09:28:25 · 396 阅读 · 0 评论 -
poj 1186 方程的解数(线性探测再哈希)
方程的解数Time Limit: 15000MS Memory Limit: 128000KTotal Submissions: 7084 Accepted: 2431Case Time Limit: 5000MSDescription已知一个n元高次方程: 其中:x1, x2,...,xn是未知数,原创 2016-08-08 09:52:58 · 592 阅读 · 0 评论 -
hdu 5493 Queue(逆序对,线段树)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5493解题思路:一道线段树的题目,因为是前面或者后面有k个比自己高的人,所以我们应该按照由身高从小到大排序,这样前面的人对后面的人就没有什么影响。我们线段树中存的是每一段有多少空位置。这样每次如果根节点的空位置小于k,那么很明显没办法放,同样因为前面对后面的没有什么影响,我只需要找到k和n-k-原创 2016-08-10 20:09:05 · 904 阅读 · 0 评论 -
hihocoder #1343 : Stable Members(支配树)
时间限制:10000ms单点时限:1000ms内存限制:256MB描述Recently Little Hi joined an algorithm learning group. The group consists of one algorithm master and Nmembers. The members are numbered from 1 t转载 2016-09-05 17:59:35 · 887 阅读 · 0 评论 -
nyoj 947 Max Xor(字典树)
Max Xor时间限制:3000 ms | 内存限制:65535 KB难度:4描述给一个长度为 n 的数列 {an} ,找出 max {ai ^ aj}。输入多组测试数据。第 1 行 1 个数 n。(1接下来的 1 行有 n 个数 ai。(0输出1 行有 1 个数,max {ai ^ aj}。样例输入30 1 2样例输出原创 2016-08-26 16:13:14 · 759 阅读 · 0 评论 -
nyoj 1261 音痴又音痴的LT(离散化+树状数组求K小数)
题目链接:http://acm.nyist.net/JudgeOnline/problem.php?pid=1261解题思路:比较水的题,用离散化+树状数组求K小数即可,先用一次离线处理。#include#include#include#include#include#includeusing namespace std;const int maxn = 1原创 2016-09-28 23:23:37 · 538 阅读 · 0 评论 -
nyoj 1272 表达式求值(中缀式转后缀式)
表达式求值时间限制:1000 ms | 内存限制:65535 KB难度:3描述假设表达式定义为: 1. 一个十进制的正整数 X 是一个表达式。 2. 如果 X 和 Y 是 表达式,则 X+Y, X*Y 也是表达式; *优先级高于+. 3. 如果 X 和 Y 是 表达式,则 函数 Smax(X,Y)也是表达式,其值为:先分别求出 X ,Y 值的各位数字之和,再从中原创 2016-09-29 20:42:18 · 436 阅读 · 0 评论 -
hdu 5692 Snacks(dfs序+线段树区间更新)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5692解题思路:这道题是树节点的点权更新,而且涉及到子树,常用的思路是利用dfs序,用线段树来对区间进行维护。这道题就是这样做的,由于某一个点的权值改变,它的子树必定都会受影响,所以这里正好可以用线段树区间更新来维护从0号节点到各个节点的前缀和,那么最大的肯定就是这些区间里最大前缀和。#原创 2016-10-01 20:03:38 · 426 阅读 · 0 评论 -
poj 1988(并查集)
题意:进行m次操作,M x y 将包含x的集合移动到y上面,C x, 计算x下面有几个元素。解题思路:这道题很容易想到用并查集,但是这里有点绕;最开始我想到的是建立一个num[x],表示x以下的节点数,但这样会有一个问题,要更新num[x]时,必须要枚举哪些节点的父节点为p,由于节点数太多,所以TLE是难免的。。。。这里有一个好办法:在算x以下节点数时,可以用x所在原创 2016-02-20 10:05:07 · 322 阅读 · 0 评论 -
poj 2503(字符串hash)
解题思路(copy别人的):通过ELFhash函数来做。冲突处理则是用到链表的方法。#include #include #include #define N 100001#define strSize 15using namespace std;struct Hash{ bool used; char fn[strSize],en[strSize];转载 2015-12-10 16:23:34 · 522 阅读 · 0 评论 -
hdu 2428(哈希)
StarsTime Limit: 5000/1000 MS (Java/Others) Memory Limit: 65535/65535 K (Java/Others)Problem Description Lucy loves stars very much. There are N (1 <= N <= 1000) stars in the sky. Assu原创 2015-12-12 09:27:18 · 456 阅读 · 0 评论 -
hdu 1381
Crazy SearchTime Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 2299 Accepted Submission(s): 852Problem DescriptionMany people like转载 2015-12-12 10:26:19 · 455 阅读 · 0 评论 -
hdu 3973(hash+线段树)
AC's StringTime Limit: 30000/10000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Problem DescriptionYou are given some words {Wi}. Then our stupid AC will give you a very long转载 2015-12-12 13:05:17 · 689 阅读 · 0 评论 -
poj 2823(单调队列)
Sliding WindowTime Limit: 12000MS Memory Limit: 65536K Case Time Limit: 5000MSDescriptionAn array of size n ≤ 106 is given to you. There is a sliding wind原创 2016-01-03 19:33:04 · 354 阅读 · 0 评论 -
hdu 1800 (字符串哈希)
Flying to the MarsTime Limit: 5000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Problem DescriptionIn the year 8888, the Earth is ruled by the PPF Empire . As the原创 2015-12-23 15:30:18 · 367 阅读 · 0 评论 -
hdu 1255(线段树+离散化)
覆盖的面积Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Problem Description给定平面上若干矩形,求出被这些矩形覆盖过至少两次的区域的面积. Input输入数据的第一行是一个正整数T(1注意:本题的输入转载 2016-01-28 10:16:58 · 353 阅读 · 0 评论 -
hdu 1540(线段树单点更新 区间合并)
解题思路:这一题要求的是连续区间,所以可以把它的子区间合并,这里运用线段树,但是在保存节点信息的方面要做一点修改lsum:从这个区间的左端点往右能够找到的最大连续区间;rsum:从这个区间的右端点往左能够找到的最大连续区间;msum:表示这整个区间能够找到的最大连续区间;sum:0表示这个区间还没有被破坏的点,大于0表示这个区间已经有被破坏的点。接下来过程就是从大的区间逐渐分解原创 2016-03-17 10:54:25 · 356 阅读 · 0 评论 -
poj 1195(二维树状数组)
解题思路:这是一道很裸的二维树状数组AC:#include#include#define N 1100int c[N][N],n,arr[N][N];int lowbit(int x){ return x&(-x);}void update(int x,int y,int num){ int i,j; for(i=x;i<=n;i+=lo原创 2016-02-19 11:59:44 · 335 阅读 · 0 评论 -
hdu 3303(线段树+抽屉原理)
解题思路:这题利用了抽屉原理,即1-M之间的所有数与M+1的模都不相同。那么可以利用它将要查找所有区间分成[1,Y-1],[Y,2*Y-1],[2*Y,3*Y-1].........一直下去,直到所有的区间都被找一遍,然后就是保存最小的模即可。。。这样就肯定要找每个区间的最小的模,实际上这里可以利用线段树去找,只需要把这个区间内最小的那个数找到就可以了。它肯定是模Y最小的,线段树的工作难度不大,关原创 2016-03-17 19:45:30 · 649 阅读 · 0 评论 -
poj 1451(Trie)
题意:就是让你模拟手机输入单词。具体就是给你一些单词,以及该单词被使用的频数,这个频数也是该单词前缀的使用频数,当然不同的单词有可能有相同的前缀,那么这个相同的前缀的使用频数就是这两个单词使用频数之和,以此类推。然后再给你一些数字串,让你针对该数字串的每一个前缀输出它的最有可能对应的单词(即频数最大的字符串)。解题思路:这道题目比我想象中的简单,直接dfs去搜,因为每个键的字母个数不超原创 2016-02-19 16:35:59 · 310 阅读 · 0 评论 -
hdu4821 字符串hash
参考博客:点击打开链接字符串hash典例。 这里用的是bkdrhash 法。也是最常用的冲突最少的一种。原理:把字符串和数值对应。这里用base=31(一般用质数),先是扫一遍,处理处每个位子到结尾构成的串的hash值(倒过来的),然后长度为l的子串的haash值就好算了。之后枚举开头l个,每次向后翻滚,复杂度max(L*M, L*(S.SIZE/M))可以过,转载 2015-12-10 21:32:39 · 458 阅读 · 0 评论 -
poj 2010(优先队列)
题意: 奶牛大学:奶大招生,从C头奶牛中招收N头。它们分别得分score_i,需要资助学费aid_i。希望新生所需资助不超过F,同时得分中位数最高。求此中位数。解题思路:这里要求最大中位数,中位数肯定是在这些人中间,故可以枚举中位数,可以先对分数进行排序,然后用二分去找最大中位数。每次枚举的中位数应该要检验是否满足题意:这里有一个check函数,它的返回值含义如下:-1原创 2016-02-20 11:55:42 · 378 阅读 · 0 评论 -
hihocoder #1078 : 线段树的区间修改
解题思路:基础的线段树区间修改我按照书上敲的代码不知道为什么WA。。。#include#include#includeusing namespace std;const int maxn = 1e5;int n,q,l,r,_sum;int setv[maxn<<2],sum[maxn<<2];void maintain(int o,int L,int R原创 2016-02-20 20:25:52 · 592 阅读 · 0 评论
分享