数据结构
hexianhao
这个作者很懒,什么都没留下…
展开
-
hdu 5692 Snacks(dfs序+线段树区间更新)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5692解题思路:这道题是树节点的点权更新,而且涉及到子树,常用的思路是利用dfs序,用线段树来对区间进行维护。这道题就是这样做的,由于某一个点的权值改变,它的子树必定都会受影响,所以这里正好可以用线段树区间更新来维护从0号节点到各个节点的前缀和,那么最大的肯定就是这些区间里最大前缀和。#原创 2016-10-01 20:03:38 · 331 阅读 · 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 · 328 阅读 · 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 · 248 阅读 · 0 评论 -
hdu 4533(树状数组区间更新+单点查询)
题意:给你N个矩形,每个矩形给出左下角坐标,右上角坐标,有M个询问,每个询问给出一个时间t,问(0,0),(t,t)的范围内矩形的面积和(重叠的也算)。参考博客:http://blog.csdn.net/shiqi_614/article/details/8869676#include #include #include using namespace std;const int转载 2016-06-29 11:09:50 · 463 阅读 · 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 · 321 阅读 · 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 · 284 阅读 · 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 · 428 阅读 · 0 评论 -
hdu 2461(线段树求面积并)
题意:给出N个矩形,M次询问每次询问给出R个,问这R个矩形围成的面积解题思路:对于每次询问,做一次线段树求面积的并操作。每个节点保存的信息有l,r,cover,len分别表示该节点表示的区间[l,r],该区间被线段完全覆盖的次数以及被线段覆盖的长度。#include#include#include#include#incl原创 2016-05-05 16:37:55 · 354 阅读 · 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 · 344 阅读 · 0 评论 -
hdu 3564(线段树+LIS)
题意:给出1~n的插入顺序,要求每次插入之后的LIS解题思路:这道题确实挺难想的,我最开始想用树状数组每插入一个数就更新一次,如果这么想,那么你就输了。它这里的想法是先将1-n的最终位置都保存起来,然后再一个个去找LIS。这里有点离线算法的意思,至少了解到更新时可以先别急着处理。还有这里要总结一种线段树的用法,就是在空格处去填充数字,确实结合了这道题的特点把线段树用的很灵活。。。原创 2016-03-27 12:00:27 · 461 阅读 · 0 评论 -
hdu 1506(dp || 单调栈)
题意:这题是要找最大的矩形面积。解题思路:这题的关键是要找每个条形能够往左和往右能够到达的最大长度。我最开始的思路是单调栈去维护,只要入栈的元素比栈顶元素小,栈顶就要出栈,并且知道其最右能够到达的最远距离。当要入栈的元素已经找到了位置,那么它左边的元素所在的位置就是其能到达的最左距离。这道题比较坑,要用__int64位,而且在当栈为空时,加入的新元素的最左是能够到达1的,这里我开始原创 2016-04-08 16:00:44 · 461 阅读 · 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 · 435 阅读 · 0 评论 -
hdu 5367(线段树+区间合并)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5367官方题解:对于求“高山脉”长度,可以利用线段树。树节点中保存左高度连续长度,左高度连续区间的高度,左高度连续区间的状态(即是否高于第一个高度不同的山),右高度连续长度,右高度连续区间的高度,右高度连续区间的状态,每段区间内的“高山脉”数量。每次更新时更新高度即可,在pushup过程中去计算原创 2016-07-17 16:33:41 · 522 阅读 · 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 · 361 阅读 · 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 · 432 阅读 · 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 · 675 阅读 · 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 · 797 阅读 · 0 评论 -
hdu 5493 Queue(逆序对,线段树)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5493解题思路:一道线段树的题目,因为是前面或者后面有k个比自己高的人,所以我们应该按照由身高从小到大排序,这样前面的人对后面的人就没有什么影响。我们线段树中存的是每一段有多少空位置。这样每次如果根节点的空位置小于k,那么很明显没办法放,同样因为前面对后面的没有什么影响,我只需要找到k和n-k-原创 2016-08-10 20:09:05 · 805 阅读 · 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 · 493 阅读 · 0 评论 -
nyoj 1217 GLaDOS的耳机
GLaDOS的耳机时间限制:3000 ms | 内存限制:65535 KB难度:4描述 GLaDOS是个耳机控。对于他来说,已经不满足于只是听出供电设备是水电、核电还是火电了。GLaDOS有更大的目标,他想听出宇宙中最神秘的代号为"Y_A_FL"的声音。为了实现这个目的,GLaDOS决定为他的耳机加工升级。但是笨手笨脚的GLaDOS表示加工原创 2016-08-19 09:28:25 · 309 阅读 · 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 · 327 阅读 · 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 · 304 阅读 · 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 · 486 阅读 · 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 · 454 阅读 · 0 评论 -
hdu 3954(线段树区间更新)
转载标记处:http://www.cnblogs.com/wang-jue/articles/2920341.html思路:这道题所得到的经验与每个英雄的等级有关,一般的可能就用线段树一直更新到每一个英雄,但这样肯定会超时的。所以我就在想如何使用lazy思想,我发现如果这一段区间内的英雄都已经是最高等级了,那么这一段内肯定是可以用lazy标记的,写完之后TLE了。于是搜到这篇博客,他最原创 2016-03-24 17:00:59 · 373 阅读 · 0 评论 -
hdu 1255(线段树求重叠面积)
扫描线求矩形重叠面积:http://www.cnblogs.com/scau20110726/archive/2013/04/12/3016765.html这题参考:http://www.cppblog.com/menjitianya/archive/2011/03/30/143043.html解题思路:线段树+离散化首先我们将每个矩形的纵向边投影到Y轴上,这样就可以把矩形的纵原创 2016-03-13 15:37:02 · 559 阅读 · 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 · 555 阅读 · 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 · 268 阅读 · 0 评论 -
hdu 1540(线段树单点更新 区间合并)
解题思路:这一题要求的是连续区间,所以可以把它的子区间合并,这里运用线段树,但是在保存节点信息的方面要做一点修改lsum:从这个区间的左端点往右能够找到的最大连续区间;rsum:从这个区间的右端点往左能够找到的最大连续区间;msum:表示这整个区间能够找到的最大连续区间;sum:0表示这个区间还没有被破坏的点,大于0表示这个区间已经有被破坏的点。接下来过程就是从大的区间逐渐分解原创 2016-03-17 10:54:25 · 294 阅读 · 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 · 267 阅读 · 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 · 298 阅读 · 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 · 283 阅读 · 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 · 577 阅读 · 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 · 384 阅读 · 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 · 371 阅读 · 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 · 435 阅读 · 0 评论 -
poj 1451(Trie)
题意:就是让你模拟手机输入单词。具体就是给你一些单词,以及该单词被使用的频数,这个频数也是该单词前缀的使用频数,当然不同的单词有可能有相同的前缀,那么这个相同的前缀的使用频数就是这两个单词使用频数之和,以此类推。然后再给你一些数字串,让你针对该数字串的每一个前缀输出它的最有可能对应的单词(即频数最大的字符串)。解题思路:这道题目比我想象中的简单,直接dfs去搜,因为每个键的字母个数不超原创 2016-02-19 16:35:59 · 242 阅读 · 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 · 246 阅读 · 0 评论 -
hdu 4027(线段树)
题意:给定100000个数,两种操作,0 i j表示将i j这段的数字都开根号(向下取整),1 i j表示查询i j之间的所有值的和。。。(所有的和都不超过64位)解题思路:这题要做区间的开平方操作,2^64最多可以做8次开平方操作,所以对于每个节点最多只有8次操作,这道题如果lazy思想的话就要保存每个区间被开平方的次数,但实际上好像不需要,只要一直找到叶子节点并将其开平方即可。如果整个区间原创 2016-03-23 16:39:44 · 457 阅读 · 0 评论 -
poj 2777(线段树+区间染色)
解题思路:这道题利用了线段树+位运算的思想,由于颜色的种类只有30种,所以int可以存下来,所以我们在线段树的节点里面加上status的状态信息,表示这段区间内的颜色信息,而且我们可以知道,父节点的status是两个儿子节点的status异或得到的,同时为了能够提高查找效率,还要设置一个信息cover,cover=1表示这段区间只有一种颜色,cover=0表示有多种颜色被覆盖了,所以在找到cove原创 2016-03-22 21:53:17 · 815 阅读 · 1 评论