随笔分类 -  算法

摘要:标准解法是用的离散化。此题的特殊性在于普通离散化后,两个相邻的值之间的区间也可能是有效的区间。例如:有三张海报[1, 4] [5, 6][1, 6],离散化后1->1, 2->4, 3->5, 4->6。他们就会覆盖[1, 6]这张海报。另外三张海报[1, 3] [5, 6][1, 6],离散化后1->1, 2->3, 3->5, 4->6。他们不会覆盖[1, 6]这张海报。而此时两组数据的前两张海报都会变成[1, 2] [3, 4] 两个区间,都覆盖了[1,4]区间。解决方案是如果发现两个离散值之间的距离大于1,就在两个值之间插入一个数字。例如 阅读全文
posted @ 2012-10-19 22:31 moonswap 阅读(263) 评论(0) 推荐(0)
摘要:此题和普通的线段树题相比,最大的挑战在于区间太大,如果一开始就建立一个完整的线段树,空间太大。所以,先只建立根节点,每来一组数据,用普通的线段树查找方法沿根节点查找,如果此组数据的子树不存在,则建立子树。最后递归删除线段树。结果为: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 阅读(222) 评论(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 阅读(168) 评论(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 阅读(234) 评论(0) 推荐(0)
摘要:2255:Tree Recovery题目分析:使用前序序列和中序序列构造后序序列的题。当时面微软实习生的时候还问过这个。前序的第一个节点就是后序的最后一个节点,且该节点把中序序列划分成左右两个子树。中序的这两个子树对应着前序的两个子树,他们的长度分别相等。代码如下:#include #include using namespace std; string getPost(string pre,string in){ if(pre.length() == 0)return "";//注意边界条件 if(pre.length() == 1)return pre; cha... 阅读全文
posted @ 2012-10-03 22:15 moonswap 阅读(138) 评论(0) 推荐(0)
摘要:2262:Goldbach's Conjecture题目分析:一百万个数,开辟一个数组用于标识是否是素数,用bool型表示,总内存小于1M,然后查表即可。建立素数表,对每个素数,把该素数的所有倍数所在的位置都置为false。代码如下:1048kB 50ms688 B#include int main(){ bool primeMap[1000000]; for(int i=1; i<1000000; i++){ primeMap[i] = true; } for(int i=2; i<500000; i++){ if(prime... 阅读全文
posted @ 2012-10-03 21:57 moonswap 阅读(149) 评论(0) 推荐(0)
摘要:1083:Moving Tables题目分析:初看似乎像贪心算法中的活动安排问题,不同的是这里的所有活动(相当于搬桌子的距离)都需要安排。有四种贪心策略:最短优先,最长优先,最早开始时间优先,最早结束时间优先。活动安排问题采用的是最早结束时间优先。此题要求所有活动都被安排,直观的想同时进行的活动相互之间的间隔最小最好。可以证明最早开始时间优先满足要求。证明:令S = P1,P2,P3,P4,P5是满足最早开始时间优先的一轮安排。即P1是所有活动中最早开始的,P2是在P1结束之后才开始的所有活动中最早开始的,依次类推。假设存在最优解A不包含上述S的安排。我们要证明存在一个等价的最优解A‘包含上述 阅读全文
posted @ 2012-10-03 20:11 moonswap 阅读(206) 评论(0) 推荐(0)
摘要:2159:Ancient Cipher题目分析:很简单的一道题。大意是判断两个字符序列是否可以通过字符替换(substitution)和交换(permutation)变成对方。初看似乎需要穷举所有substitution和permutation序列,但细想后发现:1.permutation让序列不用考虑顺序问题,可以看作是两个字符集合,题目简化为判断两个字符集合是否可通过substitution得到。2.substitution是任意的,只要两个序列中两个字符出现的次数相同,就可以替换。如果整个集合A中的字符都能在集合B中找到出现次数相同的字符,则A和B可以通过substitution得到。更 阅读全文
posted @ 2012-10-02 22:21 moonswap 阅读(193) 评论(0) 推荐(0)
摘要:POJ上的一些水题(可用来练手和增加自信)(poj2159,poj1083,poj2262,poj2255)初期:一.基本算法: (1)枚举. (poj1753,poj2965) (2)贪心(poj1328,poj2109,poj2586) (3)递归和分治法. (4)递推. (5)构造法.(poj3295) (6)模拟法.(poj1068,poj2632,poj1573,poj2993,poj2996)二.图算法: (1)图的深度优先遍历和广度优先遍历. (2)最短路径算法(dijkstra,bellman-ford,floyd,heap+dijkstra) ... 阅读全文
posted @ 2012-10-02 21:41 moonswap 阅读(277) 评论(0) 推荐(0)