作者归档:Eurce

[POJ 3301]

Texas Trip

三分法。

其实一开始我是二分做的,二分的对象是正方形的边长,判断可行行则是将整幅图每次旋转一个微小角度,计算与坐标轴平行覆盖所有点的最小正方形。虽然这题精度和数据规模都一般,但还是妥妥的TLE了。于是看了讨论,又参考了这篇文章

思路还是很清晰的,旋转范围是[0,pi/2],在这范围内最短边长值是凹函数。于是对角度三分之后,计算所有点坐标中x、y两方向上的最大差值,并取较大值为此时正方形边长。迭代直到精度足够即可。

又学到了很实用的算法。 ^ ^

[POJ 3422]

Kaka’s Matrix Travels

费用流。

好久没写网络流的题目了,敲了很久,不过还是1A了。

这题和以前qoshi推荐的DP是同类题目,但这超过了DP能求解的规模,所以只能用费用流来做了。思路是把矩阵每个元素拆点为ui和vi,并根据费用流算法的需要进行建图。然后重复k次增广操作即可。增广用的是基于栈的spfa。g++下跑了938ms。

books and reading

最近读完了松本行弘的程序世界,以及最后的贵族

前一本,在之前的几篇笔记里也有提及,除部分篇章略显单薄外,全书大部分都是作者多年来关于计算机语言的思考,在很多方面也打开了我的思路,实在是值得一读的好书。但这里主要还是想写写另一本。

从小到大都有政治课,但我经常是不及格,小时候也比较贪玩,对这种无法理解的东西一点兴趣也没有。应付考试也是拿着老师发的资料背一下忽悠过去。中考,高考,研究生考试,一晃都学了10多年政治课了,却也没感觉到学明白了什么。国内对政治这个话题真是非常敏感,来到北京之后更是加深了这种感觉。平时理工科就和政治不太沾边,同学间聊天也话题也很少涉及。身边朋友里几乎不关心政治的人也不在少数。

但大概每个年轻人都会或多或少对这个社会抱有好奇,尤其是在认识到面前不合情理地充满阻挠的时候。我也不例外。

最后的贵族一书原名往事并不如烟,作者是章诒和先生,主要讲述的是新中国建国伊始的一些事情。作者的父亲是当年被划为右派头目的章伯钧,是新中国首任交通部部长,也是当时的民主党派“农工民主党”的主席。还是引用作者本人的序吧:

这本书是我对往事的片断回忆,但它不是回忆录。

在中国和从前的苏联,最珍贵和最难得的个人活动,便是回忆。因为它是比日记或写信更加稳妥的保存社会真实的办法。许多人受到侵害和惊吓,销毁了所有属于私人的文字记录,随之也抹去了对往事的真切记忆。此后,公众凡是应该作为记忆的内容,都由每天的报纸社论和文件、政策、决议来确定。于是,历史不但变得模糊不清,而且以不可思议的速度被改写。这样的“记忆”就像手握沙子一样,很快从指缝里流掉。从前的人什么都相信,相信……,后来突然又啥都不信了。何以如此?其中恐怕就有我们这个社会长期回避真实、掩盖真实、拒绝真实的问题。

我这辈子没有什么意义和价值,经历了天堂、地狱、人间三部曲,充其量不过是一场孤单的人生。我拿起笔,也是在为自己寻找继续生存的理由和力量,拯救我即将枯萎的心。而提笔的那一刻,才知道语言的无用,文字的无力。它们似乎永远无法叙述出一个人内心的爱与乐,苦与仇。

寂静的我独坐在寂静的夜,那些生活的影子便不期而至,眼窝里就会涌出泪水,提笔则更是泪流不止,毫无办法,已成疾。因为一个平淡的词语,常包藏着无数寒夜里的心悸。我想,能够悲伤也是一种权利。

往事如烟,往事并不如烟。我仅仅是把看到的、记得的和想到的记录下来而已,一共写了六篇,涉及八人(不包括我的父母)。这些人,有的深邃如海,有的浅白如溪。前者如罗隆基、聂绀弩,后者如潘素、罗仪凤。他(她)们有才、有德、有能,除了史良,个个心比天高、命如纸薄。可说而不可看,或者可看不可想。过去,咱们这儿总喊“解放全人类”,却残酷地践踏身边的人。其实,不论贵贱和成败,人既不应当变为圣像,也不应当遭受藐视。

书是献给父母的。他们在天国远远望着我,目光怜悯又慈祥。

这本书实在让我无法评论,想写的东西太多太多。能读到这种毫无保留地讲述过去事实的书籍,实在是太好了。

