数据结构
文章平均质量分 78
爱生活的程序猿
这个作者很懒,什么都没留下…
展开
-
poj2886
此题需要了解反素数的知识,之前不了解反素数还想把1e5以内的数的因子个数全部打表。。。。此题还有一点,就是线段树的更新操作,删除某节点,这可能是大家之前没有接触到得#include #include#include#includeusing namespace std;const int MAX=5*1e5+20;typedef struct{ char name[1原创 2015-08-09 19:42:35 · 386 阅读 · 0 评论 -
hdu1540(线段树区间合并)
这题是个很恶心的题,区间合并是比较裸的。但这题有的东西没有叙述清楚,题目上说的是一组数据,但测试数据却是多组数据,这题还有几点需要注意的,一是一个村庄可以被摧毁多次,当然如果你代码写得好,这点也是没关系的。我当时用b^=1来表示每次变化,但如果;连续摧毁两次,我的结果就相当于重建了,后来只有老老实实的写了。所以大家得注意到类似多多次摧毁的问题。后来都改过来了却一直1000多ms wa,我想可能是有原创 2015-09-05 22:28:24 · 937 阅读 · 0 评论 -
hdu3397(线段树区间合并)
是一道坑题。。。大致的思维很好想,只要你知道区间合并,这题的结点维护的变量略多,这题需要用到lazy标记。我用的是一个lazy,写了200行代码,好不容易把样例过了,结果wa。。。瞟了一眼别人的博客,发现大多数是用两个lazy标记,我那时候想到是我lazy这地方有缺陷,我也不想 用两个lazy,一来是麻烦,二来是我根本想不到为什么用两个lazy,套用别人的东西,下次 也 不会做。。就酱紫,调试了半原创 2015-09-04 17:30:37 · 462 阅读 · 0 评论 -
hdu1542(线段树+扫描线)
裸的扫描线,学习扫描线的题目。具体扫描线的原理我不讲了,我是看大神们的博客懂得,就算写也没大神屌。下面我给出我的代码,里面的注释是我认为比较重要的地方#include #include#include#includeusing namespace std;const int MAX=210;int N;double y[MAX];double sum=0;typedef stru原创 2015-09-05 22:37:47 · 416 阅读 · 0 评论 -
hdu3308(线段树,区间合并)
刚开始看到题目时吓到了。。。要求上升子序列,以为是道神题,但仔细一看原来是连续上升子序列,果断变为low题了。在网上看了一些大神的代码,感觉自己的代码简洁了不少,以前学c的一些小知识点也回顾了一遍,继续奋斗!#include #include#include#define lt(a) a<<1#define rt(a) a<<1|1#define md(a,b) (a+b)>>1usi原创 2015-09-04 17:37:46 · 348 阅读 · 0 评论 -
poj2528(线段树区间更新)
这题是典型的线段树区间更新,不过有一个点需要注意,在建树之间需要把数据离散化,因为数据范围过大,直接建树会超内存,不信可以试试这里首先讲下如何把数据进行离散化。原创 2015-08-17 23:09:52 · 268 阅读 · 0 评论 -
hdu1828(线段树+扫描线求周长)
这题不错,可以更加深入的了解线段树扫面线算法,大家之前可能做过扫描线求矩形面积,但因为求面积的某些局限性,一些细节不用写到就可以a,但求周长不行。首先,介绍下求周长的思路,从左往右在每一次插入一条边后,周长并的累加值==新增的横边+新增的竖边。我们可以发现,插入一条边之后,新增的横边的树木等于区间内连续线段的数目*新增横边的长度,新增的竖边等于插入前后覆盖长度的差值。插入一条出边之后,其实等同原创 2015-09-07 23:22:53 · 2067 阅读 · 0 评论 -
poj3321
刚见到此题时,我认为此题和poj2352star可以用类似的模型,然后写了一个程序,结果wa了,后来又仔细读了遍题目,发现之前题目理解错误。这题难点在于把树映射到数组中,然而树节点的序号并不能达到要求,我们可以求出每个节点管理的左值和右值,这里可以用dfs实现。知道左值与右值,就可以很快得出这点所管理的苹果的个数sum(right)-sum(left-1)。有个难点在于如何dfs,因为一个根节原创 2015-08-06 10:48:08 · 614 阅读 · 1 评论 -
hdu4417(单纯裸划分树)
来源:http://acm.hdu.edu.cn/showproblem.php?pid=4417题意:给一些数,数中有重复的。还有一些询问,问的是[L,R] 区间内有多少个数小于h,有多次询问。一般的方法肯定很容易超时,那这题就想到了划分树,接触过划分树的同学可能都知道用划分树查询区间内排列第k的数,这里只需把查询换为数值为k。用一个num表示小于等于k的数的个数,当k大原创 2015-08-03 12:54:35 · 430 阅读 · 2 评论 -
hdu5372(树状数组)
开始看这题时以为是线段树区间更新,误以为和poj2528差不多,然后上手打了。。。到末尾时发现有个点不一样,那就是删除,还要恢复到之前的状态,这个不会了。又从树状数组入手,发现用树状数组很简单。这题的主要思想,求得左端点大于等于左端点的线段的个数,然后再求得右端点大于该线段右端点的个数,然后两数相减得出答案,用两个树状数组维护即得到答案#include #include#include#in原创 2015-08-17 23:15:01 · 467 阅读 · 0 评论 -
字典树模板(hdu1251)
真是不爽。。特么水的不能再水的题,g++#include #include#includeusing namespace std;char str[11];struct Trie{ Trie *child[26]; int num; Trie() { num=0; memset(child,NULL,sizeof(chil原创 2015-08-16 10:16:52 · 363 阅读 · 0 评论 -
ac自动机模板(hdu2222)
#include #include#include#includeusing namespace std;const int MAX=1e6+20;char str[MAX];struct node{ int count; struct node *next[26]; struct node *fail; void init() {原创 2015-08-16 10:19:34 · 314 阅读 · 0 评论 -
poj3268(线段树)
此题需要求某一区间内的出现最多次数的数的出现次数,此题有个好处就是它是非递减序列。题目的输入输出就让人想起了线段树。。。。每个节点需要保存三个值,一个是区间左边相同数的次数,一个数是区间右边相同数的次数,一个是最多出现次数的个数#include #include#include#include#define mem(a) memset(a,0,sizeof(a))using na原创 2015-08-09 19:45:45 · 365 阅读 · 0 评论 -
hdu3642(三维转二维扫描线)
比较有意思的一题,刚开始做这题的时候想到的low方法是扫描面,但这种肯定不对。。。想了一段时间,突然发现。。。枚举每个z点,就可以转化为二维上的问题。这题还有一点需要注意,不能简单的枚举每个z点,算每个面上的重叠面积,这点是错的,具体操作请看代码#include#include#include#include#define MAX 1200using namespace std;t原创 2015-09-17 23:31:41 · 526 阅读 · 0 评论