最近开始写trie树,trie树还可以和并查集一起运用。
poj 3283是一道典型的trie树问题,为了节约malloc的时间,我静态生成需要申请的内存,然后自己管理。由于预估poj的数据比较弱,所以这个方法可行。
为了测试需要开辟空间的大小,我无耻的用小号不断的刷,终于确定了大小。
用大号提交上去之后,饶有兴致的看了一下排名。悲剧的发现,居然是第二名 63ms,而第一名是我无耻的小号littlenumber 47ms。我擦....
posted @
2010-09-22 22:39 margin 阅读(107) |
评论 (0) |
编辑 收藏
今天做了一个奇怪梦,像看了部电影一般。醒来后居然都记得。故事有点科幻,有几个主人公,记录一下。
---------------------------------
在现代化的大城市中心街区中,走来一伙人。有的西装革履,有的嘻哈打扮,他们的眼神很奇怪。为首的是一个穿白大褂的学者,他高而瘦,带着眼睛,眼里射出冰冷的目光。这伙人最终在一个立交桥下停了下来,他们好像在鞭打什么。
一旁走来了三男三女,很好奇的,凑上一看。好像其中有三个人在欺负桥下的乞丐。他们拳打脚踢,甚至鞭笞那个乞丐。终于其中一名男子再也忍受不住大喝到“住手”,此人老实敦厚,但看上去正义凌然,应该是一名退伍军人。其他两个男人也迈步向前。
教授示意了一下三人停手,然后头朝来人一拱,示意让三个手下解决掉多余之人。三人齐上,同正义方三人一起打起来。正义一方中另两为一个衣着时尚,英俊帅气,貌似应该在一些声色场所做DJ之类;另一人呆头呆闹,但穿着保安的衣服。三个女人中有一个人是保安的妻子,看上去结婚多年。另一人衣着时尚,面容姣好应该是个小白领;最后一个人简简单单,普普通通,但是眼中透着股灵气,其实是个记者。
保安的妻子担心丈夫,竟直接向教授进攻去了。很奇怪的战斗,那伙匪徒每个人都好像在被动挨打,没有有效的反抗。教授被女人扇了几个耳光后,嘴角有丝血迹,但是似乎冷笑了一下。
大战的结局,这伙匪徒居然被几个人打炮了,而那个乞丐也不见了。莫名奇妙,白领在一旁看着DJ很有爱慕之意想要上去搭讪几句,被冷冰冰的回绝;女记者心中充满疑问,询问了几个人联系方式后,向那伙人逃走的方向走去。。。
[从这里开始故事开始分支]
女记者的故事
女记者跟踪那伙人,居然发现这伙人不是这个世界上的人,或者说他们是另外一个空间的人。有的人是去世后可以到这里获得新生,有些人却来这里协助他们在做一些工作。女记者潜入后,发现这个团伙其实在做一些有意义的事情。在她了解到了真想之后,她主动的来到他们的世界。
保安的故事
保安是个愤青,他为自己家庭的生活压力大而烦恼。但是却恨自己头脑简单而挣不了更多钱,妻子也在外面拼命的打工。女记者来到保安家里,暗示可以去某个地方看看增加自己的竞争力。保安来到后发现是一个教室,教室中有些书籍。(具体的略过)他居然发现讲课的人就是白衣教授。教授用那天他对待别人的方式对待保安自己,仿佛在暗示轮回和因果的关系。保安激动的想获得了真理,并开始在为这个组织做事。后来有拉了他老婆入伙。他老婆入伙的方式也和那天情景相识。
女白领和DJ的故事
(具体的不记得了)DJ是一个有自闭症的人,不知与别人相处。女白领发现他周围很多女性,但DJ似乎都没有什么兴趣。DJ死于一次意外后,来到了教授的旗下。女白领在得知消息后,非常沮丧。但居然有一天在街上再次看到DJ的背影后,开始怀疑。(之后略)
退伍军人的故事
退伍军人是一个强迫症患者,他与他的妻子虽然在一起但是没有任何的感情,他的妻子不了解他。最后在若干年后他才来到教授的世界中,他终于找到了解开心结的方法。
大结局
保安夫妻很幸福,女记者帮助退伍军人重新认识自己,退伍军人看到自己的妻子也找到另外一半;女白领付出了很多,DJ终于慢慢的开窍。
--------------------
有很多细节忘记了,但是总之故事很离奇,也很完整。我惊叹有这样的梦,怀疑自己是不是被inception了。
posted @
2010-09-19 09:20 margin 阅读(135) |
评论 (2) |
编辑 收藏
初期:
一.基本算法:
(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)
(poj1860,poj3259,poj1062,poj2253,poj1125,poj2240)
(3)最小生成树算法(prim,kruskal)
(poj1789,poj2485,poj1258,poj3026)
(4)拓扑排序 (poj1094)
(5)二分图的最大匹配 (匈牙利算法) (poj3041,poj3020)
(6)最大流的增广路算法(KM算法). (poj1459,poj3436)
三.数据结构.
(1)串 (poj1035,poj3080,poj1936)
(2)排序(快排、归并排(与逆序数有关)、堆排) (poj2388,poj2299)
(3)简单并查集的应用.
(4)哈希表和二分查找等高效查找法(数的Hash,串的Hash)
(poj3349,poj3274,POJ2151,poj1840,poj2002,poj2503)
(5)哈夫曼树(poj3253)
(6)堆
(7)trie树(静态建树、动态建树) (poj2513)
四.简单搜索
(1)深度优先搜索 (poj2488,poj3083,poj3009,poj1321,poj2251)
(2)广度优先搜索(poj3278,poj1426,poj3126,poj3087.poj3414)
(3)简单搜索技巧和剪枝(poj2531,poj1416,poj2676,1129)
五.动态规划
(1)背包问题. (poj1837,poj1276)
(2)型如下表的简单DP(可参考lrj的书 page149):
1.E[j]=opt{D+w(i,j)} (poj3267,poj1836,poj1260,poj2533)
2.E[i,j]=opt{D[i-1,j]+xi,D[i,j-1]+yj,D[i-1][j-1]+zij} (最长公共子序列)
(poj3176,poj1080,poj1159)
3.C[i,j]=w[i,j]+opt{C[i,k-1]+C[k,j]}.(最优二分检索树问题)
六.数学
(1)组合数学:
1.加法原理和乘法原理.
2.排列组合.
3.递推关系.
(POJ3252,poj1850,poj1019,poj1942)
(2)数论.
1.素数与整除问题
2.进制位.
3.同余模运算.
(poj2635, poj3292,poj1845,poj2115)
(3)计算方法.
1.二分法求解单调函数相关知识.(poj3273,poj3258,poj1905,poj3122)
七.计算几何学.
(1)几何公式.
(2)叉积和点积的运用(如线段相交的判定,点到线段的距离等). (poj2031,poj1039)
(3)多边型的简单算法(求面积)和相关判定(点在多边型内,多边型是否相交)
(poj1408,poj1584)
(4)凸包. (poj2187,poj1113)
中级:
一.基本算法:
(1)C++的标准模版库的应用. (poj3096,poj3007)
(2)较为复杂的模拟题的训练(poj3393,poj1472,poj3371,poj1027,poj2706)
二.图算法:
(1)差分约束系统的建立和求解. (poj1201,poj2983)
(2)最小费用最大流(poj2516,poj2195)
(3)双连通分量(poj2942)
(4)强连通分支及其缩点.(poj2186)
(5)图的割边和割点(poj3352)
(6)最小割模型、网络流规约(poj3308, )
三.数据结构.
(1)线段树. (poj2528,poj2828,poj2777,poj2886,poj2750)
(2)静态二叉检索树. (poj2482,poj2352)
(3)树状树组(poj1195,poj3321)
(4)RMQ. (poj3264,poj3368)
(5)并查集的高级应用. (poj1703,2492)
(6)KMP算法. (poj1961,poj2406)
四.搜索
(1)最优化剪枝和可行性剪枝
(2)搜索的技巧和优化 (poj3411,poj1724)
(3)记忆化搜索(poj3373,poj1691)
五.动态规划
(1)较为复杂的动态规划(如动态规划解特别的施行商问题等)
(poj1191,poj1054,poj3280,poj2029,poj2948,poj1925,poj3034)
(2)记录状态的动态规划. (POJ3254,poj2411,poj1185)
(3)树型动态规划(poj2057,poj1947,poj2486,poj3140)
六.数学
(1)组合数学:
1.容斥原理.
2.抽屉原理.
3.置换群与Polya定理(poj1286,poj2409,poj3270,poj1026).
4.递推关系和母函数.
(2)数学.
1.高斯消元法(poj2947,poj1487, poj2065,poj1166,poj1222)
2.概率问题. (poj3071,poj3440)
3.GCD、扩展的欧几里德(中国剩余定理) (poj3101)
(3)计算方法.
1.0/1分数规划. (poj2976)
2.三分法求解单峰(单谷)的极值.
3.矩阵法(poj3150,poj3422,poj3070)
4.迭代逼近(poj3301)
(4)随机化算法(poj3318,poj2454)
(5)杂题.
(poj1870,poj3296,poj3286,poj1095)
七.计算几何学.
(1)坐标离散化.
(2)扫描线算法(例如求矩形的面积和周长并,常和线段树或堆一起使用).
(poj1765,poj1177,poj1151,poj3277,poj2280,poj3004)
(3)多边形的内核(半平面交)(poj3130,poj3335)
(4)几何工具的综合应用.(poj1819,poj1066,poj2043,poj3227,poj2165,poj3429
)
高级:
一.基本算法要求:
(1)代码快速写成,精简但不失风格
(poj2525,poj1684,poj1421,poj1048,poj2050,poj3306)
(2)保证正确性和高效性. poj3434
二.图算法:
(1)度限制最小生成树和第K最短路. (poj1639)
(2)最短路,最小生成树,二分图,最大流问题的相关理论(主要是模型建立和求解)
(poj3155, poj2112,poj1966,poj3281,poj1087,poj2289,poj3216,poj2446
(3)最优比率生成树. (poj2728)
(4)最小树形图(poj3164)
(5)次小生成树.
(6)无向图、有向图的最小环
三.数据结构.
(1)trie图的建立和应用. (poj2778)
(2)LCA和RMQ问题(LCA(最近公共祖先问题) 有离线算法(并查集+dfs) 和 在线算法
(RMQ+dfs)).(poj1330)
(3)双端队列和它的应用(维护一个单调的队列,常常在动态规划中起到优化状态转移
的
目的). (poj2823)
(4)左偏树(可合并堆).
(5)后缀树(非常有用的数据结构,也是赛区考题的热点).
(poj3415,poj3294)
四.搜索
(1)较麻烦的搜索题目训练(poj1069,poj3322,poj1475,poj1924,poj2049,poj3426)
(2)广搜的状态优化:利用M进制数存储状态、转化为串用hash表判重、按位压缩存储
状态、双向广搜、A*算法. (poj1768,poj1184,poj1872,poj1324,poj2046,poj1482)
(3)深搜的优化:尽量用位运算、一定要加剪枝、函数参数尽可能少、层数不易过大
、可以考虑双向搜索或者是轮换搜索、IDA*算法. (poj3131,poj2870,poj2286)
五.动态规划
(1)需要用数据结构优化的动态规划.
(poj2754,poj3378,poj3017)
(2)四边形不等式理论.
(3)较难的状态DP(poj3133)
六.数学
(1)组合数学.
1.MoBius反演(poj2888,poj2154)
2.偏序关系理论.
(2)博奕论.
1.极大极小过程(poj3317,poj1085)
2.Nim问题.
七.计算几何学.
(1)半平面求交(poj3384,poj2540)
(2)可视图的建立(poj2966)
(3)点集最小圆覆盖.
(4)对踵点(poj2079)
八.综合题.
(poj3109,poj1478,poj1462,poj2729,poj2048,poj3336,poj3315,poj2148,poj1263
)
posted @
2010-09-01 17:09 margin 阅读(162) |
评论 (1) |
编辑 收藏
这是一题相当有水平的并查集问题。虽然我一次性ac,但是基本上是没有任何思路搜索了一下牛人思路才过的。
思考这题时,我陷入到了以下怪圈:
1.并查集应该是无限的,但是貌似这题的并集只有三个
2.当两者关系未被确认是哪个集合时,会出现无限多的临时子集
3.如何表示临时子集
看了看牛人的思路,相当巧妙:并查集基本还是无限集,有限集用关系向量来表示。
1.使用关系向量的方法,让我获益匪浅。
2.计算关系向量的方法,又如此的巧合。
3.并查集并不一定是相同的才并一起,又回归到第一点,当关系向量可以用有限集表示时,并查集里的元素可以不是同一类元素。
最后还要说,这题相当牛B.
#include "stdio.h"
#define MAX 50001
#define Similar 0
#define Enemy 1
#define Food 2
// Food eat Enemy
// Enemy eat Similar
// Similar eat Food
struct _xtree
{
int parent;
int relation;
}xtree[MAX];
int N, K;
void build()
{
int i;
for (i = 1; i <= N; i++)
{
xtree[i].parent = i;
xtree[i].relation = Similar;
}
}
int find(int i)
{
int p = xtree[i].parent;
if (p != i)
{
xtree[i].parent = find(xtree[i].parent);
xtree[i].relation = (xtree[p].relation + xtree[i].relation) % 3;
}
return xtree[i].parent;
}
int check(int x, int y, int r)
{
int root_x, root_y, root_r;
if (x > N || y > N)
{
return 0;
}
root_x = find(x);
root_y = find(y);
if (root_x == root_y) // x relate y
{
return (xtree[x].relation - xtree[y].relation + 3) % 3 == r ? 1 : 0;
}
else
{
root_r = (xtree[y].relation + r + (3 - xtree[x].relation)) % 3;
xtree[root_x].parent = root_y;
xtree[root_x].relation = root_r;
return 1;
}
}
void main()
{
int op, x, y;
int count = 0;
scanf("%d %d", &N, &K);
build();
while (K--)
{
scanf("%d %d %d", &op, &x, &y);
if (!check(x, y, op == 1 ? Similar : Enemy))
{
count++;
}
}
printf("%d\n", count);
}
posted @
2010-08-28 21:11 margin 阅读(156) |
评论 (0) |
编辑 收藏
tle和wa 到麻木.... 又一题并查集。这周做题时间少了很多,原因工作太忙,准备晋升。希望晋升成功!
posted @
2010-08-28 00:18 margin 阅读(100) |
评论 (0) |
编辑 收藏
上周ac了3道 基本的线段树。这周开始做并查集,庆祝一下poj达到40题,虽然都是水题居多。
posted @
2010-08-22 23:49 margin 阅读(73) |
评论 (0) |
编辑 收藏
连续两天AC了两道线段树经典题目。
3277用了157ms居然排到了第三,哈哈哈哈....
posted @
2010-08-18 00:45 margin 阅读(63) |
评论 (0) |
编辑 收藏
摘要: 线段树经典解决问题poj1151,计算图形覆盖总面积。1.用了半小时写了一个简单算法,看了看测试数据没过,原来理解题意错误。(如果提交就是WA)2.然后又用了朴素的枚举,这次是TLE,看来是水平不行,要学习学习别人的思路了。3.看完别人代码后,花了半天用自己的思路写了一遍,RTE。4.原来是数组设小了,再次提交PE。4.最后居然是要输出两个换行,晕倒!AC线段树的应用还有很多,就此题来说基本的思维...
阅读全文
posted @
2010-08-15 23:38 margin 阅读(250) |
评论 (0) |
编辑 收藏
Bridge模式看过很多遍,说实话没看懂过。今天终于觉悟....
Bridge模式的定义是:将抽象和实现解耦。
这个定义是最让人费解的,抽象和实现解耦和Bridge有什么关系,特别是UML的图形给出来的时候更让我感觉到这个定义的匪夷所思。
下面来举个例子吧:
我很久前遇到的问题就是:写一个系统,当输入可能内存、文件.....而输出可能是内存、文件等等的时候。如果按照C接口的定义方式,你可能要做一下的定义。
MemToMem()
MemToFile()
FileToMem()
FileToFile()
一下就要定义2x2的接口,而如果在增加一个输入,那么就是2x3的接口,再增加同样的输出就是3x3的接口。
如果在C++里面,就是有双重的集成关系,首先是基类,然后是n中输入类,再来就是n^2个输出类。
所以Bridge模式要解决的就是这种变化关系。
Bridge模式的思想就是将n个输入类和n个输出类解耦(抽象和实现接口)让他们分别依赖自己的基类,而最终通过组合的方式让两者分离。
简单的代码
class Input
{
public:
virtual void Do() = 0;
private:
OutPut pObj;
}
class InMem : public Input
{
public:
virtual void Do()
{
pObj->Out();
}
}
class OutPut
{
virtual void Out() = 0;
}
class outMem
{
virtual void Out()
{
// do something
}
}
ps.此文档之作为技术的随笔,供以后搜索,如果疑问概不回答。
posted @
2010-07-31 18:26 margin 阅读(772) |
评论 (0) |
编辑 收藏
昨天,玩推箱子游戏玩到第四关实在过不去了,用C++写了一个BFS+DP的算法求解。结果是170步。
其实我一开始是想用python来写的,但是觉得二位矩阵这个东西很难用python来描述,于是作罢。写完后看看自己的代码,觉得恶心的不行。于是在网上搜索了一下,发现大牛居然可以把python写得如此之简洁,又一次拜服了!
《
用python求解迷宫问题》
http://v.youku.com/v_show/id_XMTcwMzc5MTAw.html下面是我按照视频里面敲的python代码,我的实在垃圾就不拿出来了。
这段代码最然我感到惊叹的是他对迷宫模型的表示方式,二位矩阵就如此轻描淡写的表示出来!
ps,网页代码的对齐有点问题。
1ASCII_MAZE = '''
2+----------------+
3| | | |
4| | +--+ ----+ | |
5| | | | |
6| | +---- | | |
7| | | | | E
8+---+ | | | | |
9S | | | |
10+------+--+--+---+
11'''
12PATH,START,EXIT,VISITED, SOLUTION = " SE.o"
13
14class Maze():
15 def __init__(self, ascii_maze):
16 self.maze = [list(row) for row in ascii_maze.splitlines()]
17 self.start_x = [row.count(START) for row in self.maze].index(1)
18 self.start_y = self.maze[self.start_x].index(START)
19
20 def __repr__(self):
21 return "\n".join("".join(row) for row in self.maze)
22
23 def solve(self, x = None, y = None):
24 if x == None:
25 x = self.start_x
26 y = self.start_y
27
28 if self.maze[x][y] in (PATH, START):
29 self.maze[x][y] = VISITED
30 if self.solve(x + 1, y) or self.solve(x - 1, y)\
31 or self.solve(x, y +1) or self.solve(x, y -1):
32 self.maze[x][y] = SOLUTION
33 return True
34 elif self.maze[x][y] == EXIT:
35 return True
36 return False
37
38
39if __name__ == "__main__":
40 import sys
41 sys.setrecursionlimit(10000)
42 m = Maze(ASCII_MAZE)
43 if m.solve():
44 print m
45
46
posted @
2010-07-18 17:20 margin 阅读(1511) |
评论 (0) |
编辑 收藏