昨天路过什刹海的时候,在地图上竟然看到有“张伯驹潘素故居纪念馆”。找到了门口,却很可惜的发现没有开放。这也是我第一次到什刹海,环顾四周,大概是北京城内风景最好的一角了。书中讲述的小说般的故事,却真真实实的发生在不远的过去,伸出双手仿佛就能触碰。回头想想,为何非要千里迢迢从广东到北京读研。其中最吸引我的,也就是这点了吧。

361_0

361_1

[POJ 3150]

Cellular Automaton

矩阵运算。

题意抽象出来,即是求A^k*x(mod m),其中A是n*n的循环矩阵,x是n维列向量。

很直接的思路是O(n^3*lgk),但这里n最大500,TLE的。如果利用A是循环矩阵的性质,那么其实每次只要计算第一行就可以了,其他行都可以由第一行移位得到。这样就可以O(n^2*lgk),实现出来最快500ms。

看评论还有一种O(n*lgn*lgk)的算法……但是想了一早上也没明白怎么弄,饿得不行吃饭先了……

Mandelbrot Set 字符画

松本一书10.2节介绍优化Ruby运行速度的一个小例程。

运行结果如下,是字符画形式的曼德博集合。看了源码也不清楚为何能做到这样的效果……实在是太神奇了:

[POJ 3159]

Candies

差分约束系统。

偶尔发现的很好的题目,对最短路径算法的优化要求较高。

敲了一个SPFA+SLF。其中双端循环队列是手写的,int读入用了getchar处理以节省时间,作了去重边处理。但即使这样也才250ms(g++)。

之后又考虑了用dijkstra。没有优化过直接交果然TLE了。然后开始考虑改进。直接用最小堆来实现最优的dijkstra不太好写,而折中地每次将可能更新最短路径值的点全部push进优先队列的做法是相对比较好实现的,也不会耗损太多时间。第一次写这样的dijkstra,调试了挺久。最后在g++下235ms,c++下1297ms。

吐个小槽……priority_queue里面自定义仿函数时,若比较用的是<,建出来的竟然是大根堆……直觉上怎样也觉得<对应的应该是最小元素在上的小根堆才对……>__< 后记:第二天过来后被Usozki教育了下,他的代码仅仅是SPFA+栈,没有太多优化……但是直接跑出79ms进入第一版了…… 附POJ 3159 by Usozki:

[POJ 3101]

Astronomy

分类里写的是扩展欧几里德,但完全用不到。倒是被高精度稍微卡了下。

题意是共有n个星体各以vi的速度绕同一中心公转,问所有星体排成一条直线的周期。

这里注意“排成一条直线”,可以是在圆周的一侧或是另一侧。这里可以取速度最快的星作为运动参照物,求其他星体相对该星的速度,并计算各星体(v0-vi)*x可同时被0.5除尽的最小倍数值x。x即为所求周期值。0.5是因为可在圆周的任意一侧。

用题意vi = 1/ti来表示的话,则1/t0 – 1/ti = (ti-t0) / (t0*ti),那么取所有分母的lcm为nu,所有分子的gcd为de,则nu/(2*de)则是所求的x了。

思路出来之后,还有部分细节,首先就是去重,然后是计算素数表大小和估计高精度数组最大长度,最后每次求出某分数值时要约分到最简。这里所谓的“高精度”比较有意思的是,用质因数分解的方式保存各个值,这样可非常简便地求gcd和lcm。

Google Round A China New Grad Test 2014

早上做了一场Google的在线笔试

赛制都很熟悉了,和之前的GCJ一样的。比赛时长3小时,共5题,每题都分small和large两组数据。

Problem A. Read Phone Number

读入两个字符串,根据第二个串给出的分段方式,对第一个串进行分析并输出结果。

写第二个串的读入那部分时卡了很久很久。真是对字符串处理太不熟练了,之前北大校赛的时候也是卡很久在字符串处理上。最后还是借鉴了之前用getchar()代替scanf(“%d”,&d)来读入整数以节省时间的方式来读入了每个串分段长度值。提交大数据时一直报含有非ascii字符,结果发现自己数组越界了,如果不是提示这里也就WA掉了。这题做完时已经整整41分钟了。

Problem C. Sorting

随后很自然的看了下board,看到C题过的人很多。点开发现是大水题,两次排序后重构数组输出即可。

Problem B. Rational Number Tree

C题过了后,心态稳下来了。开始读B,发现也是只需要在树上寻根即可,非常简单的处理。大数据提交前看了眼输出,发现竟然有负数。分析到long long最多是2^63-1,遂改成unsigned long long提交。

