![](https://img-blog.csdnimg.cn/20201014180756927.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
数据结构
文章平均质量分 79
qhpeklh5959
哈工程小白,两个月前正式投入算法学习
展开
-
spoj375 Query on a tree 树链剖分
题目大意链接请点我给一棵树,有两种操作,一种是改变某一条边的边权,一种是询问某两个结点间的路径的最大值解题具体思路参见2009年集训队漆子超的论文《分治算法在树的路径问题中的应用》树链剖分裸题,无奈昨天一直TLE,非常怨念,今天重写了一发,居然A了,虽然也不快,3.89s感觉我用的姿势应该是能看得下去的……CODE#include #include #inclu原创 2014-06-04 23:42:08 · 565 阅读 · 0 评论 -
POJ2912 Rochambeau
题目链接:http://poj.org/problem?id=2912这道题让我略显纠结了,因为要找哪个是裁判,我YY了好几种想法,但是最终结果都是一个混乱,不过最终找到了这个解法。。其中有一个是裁判的话,那么这个裁判的存在一定会导致这里面的关系出现混乱,因为弱国没有裁判,那么三组人非常和谐,因为他们三组人出的东西都是一样一样的,而裁判出的东西是非常随意的,一会儿这个一会儿那个,所以如果裁原创 2013-01-03 02:24:16 · 449 阅读 · 0 评论 -
HDU2795 Billboard
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2795题意就是给一个h*w的矩形,往上面放n个高度为1宽度任意的条,优先选择放在左上方,对于每一个条,问放在了第几行。题目中h给的范围是10^9,但是实际上不需要那么大,n是多少,h最大也就是多少,最多的情况就是一行贴一条,所以h的范围实际上是200000,这样显然就没有那么虐心了。。每一个结点原创 2013-01-09 23:15:36 · 444 阅读 · 0 评论 -
ZOJ1610 Count the Colors
题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=1610貌似线段树的区间染色是一个非常常见的题型吧,但是不得不说。。我昨天刚刚碰到,而且统计每一种颜色占了多少个不连续区间的时候着实不会写,表示前面把树建出来和更新的步骤都是纯我自己写的,就是查找颜色个数那一步。。。不得不参考了,最后弄明白了。如果一个区间没有原创 2013-01-15 18:55:05 · 395 阅读 · 0 评论 -
Codeforces Round#170(Div 2)C
题目链接:http://codeforces.com/contest/278/problem/C能够互相交流的放到同一个集合里面,最后有多少个集合,就需要花集合数目-1的钱,因为一个集合中只需要有一个人学会另外一个集合中的任意一个人回的任意一门语言两个集合的人就可以互相交流。#include #include #include #include using namespace st原创 2013-03-01 20:19:39 · 453 阅读 · 0 评论 -
POJ3667 hotel
题目链接:http://poj.org/problem?id=3667线段树区间合并的入门题,区间合并和就是求什么最长连续什么什么的,所以说需要记录三个值,左起向右最长长度,右起向左最长长度,还有当前区间总最长长度,当前节点的总最长连续长度可由它的左子树和右子树推知,讲的话太麻烦……代码把#include #include #include #include using names原创 2013-03-28 18:48:53 · 631 阅读 · 0 评论 -
HDU3397 Sequence Operation
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3397这道题是一个我认为非常非常麻烦的题,操作非常多,而且要打两个懒惰标记,并且懒惰标记有优先级之分,当一个节点收到一个覆盖标记的时候,取反标记就应该立即消失,这是一个麻烦,另外一个麻烦就是一个结点需要维持七个变量以满足本题的操作和所求。区间合并 的基本思想不用赘述,下面有一个成形的代码(貌似有bu原创 2013-03-29 22:29:29 · 579 阅读 · 0 评论 -
POJ3321 Apple Tree
题目链接:http://poj.org/problem?id=3321乍一看不会做,仔细一看感觉是线段树,但是怎么用线段树做这是一个问题。对于每个节点先序遍历,求出来每一个节点的管辖区间,然后就是该怎么做就怎么做……单点更新+区间查询,如果求出来取件貌似还比较水,就是那个区间不太好搞定……尤其对于我这种不怎么写深搜的渣渣……应观众要求,还要发一个树状数组版本……//线段树#inc原创 2013-04-16 23:26:12 · 666 阅读 · 0 评论 -
POJ2750 Potted Flower
传送门这道题是线段树+动态规划??我看不见得,就是一个线段树区间合并求动态最大连续子串和,但是说实话这道题还是不那么简单的。不过思想就是基本的区间合并思想,每一个节点维护七个值,最大连续子串和,最小连续子串和,区间总和,左起最大连续子串和,右起最大连续子串和,左起最小连续子串和,右起最小连续子串和,七个值都维护出来以后,思想就是简简单单的区间合并思想(简单么。。)#include #原创 2013-05-13 12:31:12 · 840 阅读 · 0 评论 -
HDU3038 How Many Answers Are Wrong
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3038题目和POJ那几道题类似,都是并查集向量偏移来做,关系也比较好推导,p[x].r表示的是x与根节点的差,下面就是推导关系了附AC代码:#include #include #include #include #include #include using namespac原创 2013-01-01 18:33:20 · 396 阅读 · 0 评论 -
POJ1456 Supermarket
小贪心,暴力过得,我自己都没想到……还以为要用并查集优化呢#include #include #include #include #include #include using namespace std;#define N 10010struct data{ int d, v;}a[N];bool f[N];int cmp(data a, data b){ re原创 2012-12-31 22:54:12 · 320 阅读 · 0 评论 -
POJ2823 Sliding Window单调队列
题目链接题目大意给定一个长度最大为100w的序列,求这个序列中每三个相邻元素的最大值,从左到右输出。解题思路很多同学说是线段树,的确线段树能解,但是对于这种比较有序的查找,单调队列的选择更好……实际上这道题就是单调队列的入门题……CODE#include #include #include #include using namespace std;const in原创 2014-03-11 17:44:03 · 631 阅读 · 0 评论 -
POJ3416 Crossing
题目链接题目大意平面上给N个点,有M组询问,每组询问是给定一个坐标中心,水平垂直作出两条坐标轴,求第一象限+第三象限点的个数减去第二象限+第四象限点的个数的绝对值。解题思路N和M的范围非常大,所以采用离线处理的方法,一次性就把所有的答案计算出来。考虑下,如果把所有点按照x坐标排序,然后把所有询问按照x坐标排序,那么当我们处理某一个询问的时候,在这个询问的点左边的所有点我们是可以原创 2014-02-17 06:29:00 · 654 阅读 · 0 评论 -
ZOJ3633 Alice's present 线段树离线 || 主席树在线
题目大意题目链接给一个长度为N的序列,有M个询问,每次询问区间内的数是否全都不一样,如果全都不一样就输出OK,如果有重复的就输出从右到左第一个重复的数。解题思路主席树在线非常直观,每一个数对应一个历史版本,然后询问的时候询问那个区间对应的线段树里面有多少个元素,如果最大值是1就表示OK,否则的话就输出最右的非1,对于位置做做处理就行。线段树离线就不太好办了,由于我前几天刚做完杭原创 2013-11-13 15:51:42 · 664 阅读 · 0 评论 -
HDU4777 Rabbit Kingdom 树状数组
题目大意题目链接杭州现场赛的H题……题意是给定一个长度为N的序列,然后有M个询问,每个询问是询问L到R内有多少个数和其他所有的数都互质解题思路首先,对于这个序列中的每一个数,我们都可以求出来在这个序列中与它相邻且互质的连续区间,然后离线处理一下询问具体的处理方法就是,求出来所有的数的所有的互质范围有多少个包含当前询问的区间,减去所有数的前半范围到当前位置i-1的数有多少个包原创 2013-11-11 04:06:47 · 1109 阅读 · 0 评论 -
BZOJ1208 宠物收养所
题目链接题目是中文描述,题意也就不赘述了实际上我们是动态维护两个集合,对于一个集合,当进入一个新的数的时候,在另一个集合的已有的数中找一个和它最接近的,然后把这个两数取出来,计算绝对值。数据已经保证每一个集合里面的每一个数都是不一样的,那么这道题就简单了,我们只需要维护两棵平衡树,我选择的是喜闻乐见的Treap……那么某一个集合进入一个新数的时候,我们只需要询问另外一个集合是否为空原创 2013-11-12 21:36:17 · 636 阅读 · 0 评论 -
HDU2665 Kth number 可持久化线段树
题目大意题目连接无修改区间第K大数解题思路第一次实现了主席树,其实还有两种做法,一种是划分树,WJMZBMR说它是时代的眼泪了,于是我也没想……一种是线段树套平衡树……拜托没必要,这道题又没有修改……所谓主席树,就是可持久化线段树,也就是说我们每插入了一个新的元素,就创造了一个新的结点,这样下去,线段树所有的历史版本我们就都能保存下来。然后考虑一下线段树相减,两棵线段树原创 2013-11-11 18:12:15 · 753 阅读 · 0 评论 -
POJ1182食物链
这道题是我学数据结构开始敲的第一道题,并查集,留作存目。这道题体现了一些问题,是我不知道的,也是我犯二了,竟然没想到过用类似于边权的东东来表示并查集中各个元素之间的关系的区别,不过还好了,现在转过来这个弯儿了。这道题,所有的物种之间有三个关系,平等,吃与被吃,那么这三个关系可以分别用0,1,2来表示,如果遇到的两个生物从来没有处理过,或者说有一个没有处理过,那么这句话一定是跟前面的所有真话没有原创 2012-12-27 23:19:23 · 370 阅读 · 0 评论 -
POJ1308 Is It A Tree?
题目链接:http://poj.org/problem?id=1308大意就是给一些点的指向关系,最后问能否组成一棵树。用并查集写了,每次给的两个点不在相同集合,就合并,合并一次相当于多增加了一条边,所以在合并的时候记录一下边数,如果合并过程中出现了环,那么说明不是一棵树,如果之后点数与边数加一不相等,也不是一棵树,所以需要记录点的个数,我用的是string类,每次find一下,最后求st原创 2012-12-31 05:19:56 · 503 阅读 · 0 评论 -
HDU4614 Vases and Flowers
点此转到题目前些天身体生病,再加上一些琐事,多校联合赛就这么没有做上,最近几天才恢复了刷题的进程,然后就简单浏览了一下多校的题,发现此题是一个赤裸裸的线段树,说起来虽然我前些天一直在努力地搞着图论里面的连通分量,这些天在搞SBT和佳哥的最短路题,好久没写线段树了,不过好歹线段树是我写得最久的了。。可是刚上来的时候被题坑了一下,怪我自己时间长没读题……然后现在把完整版代码献上。#includ原创 2013-08-01 02:35:48 · 1023 阅读 · 0 评论 -
UESTC1425 Another LCIS
题目链接题意没什么好说的,就是成段更新,然后求最长上升子序列,这次不同的是线段树上面加了两个域,一个是区间左端点,一个是区间右端点,用来处理合并条件,其他的都非常好说,就是传统的区间合并。#include #include #include using namespace std;#define lson l, m, rt << 1#define rson m + 1, r,原创 2013-09-12 21:15:08 · 4412 阅读 · 0 评论 -
POJ3580 SuperMemo
遗世独立的理想乡一道裸的splay题,对我来说比较有纪念意义,毕竟是第一次上手splay,最开始用的是红书的模板,倒是功能很齐全,但是略显麻烦,所以就换成了silver__bullet的模板,发现简单多了,估计过段时间就能裸敲了,而且,等我熟悉代码的机制以后应该可以往上加一些功能了吧,下一步应该就是treap,主席树,块链,树链剖分之类的东东了吧……#include #include原创 2013-09-10 19:31:14 · 715 阅读 · 0 评论 -
HDU3308 LCIS
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3308线段树单点更新+区间合并,特殊的地方就是合并的时候考虑两个相邻的数是否符合条件,判断一下再决定是否合并#include #include #include #include using namespace std;#define lson l, m, rt<<1#define原创 2013-03-30 22:54:55 · 704 阅读 · 0 评论 -
Codeforces Round#179(Div 2)C Greg and Array
题目链接:http://codeforces.com/problemset/problem/295/A我果断想错了时间复杂度,所以就没敲出来。有两种解法,一种是线段树,两棵线段树,一棵维护每种指令用了多少次,一棵维护每段被怎么更新,时间复杂度都是nlogn级别的,可是我算错了五个数量级,昨天晚上比赛没敢写……另一种方法是扫描法,O(n)级别,很简单,编码复杂度也比线段树解法小得多。原创 2013-04-12 11:09:23 · 979 阅读 · 0 评论 -
POJ2777 Count Color
传送门线段树喜闻乐见的区间染色问题,一个主要的问题就是要询问一个区间内有多少种颜色,乍一看,其实不怎么好做,但是仔细一看,仅仅只有三十种颜色,果断的状态压缩走起,我们可以用1代表第一种颜色,2代表第二中颜色,4代表第三种颜色,8代表第四种颜色,以此类推,这样的话如果两个区间的颜色不一样,按位或一下就好说了。然后我们查询的时候只需要询问查询结果的二进制位里面有多少个1就行了。#include原创 2013-05-03 13:34:44 · 614 阅读 · 0 评论 -
HDU1272 小希的迷宫
传送门这道题纯属是当初想少了,今天报仇的时候是当成新题来做的,考虑到它给的点的编号不一定是哪儿的,所以我们需要遍历十万个点,同事还得记录下来他给你了几个点,非常狗血……不过用并查集还是比较好弄得。其实还有一种更加节省时间复杂度的写法,只不过实在是懒得改了,上别的地方报仇了该#include #include #include using namespace std;const in原创 2013-04-17 18:23:57 · 586 阅读 · 0 评论 -
一道神奇的二分题
前些天从顾森大大的博客里面看到一道题,题目描述是这样的,给定一个未知的序列,序列中每一个数都是不一样的,然后给定一些形如a[x]到a[y]的最小值是x的命题,求第一个出现矛盾的命题。这道题怎么做呢?很显然我们需要判断出怎么表示这个矛盾,首先考虑一下,如果有这样两个命题,a1到a5的最小值是3,a2到a6的最小值是4,首先,我们已经明确了1到5这个区间内一定有一个3,2到6这个区间内一定有一个4转载 2013-05-14 21:37:24 · 781 阅读 · 0 评论 -
Codeforces Beta Round #19 D Points
通往题目维护点的方式非常简单,就像是奶牛那道题,二维转一维。坐标离散化是必须的,用线段树来维护y坐标的大小关系,然后把x坐标当成区间,也就是说,我们是把x坐标当成了线段树的区间,y坐标当成了线段树的权值,这样的话就可以维护某一个x坐标上y坐标最大的点是多少。然后插入或者的时候直接二分出来x的位置,然后插入或者删除就行了,查询的时候让我稍稍拐了点儿弯儿,实际上就是用查询的点的x坐标定位线段树原创 2013-08-30 22:36:57 · 623 阅读 · 0 评论 -
HDU4533 威威猫系列故事――晒被子
题目大意转向题目在坐标系里面给定了N个矩形,有M次询问,每次询问输入一个t,询问的是从(0,0)到(t,t)范围内的矩形的面积(重叠也算,不是矩形面积并)解题思路这道题很容易让人联想到二维的做法,但是我们一看数据范围,发现是20W,明显无法满足空间限制,那么应该怎么办呢?首先,矩形是无更新的,这给我们了非常大的空间,那么我们就可以想办法得到每一个位置的函数表达式既然原创 2013-11-06 19:59:16 · 654 阅读 · 0 评论 -
Codeforces Round#99 E(Div2)
遗世独立的理想乡题意不赘述了……大体思路就是用线段树成段更新来维护每一个位置的存活概率,然后再用单点查询回来计算期望就行了,裸题。#include #include #include #include #include using namespace std;#define lson l, m, rt << 1#define rson m + 1, r, rt << 1 |原创 2013-09-07 10:40:31 · 731 阅读 · 0 评论 -
POJ2481 Cows
题目链接:http://poj.org/problem?id=2481我感觉这道题给那个那个差的比较就是坑爹的……我按着差写了大半天结果WA了个各种惨啊……好吧,这道题是按照权值建立线段树,意思就是把每一个点加入到它应有的大小范围内,线段树上面每一个点维护的是该区间内有多少个点,这样很容易就能查出来比某一个元素大的元素有多少个。而且,还得先对所有的点排序,主排序应该是把s从小到大排序,当s原创 2013-03-19 20:45:17 · 668 阅读 · 0 评论 -
POJ2528 Mayor's posters
题目链接:http://poj.org/problem?id=2528线段树比较基础的题目,比较捉急的就是离散化,离散化就是将大的区间映射到小的区间中,具体的看代码吧,这个是傻崽大神的代码,本菜的话决计写不出来这么巧妙的代码,不过不得不说,这次受益匪浅,以后我想我会记住这些东西……#include #include #include #include #include #incl转载 2013-03-08 20:47:00 · 597 阅读 · 0 评论 -
Codeforces Round #200 (Div. 1)D Water Tree
点击打开链接题意就是给一棵树,三种操作,操作1是把某一个结点v和它的所有的孩子结点全都变成1,操作2是把一个结点和它的祖先结点全都变成0,操作三是询问某一个结点和它的儿子结点什么的是不是都是1显而易见可以用线段树来维护,首先深搜出来结点的序列作为一个线性序列来维护。对于操作1,非常简单,把进入结点时间和出结点时间当做是一个区间进行覆盖就行。对于操作2,麻烦了,我们无法做到快速地找到原创 2013-09-26 01:52:10 · 671 阅读 · 0 评论 -
FZU2105 Digits Count
题目大意转向题目给定一个长度为N的序列,有M次操作,操作有几种:AND opn l r表示让l到r区间内所有的数与opn相与,OR opn l r表示让区间l到r内所有数与opn相或,XOR opn l r表示让区间l到r内所有数与opn异或,SUM l r表示求l到r区间的所有数的和解题思路我们的难点非常明显——怎么对这些数进行操作,因为在我们的感知内,位运算并没有加法结合律。原创 2013-11-05 21:19:39 · 514 阅读 · 0 评论 -
POJ1988 Cube Stacking
题目链接:http://poj.org/problem?id=1988这道题当指令是M的时候,就是并查集的合并工作了,C的时候自然就是查找,但是麻烦就是怎么去弄明白那个x下面到底有多少个元素,而且它是整列整列的弄的,所以需要找个东西标记一下。用一个域u标记元素x的上面有多少个元素,用一个域d标记元素x的下面有多少个元素,合并的时候只要更新这两个域内的值就行了,那么对于每一个查找指令,答案就原创 2012-12-31 00:59:22 · 340 阅读 · 0 评论 -
VIJOS P1034 亲戚
#include #include #include #include #include #include using namespace std;#define N 5010int p[N];int find(int x){ return p[x] != x ? p[x] = find(p[x]) : x;}int main(){ int n, m, q; int原创 2013-01-03 22:26:27 · 453 阅读 · 0 评论 -
HDU1754 I Hate It
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1754两道题过后,我发觉线段树单点更新裸写法我已经能写个差不多了,继续膜拜notonlysuccess大神再做,再做,直到形成了我自己的模版深深刻在我脑子里为止!!#include #include #include #include #include #include usin原创 2013-01-08 23:11:24 · 329 阅读 · 0 评论 -
POJ2828 Buy Tickets
#include #include using namespace std;#define lson l, m, rt << 1#define rson m + 1, r, rt << 1 | 1const int maxn = 200100;int sum[maxn << 2], id, pos[maxn], val[maxn], ans[maxn];void PushUp(int原创 2013-01-11 00:49:20 · 419 阅读 · 0 评论 -
POJ2352 Stars
题目链接:http://poj.org/problem?id=2352既然题目中说Y坐标是升序给出,那么只需要维护到当前结点的小于X的值,这样很快能求出来所有的等级,然后就balabalabala……#include #include #include #include #include #include using namespace std;#define lson原创 2013-03-01 20:23:12 · 435 阅读 · 0 评论 -
POJ2985 The k-th Largest Group
题目链接:http://poj.org/problem?id=2985并查集合并小组,这个自然是不用说的,主要的问题是怎么求第K大值。首先,线段树每一个结点存储的是组内元素的个数区间内有多少个组,初始化的时候所有的组中都是一个元素,所以当区间左端点为1的时候,结点的值为n,然后每次合并,原有小组的空间内结点值-1,合并后的新组空间内结点值+1,线段树这么维护完了以后,询问过程中,如果右子树原创 2013-03-04 08:24:24 · 480 阅读 · 0 评论