ACM 数据结构
文章平均质量分 57
嚜寒
盖士人读书,第一要有志,第二要有识,第三要有恒。
有志则不甘为下流;
有识则知学问无尽,不敢以一得自足,如河伯之观海,如井蛙之窥天,皆无识者也;
有恒则断无不成之事。
展开
-
UVA10523 高精度(2)+相乘、相加+注意进位和0的情况
1 题意。2分析。3代码一是面向过程,代码二是面向对象写法。代码一(来自小白菜又菜的代码,非常简洁,用于一个大数和一个int数的乘法、大数相加,相乘的代码告诉我们相乘的实质实际上就是一个数分别乘上另一个数的各个位,用数组保存,然后得到的数组从低位开始向高位滚动,满10进1。向其学习)#include #include #include #include using na原创 2016-11-07 21:55:35 · 272 阅读 · 0 评论 -
POJ1426 建议打表做该题/用数组模拟队列(比STL队列速度要快)
0)题意: 求一个数的(任意一个)倍数,并且这个倍数仅由0和1组成。分析: 深搜所有0、1组成的数,直到出现所求数的倍数。但0、1组成的数可能很大。 ①题目中说 The decimal representation of m must not contain more than 100 digits.看起来很吓人,结果证明只算lon原创 2016-05-18 21:21:35 · 671 阅读 · 0 评论 -
POJ1060 数组存储多项式+多项式乘法和取余,水
1 题意给出三个多项式f、g、h,求(f*g)mod(h),(最后一步mod,得到多项式除多项式的余数)。题目不是对多项式单纯地乘和取余的计算,而是进行了极大地简化,将多项式加法定义为,对应项的系数只有0和1,相加的项的系数是两者异或之和。2 分析。尽管不是单纯的多项式乘以多项式、多项式除以多项式,但过程与其类似,要理解多项式乘以多项式、多项式除以多项式的过程如何实现,附百度百科多原创 2016-11-09 20:54:02 · 953 阅读 · 0 评论 -
【留坑】UVA10810 求逆序对==求最少相邻元素交换次数 归并排序OR线段树OR树状数组
1 题意:给出一个数列,允许相邻元素进行交换,求最少交换次数。2分析:求最少交换次数,等同于求该数列中的逆序对数。 证明:先将最大的数与后面的数交换直到停止,交换次数=该数的逆序数,然后将次大数与后面的数交换直到停止,交换次数=次大数的逆序数,如此直到最小数,则总共的交换次数=整个数列的逆序对数。代码一:归并排序代码二和三,等复习完数再补3代码一:#in原创 2016-11-28 17:40:35 · 1637 阅读 · 0 评论 -
POJ2887 块状数组
1 题意给出一个长串,然后给出n个操作,操作有两种,在某个位置插入一个字符,或者查询第x个位置上的字符是什么2分析(1)快速输出第x个位置上的字符,像直接存储类数据结构中的数组就可以,但是难在插入一个字符时,后面所有字符都要动,所以不能用普通的数组;而如果用链表虽然能解决插入不超时的问题,但是因为是顺序存储类结构,所以不能很快的输出第x个位置上的字符。这里采用块状数组,数组原创 2016-11-12 20:03:06 · 433 阅读 · 1 评论 -
POJ2527 简化 · 多项式相除求余数
1 题意2 分析注意题目输入和输出都是从低次幂开始的。注意如果得到的余数和除数幂次相同也要继续除,知道余数的幂小于除数或者余数为0(整除)。代码一是3//假设多项式每次相除得到的商总是整数,对于此题肯定符合#include #include #include #include using namespace std;const int maxn=1e4+10;原创 2016-11-14 16:22:19 · 2521 阅读 · 0 评论 -
POJ1988 并查集(3)
1 题意2 分析3#include #include #include using namespace std;const int maxn=3e4+10;struct Node{ int all_number; int under_number; int parent;//s.t. bottom}node[maxn];void Ini()原创 2016-12-10 17:48:04 · 318 阅读 · 0 评论 -
POJ1330 LCA/给树的节点标记层数
1 题意,求LCA——Least Common Ancestors,最近公共祖先。2 分析代码二,先dfs将各个节点的层数标记上。代码一,标记一下数组。3 代码一,16ms#include #include #include #include using namespace std;const int maxn=10010;int parent[maxn]原创 2016-12-02 19:14:18 · 299 阅读 · 0 评论 -
【留坑】 POJ2503 注意输入输出&&几种数据结构的复习、比较(线性表建立的字典 || 树建立的字典_即Trie || hash || map)
1 题意2 分析(上限,3000ms)1)代码一,map,G++,1700ms~2500ms①注意map不能将char数组作为关键字或者映射值,除非重载②gets(temp)会读入空白行,内部是通过temp[0]=='\0'来判断,是不是空白行,如果是就不会输出,我们同样可以用这一点,来区别两组用空白行分割的输入。③因为map的未插入的key-值,其由于初始化而对应的值是n原创 2016-11-26 21:46:41 · 705 阅读 · 0 评论 -
POJ2003 RE到shi ,树存储的数据结构
1 题意2 分析3 #include #include #include #include #include using namespace std;struct Node{ string name; //char name[60]; Node* parent; list son; Node(){ parent原创 2016-12-05 16:18:58 · 331 阅读 · 0 评论 -
POJ3321 树状数组,多叉树转线性结构,经典基础题
1 题意对于一个多叉树的,有两种操作,在某个点上摘一个苹果或者生成一个苹果(每个点要么有一个苹果要么有0个苹果);输出某个点作为root的子树上的苹果之和(包括root)。2 分析将多叉树用邻接表存储下来,通过DFS将多叉树转换为线性结构并且记录子树所在区间,然后构造树状数组,进行改动和查询。3 #include #include #include #include u原创 2016-12-13 16:42:17 · 695 阅读 · 0 评论 -
POJ3349 hash _链接法
1 题意顺序、逆序、从任意一个位置开始6个数,只要长度和位置一一对应相同的两朵雪花,都认为是相同的。2 分析散列表,链接法处理冲突。学习:处理任意一个位置开始6个数的情况。是将6个数在数组里再复制一遍,然后从前面6个数开始分别往后连续数6个数即是不同的组合。3 挺慢的,2800ms+(4000ms)#include #include #include #inclu原创 2016-11-21 23:13:35 · 449 阅读 · 0 评论 -
POJ1182食物链 并查集 (向量偏移 讲解)
1 题意中文。2 分析关键理解两点:a. 集合不再是指同一类,该集合的root也不仅仅是普通意义(起标志作用的)的代表元;新的概念凭借这样一种观点:凡是出场过的角色,互相之间都有关系,不论关系是什么(吃?被吃?同一类?)都无所谓,只要有直接关系或者间接关系便放入一个集合,而一个集合的root,不单单起到该集合的标志性作用,而且作为一个集合中所有元素之间关系的桥梁。因此,该集合内原创 2016-12-08 18:42:43 · 530 阅读 · 0 评论 -
UVALive 3942 Trie+dp,白书P209
1Note:①node[maxn][27]、val[maxn],maxn应该远大于存放进该字典树的单词数量,因为Trie的叶子结点数量就已经等于单词数量了。(出现Runtime有可能就是因为数组不够大,程序越界了)②strlen()比较耗费时间,尽量减少它的使用次数,比如在insert()每一个单词时可以用,而在对于整个长字符串时用一次strlen()得到一个全局变量len即可(否则如原创 2016-10-09 17:41:11 · 326 阅读 · 0 评论 -
POJ1703 并查集(2) 向量偏移
1 题意2 分析输入数据比较大,多用了两个cin都会超时,用scanf()与getchar(),其中对于后者要注意使用前后会不会读入其他符号。然后看到别人的博客写了一句特判,n==2时一定是输出两人在不同帮派,这句确实在题目中提到了,不过之前没写也AC了,但还是补上吧。3#include #include using namespace std;const int m原创 2016-12-09 15:07:35 · 306 阅读 · 0 评论 -
UVa101-The Blocks Problem/STL-Vector的使用
取出指令共同点,减少重复代码利用STL中不定长数组vectorvector a;//也可以,这里a是构建了一个不定长一维数组,a[maxn]也可以,构建一个二维数组a.size() //a的长度a.push_back(b);//向a的尾部添加元素b,应该是不能加一串只加单个元素a.resize(h);//将a的第h-1后的元素删掉,in other words, 保留前h个元素原创 2015-12-05 23:18:35 · 339 阅读 · 0 评论 -
浅谈STL的set容器
关于set,必须说明的是set关联式容器。set作为一个容器也是用来存储同一数据类型的数据类型,并且能从一个数据集合中取出数据,在set中每个元素的值都唯一,而且系统能根据元素的值自动进行排序转载 2015-12-07 20:17:56 · 319 阅读 · 0 评论 -
浅谈为STL-迭代器
指针与数组指针与其它数据结构呢?比如说链表?存储空间是非连续的。不能通过对指向这种数据结构的指针做累加来遍历。能不能提供一个行为类似指针的类,来对非数组的数据结构进行遍历呢?这样我们就能够以同样的方式来遍历所有数据结构(容器)。迭代器(Iterator)是指针(pointer)的泛化,它允许程序员以相同的方式处理不同的数据结构(容器)。STL中有五种类型的迭代器,它们分转载 2015-12-07 20:37:17 · 296 阅读 · 0 评论 -
HDU5929 Basic Data Structure,ccpc,模拟双端队列(两倍大的数组从中间开始向两旁拓展)
1做题时:容易看出规律,最后一个0的后面的1的个数的奇偶性决定了输出结果,第一次超时后,想到应该记录最后一个0的位置即可,于是想用数组存储0的位置(太麻烦,应该用队列或者数组模拟的队列),同时依然用双端队列模拟全部1和0的操作,从而导致一直超时。重现赛后:看完题解后,领悟到模拟并不是单纯地将所有过程全部死板的模拟一遍,我们在抓住问题的本质(规律)时,应该去繁就简,只模拟需要的部分(去掉无效原创 2016-10-07 21:15:19 · 351 阅读 · 0 评论 -
POJ3067 树状数组 情景转化为区间求和
0) 题目大意: 小岛上东、西各有一列从北到南依次排列的城市,现在将东边与西边的指定城市之间建造高速公路(不同列之间的城市相连),要求给出交叉点个数(假设没有大于两条以上的道路会交于一点)。 转化: 随着连接的线段越来越多,交点个数应该只增不降,而输入数据给出的顺序已经是一个提示,我们假原创 2016-05-11 17:01:41 · 366 阅读 · 0 评论 -
HDU5443 线段树 + 裸 + 求任意区间最大值
0) 裸题,写的还不熟练,还不能一次写完不卡壳直接过。1)#include #include using namespace std;const int maxm=1000010;int a[maxm];struct Node{ int l; int r; int maxx;}node[maxm*3];void build(int i原创 2016-05-11 16:21:50 · 373 阅读 · 0 评论 -
POJ 2481 树状数组 区间覆盖(POJ2352 Stars 的变形题)(线段化点)
0)学会将题目情景转化为自己熟悉的结构或模型。题目大意: 每个奶牛有自己的一个区间,求每个奶牛的区间所覆盖的子区间个数(注意,真子集,相等的不算),按照输入的顺序输出。转化: 要学会将题目情景转化为自己熟悉的模型或结构上。把每个区间的左端x值作为点的x坐标,右端x值作为点的y坐标,就可以把所有区间转化为一个二维坐标图上的点集,而此时每个点左上方的原创 2016-05-09 20:30:00 · 1321 阅读 · 0 评论 -
POJ2352 Stars 树状数组 + 裸
1)为了避免出现0,保证从1开始,所以每次输入x以后,都先x++;观察得知输入的数据因为有y 、x一次递增的规律,所以利用这一特性,只比较x。#include #include #include using namespace std;const int maxn=32010;int star[maxn];int level[maxn];int Init(int x){原创 2016-05-07 20:24:50 · 375 阅读 · 0 评论 -
UVA12086 树状数组 + 裸 +单点重置
0)树状数组与线段树都适用于在一个连续数列中任意指定两个数求这两个数之间所有数之和的情景。而传统数组(共n个元素)的元素修改和连续元素求和的复杂度分别为O(1)和O(n),树状数组主要利用二分的思想构造伪树的结构,使修改和求和的时间复杂度均为O(logn)(线性结构只能逐个扫描元素,而树状结构可以实现跳跃式扫描),提高了效率。相对于容易理解但所占内存空间偏大的线段树而言(线段树的节点数原创 2016-05-07 20:21:24 · 529 阅读 · 0 评论 -
HDU1754 线段树 + 裸 + 单点更新求区间最值
1)线段树求某区间最大值,用到线段树的建立、单点更新、区间最值查询。第三道线段树入门题目,敲起来还是很不熟练。另外,scanf读入string很麻烦;用cin读取string方便一些;如果追求再稍微快的那么一点,用scanf读取char,但要注意是否需要在每次scanf读取之前,先getchar()看看有没有必要吃掉回车(windows下)。#include #include #inclu原创 2016-05-05 21:39:04 · 404 阅读 · 0 评论 -
POJ3264 RMQ问题 裸 线段树 OR ST算法
0)解决rmq问题,用线段树和ST算法,线段树O(logn)复杂度一般可以AC,ST算法是O(nlogn)预处理和O(1)的查询速度,一般情况下线段树快一些但如果查询量非常大,ST算法优于线段树。1)注意,NodeNum一般开3倍或4倍。如果对输出格式要求不是很多,那么用cout比printf快哦。线段树,O(logn)复杂度,2000ms(把最后cout改为printf就会3000m原创 2016-05-05 00:15:33 · 610 阅读 · 0 评论 -
HDU1166 线段树 裸 单点更新
1)#include #include #include using namespace std;const int maxn=50000<<2;struct Node{ int left; int right; int number; bool flag;}node[maxn];int a[maxn];int kase=1;void Build(int id,in原创 2016-05-04 23:47:54 · 307 阅读 · 0 评论 -
STL(map和二维map/hdu1263)
#include#include#includeusing namespace std;int main(){mapm;m["a"]=1;m["b"]=2;m["c"]=3;map::iterator it;for(it=m.begin();it!=m.end();++it)co原创 2016-03-17 18:44:37 · 5079 阅读 · 2 评论 -
结构体数组-sort自定义快排
1)#include #include //memser()#include //sort()//#include using namespace std;struct Num{ double x; double y;}Number[100010];bool cmp(const Num &a,const Num &b){ return a.x<b.x;原创 2016-03-08 18:54:39 · 3048 阅读 · 0 评论 -
uva11988数组模拟单向链表
1)#include #include using namespace std;const int maxn=100000+5;int next[maxn];int cur,last;//next[0]=0;//int cur=0;//int last=0;char s[maxn];int main(){ while(scanf("%s",s+1)==1){原创 2016-02-12 20:20:20 · 540 阅读 · 0 评论 -
UVA442栈
1)原题代码1#include#include#include#includeusing namespace std;const int maxn=103;struct sta{ int a; int b; sta(int a=0,int b=0):a(a),b(b) {}}z[maxn];stacks;//可以将结构体直接压入栈,而不是将结构体中某个变量原创 2016-02-03 15:20:29 · 390 阅读 · 0 评论 -
uva673-栈-(字符读取和清空缓冲区)
1)先上原题代码:#include #include #include #include using namespace std;int main(){ int num; scanf("%d%*c",&num);//%*c忽略下一个输入的字符,用于忽略回车,否则后面的getchar()会将缓冲区的第一个字符(“回车”)读入 stack z; whil原创 2016-02-01 20:41:10 · 523 阅读 · 0 评论 -
UVa156 map set vector/STL
map,vector,set都用了点......#include using namespace std;string tranfer(string data){ string data_copy; data_copy=data;//可以直接复制,也可以直接赋值string a=b; for(int i=0;i<data.length();i++){原创 2016-01-26 17:12:08 · 347 阅读 · 0 评论 -
【留坑】UVA246 模拟题,STL容器组合_deque&&(set判重 OR hash判重)
1 题意。2 分析STL用性能换来更强的兼容/方便,当需要判重的type比较复杂时,set.insert(),然后用set.find(),写起来方便一些。如本题,向其学习,代码一用了set。代码二依然用的hash。3 代码一#include #include #include #include //set have insert,not have push_bac原创 2016-11-26 15:31:03 · 368 阅读 · 0 评论