
ACM_数据结构
文章平均质量分 78
逍遥丶綦
这个作者很懒,什么都没留下…
展开
-
分块法 hdu1166 敌兵布阵
当然啦,这题最正规的方法当然是最标准的单点更新的线段树咯最近发现了分块法这一神器,正尝试水各种数据结构中(线段树,伸展树,主席树....),几乎是万能的(效率只慢了一点)优势在于1.占用的空间非常低.2.非常容易写3.对于比较复杂的维护和各种数据结构的镶套,能较好的处理缺点当然就是没有标准的那种数据结构块(一般的数据结构复杂度是O(nlogn),这个的复杂度原创 2015-06-16 00:54:45 · 1317 阅读 · 0 评论 -
表达式树 acmoj22049 计算表达式的值
传送门:点击打开链接思路:一个非常完整的有着16种操作符号的表达式计算,基本思路也是表达式树,可以看我另外一文章点击打开链接要注意的地方:1.符号非常多,别漏了或者弄混。2.注意有的运算符有2个,要多加点判断#include#include#include#include#include#include#include#include#include#incl原创 2015-09-07 18:48:19 · 1519 阅读 · 0 评论 -
单调队列 fzu1894 志愿者选拔
传送门:点击打开链接题意:3种操作:队列中加入一个人;队首出队;求队中权值最大是多少思路:运用单调队列来维护。其实单调队列中其实id也是有序的,所以队列出队只要看单调队列的第一个是否等于队首那个就行了。#include#include#include#include#include#include#include#include#include#include#in原创 2015-10-28 22:18:55 · 787 阅读 · 0 评论 -
单调队列 poj2823 Sliding Window
传送门:点击打开链接题意:有n个数字,有个宽度为k的窗口,从最左边向右边移动,每次都框住k个数字,依次输出这些框中的最大值和最小值思路:运用单调队列维护。一般deque我们都手动模拟,因为一般单调对列对时间复杂度要求都会比较高。一般令cur=rear=0,rear表示尾指针,其实这个指针是取不到的,也就是说左开由闭。当cur单调队列数字都是从队尾进,要求最值的时候一般都是在堆首取。原创 2015-10-28 21:15:52 · 764 阅读 · 0 评论 -
单调栈 poj2559 Largest Rectangle in a Histogram
传送门:点击打开链接题意:求最大长方形。思路:以前看训练指南上有利用动态规划的方法求最大子矩阵,但是空间复杂度和实现起来都比较麻烦利用单调栈来做这题,代码异常简洁明了。维护一个单调栈,从栈底到栈顶是单调递增的。每一次将一个数加入到栈中时,都要先看栈顶是否有数字大于等于这个数字,如果有就弹起,把这个数字的权值累加到准备加入到栈中的那个数字上去因为,弹出去的那些高度都比这个要高,所原创 2015-11-02 23:42:10 · 841 阅读 · 0 评论 -
线段树 hdu1542 Atlantis
最经典的一道面积并的问题了。要注意以下问题:1.可以按照y的扫描线从小到大排序,然后依次求出每两根扫描线的长度和之间差的距离,得到面积2.因为坐标值会很大,所以一般把坐标要离散化,然后去重,然后利用二分得到下标3.假如读入的时候是double类型,然后保存以后其实可以用==去判断是否相等,浮点误差只会在进行过加减乘除以后才会产生4.因为坐标值是点,然而我们应该按照区间段去编号,原创 2015-08-10 19:29:15 · 748 阅读 · 0 评论 -
单调队列 poj1821 Fence
传送门:点击打开链接题意:有K个工人,和长为N的篱笆,现在要给篱笆上色。每个工人坐在Si上,他能刷的最大范围是Li,且必须是一个连续子区间,而且必须过Si,他刷完后能获得Pi钱问如何分配,使得K个工人的总利润最大思路:先设出方程,设dp[i][j]表示前i个工人,前j个篱笆的最大获利那么就有dp[i][j]=max(dp[i-1][j],dp[i][j-1]);dp[i原创 2015-12-16 15:29:59 · 1943 阅读 · 0 评论 -
可持久性数组 bzoj3674 可持久化并查集加强版
传送门:点击打开链接题意: 强制在线操作,定义3种操作,查询两个点是否在同一集合,合并两个点,把状态恢复到之前的某个状态思路:利用线段树实现的可持久性数组,其实原理上就是线段树,那么是如何实现可持久性数组的呢。对于某次修改,就再造一颗线段树,但是这样明显效率和空间都会爆炸。因为我们其实有很多节点都是上一次剩下的,其实我只需要新建新添加的那条链上的节点即可。其他节点只需要直接接在以前原创 2016-01-03 19:38:24 · 2149 阅读 · 0 评论 -
贪心+map Codeforces583C GCD Table
传送门:点击打开链接题意:参照那个表格,,最后给出的n*n个那表格中的数字,是打乱的,求还原出是哪n个数字思路:可以发现,G表格中,正斜对角线恰好是ai,因为对自己的gcd就等于自己。那么也就是说所有的ai最后都会存在于n*n个数字中,进一步一想我们就能发现,最大的那个数字一定是A数组中的,因为gcd不可能比原数大。那么第二次我再选出最大的,此时这个最大的会与之前已确定的A数组中的会有gc原创 2015-10-17 20:18:33 · 1065 阅读 · 0 评论 -
莫队算法+哈希 csu1515 Sequence
这是中南第二届邀请赛的题目,当时还不懂莫队,,现在做起来感觉思路还是挺清晰的,可以用来当莫队算法的练习首先讲下莫队算法(也是逆天),是一种分块的思路(超逆天思维)它是一种离线算法,复杂度是O(m*sqrt(n)),m是区间范围大小,n是区间个数适用条件:如果知道[原创 2015-06-13 17:50:37 · 647 阅读 · 0 评论 -
栈 Codeforces612C Replace To Make Regular Bracket Sequence
传送门:点击打开链接题意:有4种括号配对,现在能把一种括号改变成另一种括号,但是不允许改变括号的开口方向。问最少的操作次数能把括号全部配对思路:运用栈去操作,如果是左括号,则压入栈,如果是右括号,看是否和栈顶配对,如果不配对就ans++,无论是否配对成功都弹出栈顶。如果途中栈空了也取栈顶,或者最后栈不为空,这些都是非法的,特判一下#include#include#include原创 2015-12-26 22:42:25 · 889 阅读 · 0 评论 -
后缀平衡树 nbut1653 String in the tree
传送门:点击打开链接题意:告诉你一棵树,每个节点有一个字母,然后要求分别输出每个节点到根节点这条路径上的不重复的子串个数。思路:因为是树形结构,我们就没办法用后缀数组搞了,必须要想办法能动态维护就好啦我们这里用后缀平衡树来做到动态维护SA首先我们要明确这道题的思路,每增加一个节点,根据后缀数组的知识我们知道,会多增加l-max(H[i],H[i+1])个子串,H表示高度数组,也就是原创 2016-02-12 17:18:50 · 1503 阅读 · 0 评论 -
kd树 hdu2966 In case of failure
传送门:点击打开链接题意:给n个点,求对于每个点到最近点的欧几里德距离的平方。思路:看鸟神博客学kd树劲啊点击打开链接kd树其实是暴力树,,真的。。它把一个平面划分成了很多个小平面。每次划分的依据是平面中按x排序的点的中位数或者是按y排序的点的中位数。建树的复杂度是稳定O(nlogn),但是查询就是大暴力了把平面分成很多个小平面后,相当于在平面上搜索剪枝。kd树原创 2016-03-29 15:43:43 · 1021 阅读 · 0 评论 -
整体二分 hdu5412 CRB and Queries
传送门:点击打开链接题意:两种操作,操作1查询区间第k大,操作2把位置x的值改成y。n,Q思路:整体二分。刚开始以为是在线段树上二分答案,没想到它竟然是对所有的二分答案,还是第一次见到这样的二分方法!说下整体二分的大概思路:首先,按照操作顺序,将所有的查询和修改操作全部加入到数组A中,然后去调用solve函数,L和R其实是数组A的指针,l和r是二分答案的范围之后,取l和r的中点原创 2016-03-31 17:40:59 · 607 阅读 · 0 评论 -
双向链表 csu1692 Vector Field
传送门:点击打开链接题意:有n(问最大能加速多少。思路:最好的方法就是先离散化一下,然后用双向链表来维护,复杂度能降低到O(n^2)不过当时太懒了,写了个set,双向链表的写法有空再补,先挖个坑#include#include#include#include#include#include#include#include#include#include#in原创 2016-03-14 00:24:39 · 1069 阅读 · 0 评论 -
表达式树+多项式模拟 fzu2215 Simple Polynomial Problem
传送门:点击打开链接题意:化简多项式。思路:先写个结构体,把多项式的乘法和加法重载好。然后直接套后缀表达式啊,或者表达式树啊,或者用栈写表达式解析啊,都是随意的下面这个是表达式树的写法。有一个要注意的地方是,在函数里面开数组,也是属于栈的空间,所以用G++提交的时候,要注意一下扩栈。#include #include #include #include #inclu原创 2016-04-14 18:09:59 · 734 阅读 · 0 评论 -
set codeforces567D One-Dimensional Battle Ships
题意:有一个长度为n的区间,现在有k个长度为a的东西,放在长度为n的区间上,且这k个东西没有重叠或接触的地方,也就是两两直接至少中间隔了一个空位现在Bob按顺序选择了许多个点,Bob每选择一个点,Alice都会撒谎说这个点没有被覆盖,问,Bob在选了哪些点后,能确定Alice一定在说谎,也就是,在第几个点的时候,可以确定这个点一定被覆盖了思路:ans记录上一次中区间内最多能放多原创 2015-08-08 15:42:47 · 828 阅读 · 0 评论 -
RMQ+二分 hdu5289 Assignment
求有多少个区间,区间中的最大值减去最小值首先初始化RMQ枚举左端点,右端点可以在哪些位置呢?对于如果R那么必然有s'>=s,所以,在区间[L,n]中选出右端点R尽量靠右,任然有s因为s具有单调性,所以而已用二分,求区间的极值可以用ST表,这题就可以过了#include#include#include#include#include#include原创 2015-07-21 19:15:06 · 1109 阅读 · 0 评论 -
分块法 CF551E GukiZ and GukiZiana
前段时间看的莫队算法,对分块法已经有所了解这次做完了这道题,感觉分块法就是逆天....题意:两种操作1 l r x表示区间[l,r]里的数都增加x2 y表示在区间[1,n]中寻找等于y的最大下标j和最小下标i,答案就是j-i,如果不存在就输出-1思路:把n个数分成sqrt(n)块,维护每一个块内部的数值单调递增每次1操作,设l在L块,r在R块,那么L原创 2015-06-15 01:38:31 · 926 阅读 · 0 评论 -
分块法 hdu4858 项目管理
一看到这题,首先会觉得非常像单点更新的线段树,但是却不怎么好操作然后应该往分块的方向去想因为只有m条边,所以所有点的度总和是2m,那么设度数>=sqrt(m)的点叫做重点,反之则是轻点那么重点的个数设A[i]表示该点的值,sum[i]表示该点周围相连的点的A[i]之和构造图的时候也有技巧,对于一条边(u,v)如果u是轻点,直接添加(u,v)这条边 //因为原创 2015-07-01 10:32:05 · 1246 阅读 · 0 评论 -
STL hdu1540 Tunnel Warfare
虽然这题在线段树的专题里面,,然而我并不觉得需要用线段树维护一个set和stack,set里面的数字表示被摧毁的村庄节点,stack里面存放的是被摧毁的村庄节点初始化,将0和n+1插入到set中,表示0和n+1村庄已被摧毁,,起到边界的作用D t 将t插入到set中,将t压入栈中,表示t已经被摧毁R 将栈的栈顶取出,并弹出,在set中删除对应的村庄编号Q t 在set中原创 2015-08-08 13:57:34 · 828 阅读 · 0 评论 -
hash hdu1247 Hat’s Words
题意:有多少个字符串,能恰好被另外两个字符串拼接而成一般查询某个字符串是否存在,,其实都能用hash水过去思路:枚举字符串,再枚举哪两个字符串组成它,看这两个字符串是否存在#include#include#include#include#include#include#include#include#include#include#includeusing na原创 2015-08-08 15:05:15 · 788 阅读 · 0 评论 -
树状数组 hdu1394 Minimum Inversion Number
树状数组写起来真短- -。。先利用树状数组求出原逆序对的个数比如第i个是A[i],那么就加上[A[i],n]区间内的sum和,然后再把A[i]更新成1然后怎么通过原逆序对推出它移动以后的逆序对呢我们来举例,假如A[1]为3,n为5,那么比A[1]小的,排在3后面的,有1和2,也就是A[1]-1现在我们把A[1]移动到了最后,所以以前有A[1]参与的逆序对就没了,变成了ans-(原创 2015-08-08 14:57:01 · 842 阅读 · 0 评论 -
树状数组 hdu2838 Cow Sorting
一看到这个就应该能想到逆序对把。。。。我的第一想法就是,假如我们现在在考虑第i个数字,我们需要统计在[1,i-1]里面有多少个数字大于A[i],以及[1,i-1]中大于A[i]的数字之和大于A[i]的数字之和相当于X的积累,[1,i-1]里面有多少个数字大于A[i]记为m,第i个数字至少要交换m次,m*A[i]就相当于Y的积累然后再全部积累一下,,这题就做完了#include#i原创 2015-08-09 21:15:17 · 938 阅读 · 0 评论 -
树状数组 hdu2492 Ping pong
如果是枚举参加比赛的人,,那么枚举起来就非常的复杂了如果是枚举裁判,,题目会变得简单很多假如裁判是第i个人,那么参加比赛的肯定分别在i的左边和i的右边那么我就可以统计[1,i-1]这个区间内有多个人的rank小于等于i,[i+1,n]这个区间内有多少人的rank大于等于i,两者相乘,就是左边小于等于右边大于等于的情况在考虑[1,i-1]这个区间内有多个人的rank大于i,[i+1,原创 2015-08-09 21:09:39 · 785 阅读 · 0 评论 -
树状数组 hdu2227 Find the nondecreasing subsequences
题意:问不下降子序列有多少个思路:用树状数组维护嘛。。假如树状数组节点i表示的是以A[i]结尾的不下降子序列有多少个,记为F[i]那么我们,求A[i]的时候,相当于在[1,i-1]中找到这种动态规划的思想,只是用树状数组去优化了而已然后因为A[i]范围非常大,,所以需要先排序一遍,然后二分用对应的下标去操作#include#include#include#include原创 2015-08-09 21:22:14 · 785 阅读 · 0 评论 -
线段树 fzu2187 回家种地
一道很经典的面积并问题。和普通的面积并相比,这个的面积并求的是只覆盖了一次的答案。相对于普通的来说,就是求cnt==1的长度,而不是求cnt>=1的长度而已我的想法是用S1维护cnt>=1的长度,S2维护cnt==1的长度其他地方和普通的面积并一模一样,只是在push_up的时候稍微多了对S2的维护而已#include#include#include#includ原创 2015-08-10 19:19:01 · 812 阅读 · 0 评论 -
线段树 poj2482 Stars in Your Window
不得不佩服出题的,,这篇情书写的真是真情实感啊→_→→_→然而突然笔锋一转那么问题来了人都吓蠢。感觉这题出的非常好,也是一个十分经典的一个类型。就是如何选取一个长和宽是确定的矩形使里面的权值最大我们想到扫描线的时候,之前做的题目都是有线段的,但是这里好像找不到扫描的线段了,一下子不知道从何下手如果把这题稍微转换一下,,题目就会变得非常简单..假如点P(x原创 2015-08-11 22:49:18 · 927 阅读 · 0 评论 -
二维线段树 poj2155 Matrix
二维线段树,就是在一维线段树的基础上,把每个区间节点换成了另一颗线段树而已也就是树中套树每个节点访问的时候,都要对第二颗树进行一次查询,每次查询O(logY)对于第一棵树查询要查询第二棵树logX次,故总的复杂度是O(logX * logY)#include#include#include#include#include#include#include原创 2015-07-18 22:12:53 · 919 阅读 · 0 评论 -
表达式树 csu1655 文本计算器
传送门:点击打开链接题意:计算表达式,其中里面含有加减乘除括号如果里面没有括号,那么使用栈简单维护一下即可但是如果里面有括号了,或者有更复杂的运算符号,那么推荐使用表达式树来做其实表达式树构造起来并没有想象中的那么麻烦,构造好之后直接分治算出答案即可表达式树的核心思维就是找同优先级的最后一个运算符的位置,然后按照优先级递减顺序去考虑即可#include#inclu原创 2015-08-27 13:52:15 · 1598 阅读 · 0 评论 -
栈 hdu1237 简单计算器
用栈来处理简单的表达式非常好,但是比较复杂的表达式就有些不适用了如果符号是+,-直接压入栈,符号压入的时候改变符号如果是* / 后面一个数字是x,取出栈顶,设为y,然后运算x,比如y=y/x,或者y=y*x再把y压入栈中最后把栈里面的全部取出加起来,就是答案了#include#include#include#include#include#includ原创 2015-07-21 15:10:32 · 826 阅读 · 0 评论 -
栈 poj1068 Parencodings
我认为是一道很值得做的栈的题目告诉你两种标记括号的方式第一种:第i个 ) 左边的 ( 数量第二种:第i个)与跟它配对的(的中间,有多少个已经配对的括号对,记为x,那么第i个)标记为x+1题目告诉了第一种标记方法,求第二种很容易通过第一种标记方法求出 括号串重点是如何求第二种,我是这样想的用栈维护左括号与跟它配对的右括号中已经配对的个数原创 2015-07-21 15:24:14 · 767 阅读 · 0 评论 -
栈+括号配对 51Nod1478 括号序列的最长合法子段
传送门:点击打开链接题意:给一字符串只有括号,问最长合法子串的长度是多少,并输出这样的长度的子串有多少个。思路:啊。。我发现这种括号配对的题我总是处理不好。一开始想到了一种比较脑残的方法,首先(代表+1,)代表-1,我们维护前缀和s,然后我们用单调栈来维护最左端的满足[x,i]所有前缀和都>=s。然后,我们并不能一直扩展到最左边,我们还应该记录前缀和等于s且后一个字符是(的位置。因原创 2016-05-04 23:15:42 · 2186 阅读 · 0 评论