随笔分类 - 算法
摘要:题目:在一个文件中有 10G 个整数,乱序排列,要求找出中位数。内存限制为 2G。只写出思路即可(内存限制为 2G的意思就是,可以使用2G的空间来运行程序,而不考虑这台机器上的其他软件的占用内存)。关于中位数:数据排序后,位置在最中间的数值。即将数据分成两部分,一部分大于该数值,一部分小于该数值。中...
        阅读全文
                
摘要:1. 二分查找容易死循环,注意 (low+high+1 )/2 , 以及 mid = high-1 或者 mid = low+12. 最小或者最大等极限情况要做特殊处理3.手工调试程序结束后一定要删除检测语句思路: 用线段树记录归并排序的过程,那么(1)可以在log(n)时间内查找到 任意数c 在区间(i,j)之间的 名次, 也就是区间内比c小的数的个数+1,(2)从而我们可以通过二分x来找到在区间(i,j)排名为k的数,注意满足此条件的数可能不止一个,举例 区间数列为{3, 7,7, 5} k=4那么满足排名3为的数有5,6,7, 显然我们要找的是7(1)过程的也需要二分查找,只需要记录比c
        阅读全文
                
摘要:学习了网上最常用的解法——归并树。所谓的归并树并不是什么新奇的东西,顾名思义,其实就是归并排序+线段树。把归并排序过程中的各区间排序后的结果,用线段树储存起来!对题目给定的区间,只要在线段树中查找组成该区间的各个子区间即可!——logN关键在于求出某个值在线段树各个子区间中,小于该值的元素个数,还是用到了二分,继续是logN。由于要求的是该区间的第k小元素,可以对整个排序完的数组进行二分查找,当某元素在该区间中排第k小,并且该元素属于该区间,即为答案。对排序数组进行二分查找,也是logN。耗时:2500ms+#include<stdio.h>#define N 100010stru
        阅读全文
                
摘要:线段树 相信对算法设计或者数据结构有一定了解的人对线段树都不会太陌生。它是能够在log(MaxLen)时间内完成线段的添加、删除、查询等操作。但一般的实现都有点复杂而线段树应用中有一种是专门针对点的。(点树?)它的实现却非常简单。 这种数据结构有 什么用?我们先来考虑一下下面的需求(全部要求在LogN时间内完成):如何知道一个点在一个点集里的大小“排名”?很简单,开一个点数组,排个序,再二 分查找就行了;如何在一个点集内动态增删点?也很简单,弄个平衡树就行了(本来平衡树比线段树复杂得多,但自从世界上有了STL set这么个好东东,就……^_^)那如果我既要动态增删点,也要随时查询到一个点的..
        阅读全文
                
摘要:1. 二分查找容易死循环,注意 (low+high+1 )/2 , 以及 mid = high-1 或者 mid = low+12. 最小或者最大等极限情况要做特殊处理3.手工调试程序结束后一定要删除检测语句思路: 用线段树记录归并排序的过程,那么(1)可以在log(n)时间内查找到 任意数c 在区间(i,j)之间的 名次, 也就是区间内比c小的数的个数+1,(2)从而我们可以通过二分x来找到在区间(i,j)排名为k的数,注意满足此条件的数可能不止一个,举例 区间数列为{3, 7,7, 5} k=4那么满足排名3为的数有5,6,7, 显然我们要找的是7(1)过程的也需要二分查找,只需要记录比c
        阅读全文
                
摘要:题意:给出一数组a,然后要求查询a[i..j]的第k大的数。算法:继续我的学习数据结构的步伐,之前学习了后缀数组,今天继而学习另一个有用的统计工具,归并树。实际上归并树,就是把归并排序的过程记录下来。也算是一个线段树吧,但是节点的记录了该区间[i,j]的排序后的结果。先不要考虑空间复杂度,如果可以在每个节点放有该区间排序后的结果,那么我们把查询的区间去查找,就是像线段树的查找一样,要查询的数k在各个区间中有多少个数小于k,然后相加起来,这样,便可以得到该区间中,k这个数有多少个数小于k。因此我们把数组排序后二分,便可以找到结果。归并树:刚才考虑到线段树不可能每个节点都存放排序后的结果,因为在每
        阅读全文
                
