
----- 数据结构 -----
文章平均质量分 68
ITCharge
高效率编程,慢节奏生活。
展开
-
HDU2795_Billboard
BillboardTime Limit: 20000/8000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 10624 Accepted Submission(s): 4701Problem Description At the entran原创 2014-08-07 16:09:28 · 972 阅读 · 0 评论 -
NYOJ108 士兵杀敌(一)【树状数组】
题目大意:给你一个区间[1,N],每个点上有一个值,然后是M个询问。每次询问区间[X,Y]的和是多少。思路:虽然递推直接求前N项和,但是还是想用树状数组的方法做。注:query();询问前N项和原创 2014-12-13 18:23:22 · 1060 阅读 · 0 评论 -
HDU1556 Color the ball【树状数组】【区间更新】
题目大意:N个气球排成一排,从左到右编号为1~N,给N组数据,每次给2两个整数s,e,表示从s到e将气球涂色。当涂到N次以后已经忘记了第i个气球被涂过几次颜色了。现在来计算出每个气球被涂了几次颜色,并输出出来。思路:典型的更新区间,单点求值问题。直接模拟会超时,考虑用树状数组来做。单点更新中,树状数组表示区间的和。在区间更新中,树状数组表示单个元素的变化。这道题中,区间(s,e)加1表示将s到e的气球涂色,先进行操作Update(s,1),表示将s~N个气球全部涂一次颜色,再进行操作Upd原创 2015-04-27 22:42:57 · 963 阅读 · 0 评论 -
NYOJ116 士兵杀敌(二)【树状数组】
题目大意:给你一个区间[1,N],每一个点上一个值。接下来是M条命令。QUERY X Y表示询问区间[X,Y]的和是多少。ADD X Y表示第X个点增加Y。思路:可用线段树或是树状数组来做。这次用树状数组试试。query(n);表示询问前n项的和。add(p,val)表示第p个点增加val。原创 2014-12-13 22:19:10 · 1006 阅读 · 0 评论 -
HDU2689 Sort it【树状数组】【逆序数】
题目大意:求把一个具有N个不同元素的序列通过交换两个相邻的元素转换成升序序列需要进行的交换次数是多少。例如:1 2 3 5 4,只需要交换5和4,交换次数为1次。思路:典型的求逆序数题。其实可以直接暴力过。但是用树状数组效率比较高。对于值为a第i个元素,需要交换次数为前i个元素中大于a的元素个数,即逆序数。用树状数组来做,数组Tree[i]表示数字i是否在序列中出现过,如果数字i已经存在于序列中,Tree[i] = 1,否则Tree[i] = 0。按序列从左到右将值为a的元素当作下标为a,原创 2015-04-27 23:02:09 · 929 阅读 · 0 评论 -
HDU2838 Cow Sorting【树状数组】【逆序数】
题目大意:有N头奶牛排成一排。每头奶牛都有一个唯一的"坏脾气"值。坏脾气的范围为1~100000。现在将奶牛重新排序,使奶牛按照坏脾气增加的顺序排列。所有的奶牛都可以相互交换位置。但是交换脾气值为X,Y的两头奶牛,需要的时间是X+Y。现在问:将奶牛重新排列需要的最短时间是多少。思路:这道题就是给你一个N个元素的序列,求这个序列中所有逆序数的和。所以,对于值为a的第i个元素,除了知道前i个元素里比a大的元素个数之外,还得知道前i个元素里比a大的元素的和。建立结构体树状数组,一个变量来记录比a小原创 2015-04-28 17:05:42 · 950 阅读 · 0 评论 -
HDU2642 Stars【二维树状数组】
题目大意:现在假设天空是一个二维平面(1000*1000)。坐标从(0,0)点开始。现在给出N条信息。"B X Y",B为字符,x、y是整数,表示将坐标(x,y)的星星变亮。"D XY",D为字符,x、y是整数,表示将坐标(x,y)的星星变暗。"Q X1 X2 Y1 Y2",Q是字符,X1、X2、Y1、Y2是整数,表示问有多少颗星星在X1、X2、Y1、Y2确定的矩形中。思路:建立一个二维的树状数组,单点更新,区间求值。其实和一维的差不多。只不过第i个元素变为了第x行第y列的元素。更新和求值原创 2015-04-28 17:28:31 · 1113 阅读 · 0 评论 -
树状数组【模板】
Tree[N] = A[N-2^k+1] + … + A[N] 单点更新,区间求值:树状数组代表区间的和。const int MAXN = 100010;int N,Tree[MAXN];int Lowbit(int i){ return i & (-i);}void Update(int i,int x){ while(i <= N) { Tree原创 2015-05-04 22:46:52 · 1191 阅读 · 0 评论 -
HDU3584 Cube【树状数组】【三维】
题目大意:给定一个N*N*N多维数据集A,其元素是0或是1。A[i,j,k]表示集合中第 i 行,第 j 列与第 k 层的值。首先由A[i,j,k] = 0(1 <= i,j,k <= N)。给定两个操作:1:改变A[i,j,k]为!A[i,j,k]。2:查询A[i,j,k]的值。思路:三维树状数组区间更新、单点查询。更新区间(a,b)时,在 a 和 b+1 处都加1,前边表示增加1,后边是抵消加1操作,最后询问时,用Query(x) % 2 即为单点的值(0或1)。三维区间更新,要注意区原创 2015-05-13 12:38:05 · 1363 阅读 · 0 评论 -
HDU1541 Stars【树状数组】
题目大意:按顺序给你N颗星星的坐标,y是从小到大给出的。每个星星有一个等级,该等级为它左下角的星星的个数。求每个等级的点有多少个。思路:因为y是从小到大给出的,那么可以直接忽略y,只记录x,求出(x,y)左边有多少个点就可以了。用Ans[]数组表示每个等级的星星数。求(x,y)左边有多少个点用树状数组来做,每给一个点,就求出x左边的点个数。作为Ans数组下标,累加个数,最后输出Ans[]数组。原创 2015-05-13 13:32:59 · 1040 阅读 · 0 评论 -
POJ2299 Ultra-QuickSort【树状数组】【逆序数】
题目大意:给你一个包含N个整数的序列,只能通过交换相邻的数字,最终变为升序顺序,问:最少需要多少次交换。思路:其实就是问冒泡排序的交换次数。其实就是求原序列的逆序数。用归并排序、线段树、树状数组都可以做。但是如果用线段树和树状数组来做的话,因为元素个数是500000,但是元素值范围却是999999999,需要先离散化。这里用间接排序的方法。用一个数组Arr[]存放原序列的值,另一个数组Id[]存放原序列编号(1~N),对Id[]按Arr[]元素值的从大到小排序,得到Arr[]数组元素的相对大小原创 2015-05-13 15:24:14 · 975 阅读 · 0 评论 -
POJ3067 Japan【树状数组】【逆序数】
题目大意:有两排的城市,一排N个城市,编号为1~N,一排M个城市,编号为1~M。这两排城市之间有K条路。路都是直线连接,问:这些路,有多少道路是相交的,并且焦点不是城市所在的点,求出交点个数。思路:树状数组的思想。参考网上的图,先将所有边(u,v)按u升序排列,如果u相同,则按v升序排列。可以看出来,路(u1,v1)和路(u2,v2)如果有交点的话,u1 > u2 并且 v1 < v2,或者 u1 < u2 并且v1 > v2,为了不重复计算,忽略后一种情况。如果排序完之后,可以发现:结果就是原创 2015-05-13 22:22:35 · 927 阅读 · 0 评论 -
POJ1195 Mobile phones【树状数组】【二维】
题目大意:给出一个N*N的矩阵,初始化都为0,坐标从(0,0)开始。有三个操作:命令1:1 x y w;将坐标为(x,y)处的点值增加w命令2:2 x1 y1 x2 y2;询问左下角坐标为(x1,y1)、右上角坐标为(x2,y2)的矩阵和是多少命令3:3;不需要操作,退出。思路:二位树状数组单点更新,区间求值的简单题。直接做就可以了。最后求矩阵和的时候考虑容斥定理。即ans = Query(x1-1,y1-1)-Query(x1-1,y2)-Query(x2,y1-1)+Query(x2,y原创 2015-05-14 12:52:11 · 743 阅读 · 0 评论 -
HOJ1867 经理的烦恼【树状数组】
题目大意:有C家连锁店,编号1~C,有N条指令,每家店初始的商品数目都是M。接下来N行是命令。命令0:0 x w,连锁店x的商品数量变化为w,w > 0商品数量增加,w < 0商品数量减少。命令1:1 x y,询问编号区间为[x,y]的连锁店商品为素数的商店有多少家。思路:因为区间比较大,所以用树状数组来做。用一个数组Shop[]来存放每家店的商品数目,Tree[]表示树状数组。如果初始商品数量m是素数的话,则每家商店商品都为素数,遍历更新每家店。对于命令0,如果该店铺x的商品数Shop[x原创 2015-05-14 22:18:23 · 973 阅读 · 0 评论 -
POJ1879 Tempus et mobilius Time and motion【置换群】
题目大意:有三条轨道,一个球库。球库有编号1~N的小球,按顺序排列。三条轨道分别是1 分钟单位的轨道,容量为 4;5 分钟单位的轨道,容量为 11;60 分钟的轨道,容量为 11。轨道可视为栈(先进后出)。每过 1 分钟,一个小球从球库中出来,球库可视为一个队列(先进先出)。小球先进入1 分钟轨道。如果 1 分钟轨道中已经有了 4 个,则这四个小球依次进入球库,而这个球进入 5 分钟轨道。如果 5 分钟轨道已经有了 11 个,则这 11 个球依次进入球库,而这个球进入 60 分钟轨道原创 2015-09-06 11:30:19 · 544 阅读 · 0 评论 -
HDU5493 Queue【线段树】
题目大意:有 N 个人排队,每个人都忘记自己的位置。但是每个人都知道自己的身高 Hi 和自己前边或后边有 Ki 个比自己高的人。给你每个人的 Hi,Ki,求按身高满足最小序的情况。如果不满足最小序的情况,则输出"impossible"。解题思路:题目要求输出身高字典序最小的情况,那么先对身高按从小到大排序。然后按身高从小到大确定每个人的位置。由于每次都是从小到大,则每次放进的人都是比之前的人高的。设当前放进的人是身高从小到大第 i 个人,如果要满足他前边或后边刚好有 k 个人比他高,则:原创 2015-10-03 17:19:59 · 972 阅读 · 0 评论 -
HDU4496 D-City【并查集】
题目大意:给出一张图,按照给定的边的顺序逐个删除。问每删除一条边后图的连通块数是多少。思路:逆向并查集求联通块数。假设一开始的时候所有点都不连通。从给定边逆着的顺序,即从最后一条边开始添加。如果新添加的边连通了两个连通分量,则连通块数就减一,否则不改变。将每次加边后的连通块数存起来。最后输出出来。原创 2015-04-25 21:26:16 · 982 阅读 · 0 评论 -
NYOJ93 汉诺塔(三)【栈】
题目大意:上边说的很明白了。思路:就是用三个栈进行模拟过程并判断就可以。原创 2014-12-13 14:45:30 · 1067 阅读 · 0 评论 -
NYOJ35 表达式求值【栈】
题目大意:给你一个计算表达式,求出最终结果。思路:用两个栈来分别存数和操作符, 遇到'(',操作符入栈,遇到')',计算括号内的式子。遇到'+'、'-'、'*'、'/'就比较当前运算符与栈中运算符的优先级,大于等于于栈中优先级就计算,否则就入栈,留待下次计算。最后计算栈中剩下优先级低的相应式子原创 2014-12-13 12:10:51 · 1105 阅读 · 0 评论 -
HDU1698_Just a Hook
Just a HookTime Limit: 4000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 17125 Accepted Submission(s): 8547Problem Description In the game原创 2014-08-08 10:34:24 · 1042 阅读 · 0 评论 -
HDU1166_敌兵布阵
Query 1 3Add 3 6Query 2 7Sub 10 2Add 6 3Query 3 10End Sample OutputCase 1:63359 AuthorWindbreaker RecommendEddy | We have carefully selected several原创 2014-08-05 21:23:55 · 841 阅读 · 0 评论 -
POJ3468_A Simple Problem with Integers
A Simple Problem with IntegersTime Limit: 5000MS Memory Limit: 131072KTotal Submissions: 60712 Accepted: 18509Case Time Limit: 2000MSDescriptionYou have N i原创 2014-08-07 16:27:02 · 784 阅读 · 0 评论 -
HDU1754_I Hate It
I Hate ItTime Limit: 9000/3000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 37855 Accepted Submission(s): 14981Problem Description很多学校流行一种比较的习惯。老师们很喜欢原创 2014-08-07 14:53:41 · 863 阅读 · 0 评论 -
HDU1394 Minimum Inversion Number【逆序数】
Minimum Inversion NumberTime Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 10556 Accepted Submission(s): 6510Problem Description原创 2014-08-07 15:39:34 · 843 阅读 · 0 评论 -
UVA11988 Broken Keyboard (a.k.a. Beiju Text)【数组模拟链表】
题目大意:你在输入文章的时候,键盘上的Home键和End键出了问题,会不定时的按下。给你一段按键的文本,其中'['表示Home键,']'表示End键,输出这段悲剧的文本。思路:使用链表来模拟,遇到Home键,就将后边的文本插入到这段文本的最前边,遇到End键,就插入到这段文本的最后边。但是用链表会用到指针,过程比较繁琐。这里用一个Next数组模拟指向,Next[i]表示当前显示屏中s[i]右边的字符下标。再用一个cur表示当前光标的位置,last表示最后一个字符的记录位置,这样遇到End键,就能直原创 2014-12-09 21:54:41 · 2773 阅读 · 1 评论 -
HDU1274 展开字符串【栈】
题目大意:为了表示纺织CAD系统的纱线排列问题。用小写字母来表示不同的纱线,连接在一起表示纱线的组合。前边加数字表示重复多少次。比如2(abc),a、b、c表示不同的纱线,abc表示纱线组合,2+()表示abc重复两次,即abcabc。如果前边没有数字,则默认为1。现在给你一个这样的字符串,请将表达式展开输出排列结果。思路:使用栈操作,将字符串展开。重点在于去括号。1)如果遇到数字或是左括号,直接入栈。2)如果遇到字母,分两种情况: 栈顶元素为数字num,则将字母压入占中num次。 栈原创 2015-04-14 17:55:36 · 1464 阅读 · 1 评论 -
HDU1285 确定比赛名次【拓扑排序】【优先队列】
思路:因为要满足字典序的拓扑排序,所以用了STL中的优先队列。priority_queue<int,vector<int>, greater<int> > Q;实现了权值小的优先级高,取出的时候保证序号是队列中最小的。其他的和一般的拓扑排序无区别。原创 2014-12-22 22:22:36 · 1153 阅读 · 0 评论 -
UVA699 The Falling Leaves【二叉树】【递归】
题目大意:给你一棵二叉树,每个节点都有一个位置。左子结点在它左边1个单位,右子节点在它右边1个单位。在竖直方向上在一条线上的点位置相同。比如图中的5和6在同一位置。现在从左到右,输出这棵树上相同位置上的所有节点的和。思路:最多80个叶子节点,那么算上每层节点不会多于160个。建一个200左右的数组,让中间编号为根结点,递归建立左右子树。并将相同位置的和累加。原创 2014-12-11 11:44:55 · 958 阅读 · 0 评论 -
UVA122 Trees on the level【二叉树】【BFS】
题目大意:输入一颗二叉树,将它按从上到下、从左到右的顺序输出各个节点位置。思路:先根据输入的字符串将二叉树建立起来(注:可能出现不能建立的情况),若能成功建立,则用宽度优先搜索(BFS)的方法遍历所有节点,并在遍历的时候,把结果存下来,然后进行输出。注意:BFS需要用到队列。原创 2014-12-11 09:23:21 · 1615 阅读 · 0 评论 -
UVA442 Matrix Chain Multiplication【stack】【栈】
题目大意:给你N个矩阵的规模,再给你矩阵链乘的表达书,输出乘法的次数。思路:利用栈来解表达式,遇到字母时,矩阵入栈,遇到右括号')'出栈并计算结果,再将结果入栈。原创 2014-12-11 09:02:25 · 1039 阅读 · 0 评论 -
UVA679 Dropping Balls【二叉树结点编号】
题目大意:给一颗深度为D的完全二叉树,节点编号从上到下从左到右为1,2,3,4……在结点1上方一个小球,小球落到一个结点上就会改变该点的开关。若该点开,则向左走,否则向右走,给你I个小球,问最后一个小球最后所能落到的叶子编号。思路:每一个结点上第奇数个小球都落在左子树上,第偶数个小球都落在右子树上。直接对最后一个小球判断就可以了。若I为该结点奇数,它是向左走的第(I+1)/2个小球。若为偶数,则是向右走的I/2个小球。原创 2014-12-11 08:54:55 · 1393 阅读 · 0 评论 -
HDU3351_Seinfeld【栈】
题目大意:一串由'{'和'}'组成的字符串,'{'和'}'可以互相转换,括号匹配的时候为稳定状态。输入一个字符串,问最少经过几次变换能达到稳定状态。思路:先建立一个栈,让每个字符逐个进栈,若相邻的两个字符为"{}"(即相邻括号匹配),则两个字符同时出栈。最终栈里边留下括号不匹配的项。通过观察可知:最终留在栈里的肯定为以下情况“}}}}…{{{{{…",即左边全为'}',右边全为'{'。那么最少要转换多少次呢。由题意可知,括号总数为偶数分别计算'}'的个数sum1,'{'的个数sum2。若'}原创 2014-10-20 09:45:24 · 1173 阅读 · 0 评论 -
UVA839 Not so Mobile【二叉树】【递归】
题目大意:给你一个树形的天平,如图所示,根据力矩相等原则判断是否相等。注意:输入的时候采用(先序)输入,如果WL为0时,该天平有左子天平,接下来描述这个左子天平,如果WR为0时,该天平有有右子天平,接下来描述这个右子天平。如果WL = WR = 0。则先描述左子天平,再描述右子天平。思路:递归进行输入并进行判断。从最里层开始判断返回结果。一直到根。原创 2014-12-11 10:24:22 · 1321 阅读 · 0 评论 -
POJ1363 Rails【stack】【栈】
题目大意:如上图所示,已知火车要从A入站,然后从C出站。火车进站的顺序为1~N,现在给你出站的顺序。问:能不能通过站台改变火车出站顺序来实现按所给顺序出站。思路:把站台看做是一个栈,按1~N的顺序遍历火车原先顺序,先入栈,如果栈顶的火车编号和所给出站顺序将要出站的编号一样。那么火车就出栈,直到栈里边所有满足出站顺序的火车都出站,否则就一直入栈。最后判断所有火车是否都出站了。若都出站,输出Yes,否则输出No。原创 2014-12-09 18:58:08 · 3244 阅读 · 0 评论 -
POJ5475 An easy problem【单点更新】
题目大意:有一个特殊的计算器,初始值 X = 1。现在有两种操作:1. 乘以 Y2. 除以一个之前乘过的数。每次操作之后,输出对 M 取余的值。解题思路:操作有 10^5 个,可以看作是有 10^5 个数字,他们的初始值都为1.每次操作对其中一个数字进行修改:1. 把第 i 个数字改成 y2. 把地 y 个数字改成 1,当作之前没有乘过。用线段树 sum[] 来计算乘积,然后每次输出 sum[1]。原创 2015-10-12 18:28:33 · 545 阅读 · 0 评论