Problem D. Cross the maze

到这时候已经完全进入状态了。机器人走迷宫的题目,读完后发现也不需要太复杂的处理。分析完之后可以发现,机器人每一步的走法是确定的,而所需要做的就是模拟它走完10000步,看是否经过终点。这里处理写得很凌乱,因为当时以为只有两个小时敲得比较仓促。但提交完发现竟然还有1小时。。。

Problem E. Spaceship Defence

最后一题了,这是唯一稍微考虑了下复杂度的问题。这里大数据是100个源点,图有80000个点,若是稠图最坏情况O(M*N^2)是会TLE的。过了小数据后想了很久怎么对问题进行抽象,但始终没有太好思路。这个时候时间也不多了,想想大数据有8min时限,下下来碰碰运气好了。结果SPFA没有任何优化,1分钟不到就跑出结果了,遂提交之。

12点封榜的时候,好像是排50名左右吧。。。Arios比我快2分钟,能离伟神这么近我也很满足了。睡过午觉过来一看,发现自己AK了。。。。。。最后排名29。其实题目不难的,但貌似很多ACM神牛都没有来玩,不知为何了。。。

最后的board

事后马上收到了Google的邮件,恭喜通过笔试云云。

不禁也在问自己,这个时候如果要选择,是继续读完研究生,还是去Google工作?

心里面作出回答只用了10秒。而且非常清楚,自己这一决定,怎样也不后悔。

祝自己好运吧。

books and reading

最近也是在啃松本的书,越读越喜欢。

作为Ruby语言的作者,其书中对程序语言的看法非常独到。比如拿“面向对象”来说,我在之前看的书里面大多只是讲:类怎么写,继承怎么用,虚函数的作用是什么,诸如此类等等等玲琅满目堆砌了一大堆细节。很少涉及到非常关键的一点:为什么要用面向对象?当然某些书里会含糊其辞地写到,用“对象”的思想对客观事物进行模拟,会让写出来的程序更加合理。“但真的是这样吗?”这是我知道有面向对象以来一直存有的疑问。直到在本书中,读到松本写到的“从实用主义的观点来看,面向对象的精髓就在于对OCP的实践。至于把对象看做物体理解起来比较容易,能够建立现实世界的模型等,这些都只不过是些锦上添花的东西。”(P111),对我来说,这句话犹如醍醐灌顶,很多问题霎时间就明白了。(这里的OCP指的是open-closed principle,指程序对功能扩展要是开放(open)的,而修改则要对外呈现封闭(closed))

这本书里,作者还写到“但是不管过去怎样,现在对面向对象最好的理解是,面向对象编程是结构化编程的延伸。”(P32)。作者认为,我们写程序时,最初所用的结构化编程是非常自然的。但是当时仅能够做到“程序的结构化”,而无法做到“数据的结构化”,也即数据无法随着程序一起“流动”,造成了处理上的困难。而面向对象的出现,使得数据可以与程序捆绑在一起,由此便实现了程序完全意义上的“结构化”。

我无法判断这种思想是对是错,但若是反过来从头看程序语言的演变,由以上思想作为出发点的话,很多事情都变得容易理解了。甚至让我怀疑“面向对象是为了根据现实进行抽象建模而出现的编程思想”这种思路反而才是牵强附会。

另外,这本书里还讨论了其他很有意思的设计,包括“Duck Type”,也即动态类型,还有对多重继承的处理(对比了RUBY、C++、JAVA、SMALLTALK、JAVASCRIPT和LISP等多种语言解决多重继承问题背后的思想,以及优劣所在)等等。实在是让我眼界大开……

当然,我还不敢肯定自己到底理解了作者想表达意思的程度,而无法判断作者所言是否有理,但这种思想碰撞的过程,太让我享受了

惯例也贴一份有趣的程序,用Ruby实现微秒级别的时钟,以前用C时只能调用到毫秒,还以为系统不支持呢。另外本程序也是为了表现Observer模式的思想。

[POJ 2065] & [POJ 1166]

SETI

The Clocks

两题都是高斯消元法。(也都1A了^^)

两题题面都很有意思,分别描述了确定有唯一解的模运算线性方程组,唯一解是因为前者是范德蒙行列式,后者则是给定了满秩系数矩阵。

两题都没有太大难度的,代码也相近。

2065的:

1166的:

好久没来了……这几天都在看书+帮人折腾VPS。Linode用久了就以为主机商都该是这样的,现在算认识到很多产品还是良萎不齐的(而且还死贵……)