摘要:【题目描述】有n个数字排成一列,有m个询问,格式为:left right k 即问在区间[left,right]第k大的数据为多少?建图: 建树的过程比较简单,对于区间[l,r],首先通过对原数组的排序找到这个区间的中位数a[mid],小于a[mid]的数划入它的左子树[l,mid-1],大于它的划入右子树[mid,r]。 同时,对于第i个数a[i],记录在[l,i]区间内有多少数被划入左子树。最后,对它的左子树区间[l,mid-1]和右子树区间[mid,r]递归的继续建树就可以了。 建树的时候要注意,对于被分到同一子树的元素,元素间的相对位置不能改变。查找的过程中主要问题就是确定将要查找的区
        阅读全文
                
摘要:二分查找 + 线段树这里线段树就是query()函数。不懂线段树的童鞋先不要急,你们姑且把它看成是二分就行了。二分在这道题中是很重要的思想. 先初始化, b[]数组排好序就是a[0][], x=0, y=n-1. 我们先取中间的数num=a[0][mid], where mid=(x+y)/2 来测试, 我们得到num在b[lef...rig]中的排在[rankL, rankR)的位置(注意是左闭右开区间). 如果A. rankL<=k && k<rankR 那么数num就是所求的数; 否则根据下面更新x或y不断迭代.B.k >= rankR 那么num较小,
        阅读全文
                
摘要:POJ各题算法分类和题目推荐KMP算法: 2752、1961、2406二分图最大匹配:1274、2536、2239、1466、3041、2771、1469Kruskal和Prim: 2485、1251、1258、1861、3255、1679、1372、2031最大子段和: 1050、2593、2479DP: 1205、3452、1025、2059、2241、2663、2250、23922151、2018、1609、1157、1088、1745、1837、3211、12763624、1260、3267、1159、1952、1958、2033贪心:2325、3258、3122、3273、2393、
        阅读全文
                
摘要:题意:一个hotel,有n个连续的房间,开始时均无人住宿共有3种操作1 a b 从a开始连续b个房间全部旅客住宿 [a,a+b-1];2 a b 从a开始连续b个房间全部旅客离开 [a,a+b-1];3 查询最长连续空房间思路:线段树,记录每个节点,左边,右边各最多连续空房间lmax,rmax; 以及这个区间内最多空房间max#include<iostream>#include<cmath>using namespace std;#define MAXN 16001struct node{ int lmax,rmax,max; int left,right; int f
        阅读全文
                
摘要:线段树。题意是给出一个长为N的区间,不断进行三中操作:1.插入一个区间,所有被插入的地方都表示占有;2.删除一个区间,所有删除的地方都表示释放;3.询问整个范围内最长的连续的空区间的长度。很明显的线段树,可惜我想错了,以为入区间的最大值可以独立的从两个子区间中寻找,忘记了两个子区间合并后可能得到一个更长的区间,尝试好多数据都对,提交就是WA,看网上的做法跟我的差别很大,也没心情看。搁置了好几天,今天终于发现原来自己从开始就把算法想错了,而不是代码的问题,白查了那么久,理解还是不够深啊。#include<iostream>#include<string>#include&
        阅读全文
                
摘要:#include<iostream>#include<fstream>usingnamespacestd;structe{intl,r,cnt,cntl,cntr;intstate;};e tree[48001];intn,m;voidbuild(ints,intt,intp){inti,j,k;tree[p].l=s;tree[p].r=t;tree[p].state=-1;tree[p].cnt=tree[p].cntl=tree[p].cntr=t-s+1;if(s==t) return;else{k=(s+t)>>1;build(s,k,2*p);b
        阅读全文
                
摘要:题意:一个hotel,有n间连续的房间,现在有m组操作:type 1: '1, a, b': 第a个房间起的b个房间有旅客入住。type 2:'2, a, b': 第a个房间起的b个房间的旅客离开。type 3: '3': 问最长的连续空房间有多少间。思路:线段树。这道题很好的利用线段树递归的性质,加深了对线段树递归的理解。复习了一下延迟的操作,学会了与延迟操作相反的操作,即利用递归,在递归回来的时候,由于左右子结点性质的改变,即时对父结点信息进行相应的更改,这个要注意。源代码:(944K 3282MS)#include<iostream&
        阅读全文
                
