摘要: 此题和普通的线段树题相比,最大的挑战在于区间太大,如果一开始就建立一个完整的线段树,空间太大。所以,先只建立根节点,每来一组数据,用普通的线段树查找方法沿根节点查找,如果此组数据的子树不存在,则建立子树。最后递归删除线段树。结果为:15308kB80ms如果最后不删除树,时间所减少,空间增大。为:20324kB60ms#include #include struct InTree{ int l,u; InTree *left,*right; int color;//-2表示该区间是混合色或者还未涂色 InTree(int low,int upp){ ... 阅读全文
posted @ 2012-10-19 22:15 moonswap 阅读(210) 评论(0) 推荐(0) 编辑
摘要: 思路:使用线段树,并且采用延迟标记的方法使更新操作的复杂度控制在O(logn)。这里采用数组的方法存储二叉树,可以省下两个指针的空间,但代码变得不是很直观,而且容易犯错。另外此题中数据可能超过32位,故使用long long类型存储(POJ平台不能采用__int64,具体原因参见这里),同时使用%lld输出。另外,直接使用scanf读入一个字符的方法会读入空白字符,这里使用scanf("%1s",c);实现。注意因为%s会在输入字符串的末尾加上终止符'\0',故c至少是一个长度为2的数组。6596kB600ms3338 B#include struct In 阅读全文
posted @ 2012-10-19 00:59 moonswap 阅读(163) 评论(0) 推荐(0) 编辑
摘要: //为了和DSP兼容,TSint64和TUint64设置成TSint40和TUint40一样的数//结果VC中还是认为是32位的,显然不合适//typedefsignedlongintTSint64;//typedefunsignedlongintTUint64;//ANSIC中规定longlong才能表示64位//参见:http://msdn.microsoft.com/en-us/library/s3f49ktz.aspx//可惜VC++6.0不认识longlong,会报errorC2632:'long'followedby'long'isillegalty 阅读全文
posted @ 2012-10-19 00:30 moonswap 阅读(450) 评论(0) 推荐(0) 编辑
摘要: 线段树的模板题,另外此题还能用SparseTable解。#include struct CowRange{ int l,u; CowRange *left,*right; int max,min; }; CowRange* BuildInTree(int l, int u, int *height){ CowRange *root = new CowRange(); root->l = l;root->u = u; if(l!=u){ //递归构建左右子树,并初始化max和min值 root->left = Build... 阅读全文
posted @ 2012-10-18 21:23 moonswap 阅读(223) 评论(0) 推荐(0) 编辑
摘要: 线段树(Interval Tree),也叫区间树。它在各个节点保存一个区间(即“子数组”),适用于和区间统计有关的问题。比如某些数据可以按区间进行划分,按区间动态进行修改,而且还需要按区间多次进行查询,那么使用线段树可以达到较快查询速度。实际可应用于例如RMQ,线段求长,矩形交,矩形并等,它基本能保证每个操作的复杂度为O(log n)。一、基本结构 对于一个[0 , N-1]的序列,它对应的线段树的根节点表示区间[0 , N-1],即所有N个数所组成的一个区间,然后,把区间分成两半,分别由左右子树表示。它的左右子树可以有多种表示方法:方案一:左结点代表的区间为[a , (a + b) / 2] 阅读全文
posted @ 2012-10-18 14:24 moonswap 阅读(567) 评论(0) 推荐(0) 编辑
摘要: 在解题过程中,我们有时需要维护一个数组的前缀和S[i]=A[1]+A[2]+...+A[i]。但是不难发现,如果我们修改了任意一个A[i],则S[i]、S[i+1]、...、S[n]都会发生变化。可以说,每次修改A[i]后,调整前缀和S[]在最坏情况下会需要O(n)的时间。当n非常大时,程序会运行得非常缓慢。因此,这里我们引入“树状数组”,它的修改与求和都是O(logn)的,效率非常高。树状数组的结构如下所示(注意数组下标从1开始,这点会影响到各函数的实现):对于每颗子树Cn,它表示A[i-2^k+1]到A[i]的和,而k则是i在二进制时末尾0的个数,或者说是i用2的幂方和表示时的最小指数。而 阅读全文
posted @ 2012-10-17 22:55 moonswap 阅读(128) 评论(0) 推荐(0) 编辑
摘要: http://blog.csdn.net/zenny_chen/article/details/6321978目前很多开源基于x86处理器环境的C/C++,Objective-C/C++编译器所带的汇编器使用AT&T格式。AT&T汇编针对x86指令集与其它处理器(比如ARM、Blackfin等)有所不同,它与Intel自定义的汇编格式有比较大的偏差。GCC的汇编器能支持Intel语法特性,可以参考我前面的博文来获悉如何使用。不过对于最新的LLVM2.0,又开始弃用Intel语法特性了。因此不管怎么说了解AT&T汇编语法还是有些好处的,呵呵。首先,AT&T汇编在对 阅读全文
posted @ 2012-10-16 17:55 moonswap 阅读(835) 评论(0) 推荐(0) 编辑
摘要: http://wenku.baidu.com/view/2a399a5f312b3169a451a4f5.html汇编命令详解32位CPU所含有的寄存器有:4个数据寄存器(EAX、EBX、ECX和EDX)2个变址和指针寄存器(ESI和EDI) 2个指针寄存器(ESP和EBP)6个段寄存器(ES、CS、SS、DS、FS和GS)1个指令指针寄存器(EIP) 1个标志寄存器(EFlags)1、数据寄存器数据寄存器主要用来保存操作数和运算结果等信息,从而节省读取操作数所需占用总线和访问存储器的时间。32位CPU有4个32位的通用寄存器EAX、EBX、ECX和EDX。对低16位数据的存取,不会影响高16 阅读全文
posted @ 2012-10-16 16:30 moonswap 阅读(2396) 评论(0) 推荐(1) 编辑
摘要: MS100 [061]找出数组中两个只出现一次的数字题目:一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。要求时间复杂度是O(n),空间复杂度是O(1)。思路:使用异或运算。第一遍,全部异或,得到A,A中至少有一位为1,记为t位。第二遍,对数组中的任意一个数,若t位为1,则与C异或,若t位为0,则与D异或。最后的C,D即为所求。MS100 [062]找出链表的第一个公共结点题目:两个单向链表,找出它们的第一个公共结点。思路:第一遍遍历两个链表,若尾指针相同则相交(若是循环链表,取任意一个循环中的节点即可),并且得到两个链表的长度。第二遍先让长的链表遍 阅读全文
posted @ 2012-10-09 16:36 moonswap 阅读(131) 评论(0) 推荐(0) 编辑
摘要: MS100 [046]括号排列数四对括号可以有多少种匹配排列方式?比如两对括号可以有两种:()()和(())思路:12种MS100 [047]最长递减子序列求一个数组的最长递减子序列比如{9,4,3,2,5,4,3,2}的最长递减子序列为{9,5,4,3,2}思路:经典动态规划,方案一,记录max[i]为以a[i]接尾的最长递减子序列长度,从0到n-1不断更新max数组即可。O(n^2)方案二,使用数组b[t]表示长度为t的递减子序列的末尾值的最大值,显然b[t]数组单调递减(初始化为最小值)。每次二分查找b数组,找t使b[t-1] > a[i] && b[t] m_pN 阅读全文
posted @ 2012-10-08 21:55 moonswap 阅读(165) 评论(0) 推荐(0) 编辑