摘要:unique()函数是一个去重函数,STL中unique的函数 unique的功能是去除相邻的重复元素(只保留一个),还有一个容易忽视的特性是它并不真正把重复的元素删除。他是c++中的函数,所以头文件要加#include<iostream.h>,具体用法如下:int num[100];unique(num,mun+n)返回的是num去重后的尾地址,之所以说比不真正把重复的元素删除,其实是,该函数把重复的元素一到后面去了,然后依然保存到了原数组中,然后返回去重后最后一个元素的地址,因为unique去除的是相邻的重复元素,所以一般用之前都会要排一下序。#include <iost
        阅读全文
                
摘要:/** * Accelerated C++ 笔记 **/sort()函数定义在头文件<algorithm>中,它把容器中的数据重新排序成非递减序列。我们之所以用非递减而不用递增是因为,容器中的某些数据元素可能会与其他元素相等。doublex;vector<double>numbers;typedefvector<double>::size_typevec_size;vec_szsize=numbers.size();while(cin>>x)numbers.push_back(x);sort(numbers.begin(),numbers.end
        阅读全文
                
摘要:摘要: POJ 1177 (线段树+离散化+扫描线),题目链接为http://poj.org/problem?id=1177在做本题之前,必须先了解什么是线段树和离散化,请看前一篇博文线段树(segment tree),里面对线段树和离散化的说明相对比较清楚了。对 ...POJ 1177 (线段树+离散化+扫描线),题目链接为http://poj.org/problem?id=1177在做本题之前,必须先了解什么是线段树和离散化,请看前一篇博文线段树(segment tree),里面对线段树和离散化的说明相对比较清楚了。对于这题,我们的思路步骤如下(代码和下面的文字解释结合着看):1.对于输入
        阅读全文
                
摘要:http://acm.pku.edu.cn/JudgeOnline/problem?id=1177#include<iostream>#include<algorithm>#define MAXN 10005using namespace std;struct segment{int L,R;int len,linenum,cover;// 以当前区间为根的树被覆盖的区间的总长度,// 以当前区间为根的树被覆盖的区间数目,当前区间被覆盖的次数,bool lcover,rcover;};struct line{//int start,end;//离散化之后竖边的两个Y值i
        阅读全文
                
摘要:POJ_1177 这个题目和POJ_1151基本思路是一样的,一些具体的思路可以参考我的那篇题解:http://www.cnblogs.com/staginner/archive/2012/02/20/2359396.html。 相比算面积不同的是,每次计算面积的操作需要改为计算周长的操作,同时周长可以分成平行于x轴的部分和平行y轴的部分分开来求。#include<stdio.h>#include<string.h>#include<stdlib.h>#define zero 1e-8#define MAXD 10010#define INF 10010in
        阅读全文
                
摘要:AtlantisTime Limit: 1000MSMemory Limit: 10000KTotal Submissions: 8189Accepted: 3228DescriptionThere are several ancient Greek texts that contain descriptions of the fabled island Atlantis. Some of these texts even include maps of parts of the island. But unfortunately, these maps describe different 
        阅读全文
                
摘要:这两天做了几个线段树的题目 与大家分享 欢迎补充难度系数 分为从1 到 5 (只对初学者有用 对大牛来讲 这些题的难度系数都是0..)http://acm.pku.edu.cn/JudgeOnline/problem?id=1151Atlantis 扫描线+离散化+线段树这是经典的扫描线求矩形面积交 很好过 没什么陷阱 如果头一次接触扫描线 那么难度系数大概算3吧 如果熟练掌握扫描线 难度系数为1难度系数 ***http://acm.pku.edu.cn/JudgeOnline/problem?id=1177Picture 扫描线+线段树扫描线求矩形周长的并 比求面积并难 线段树中的域要多考虑
        阅读全文
                
                    
                
浙公网安备 33010602011771号