Posts Tagged ‘OI’

OI 完结

Monday, January 19th, 2009

谨以此文献给机房做题最多的 Ark

随着 NOIP2008 的结束,我的 OI 生涯也要就此结束了。

说起来,从初一到现在,已经过去了大概六个年头,我也在 OI 战线上“奋战”了六个年头,参加了 5 次 NOIP,虽然只获得了一个一等奖。

初一(貌似下学期)有个什么计算机培训的选拔,我去考了,除了一些计算机基础之类的东西,还有(印象中)貌似是 BASIC,不要说那时候,就是现在,我也不会 BASIC(因为没学过嘛),不过还是糊里糊涂地考了全区第三,去上课的话学费减半(利诱啊),不过我没去,现在也忘了是为什么了,可能是觉得时间有些紧吧(我也忘了是为什么了)。我选择了在家自学,其实那个培训就是教 Pascal,我当时也学的 Pascal,去上课的同学还经常问我问题呢,比如用星号画个三角形之类的……说起来,我学的第一门(程序设计)语言是 Pascal 呢,我还一直觉得是 C。Pascal 我现在基本都不会了,只能看懂简单的代码,写的话,必错,还是 C/C++ 比较顺手,毕竟用的时间要长得多。

学了好像没多久就转了 C,初二的 NOIP 得了貌似 100 分,是济南市一等奖。然后又转了 C++,当然 C++ 只学了不多的一部分,也学了 STL,而且还是比较用心地学的……NOIP 2006 接着就禁用了 STL,我直接郁闷了……当时还引发了 OIBH 上的一场论战(tid 还是回文数……),当时我还不知道 OIBH,这帖子我最近才发现的。(插一句,我学 STL 直接原因是 NOIP 2005 的标程是用 STL 写的,CCF 自己打了自己的脸。)于是没办法,没用 STL,120 分,还是济南市一等奖。

上了高中,我还是除了语言什么都不会……NOIP 20072006,贪心第一题,20 10 分;模拟第三题,0 分。于是三等奖(鄙视那些同样是 20 10 分,但是二等奖的),NOIP 2007 2006 结束之后,我还是什么都不会,高二夏令营我去了,感觉学了点东西。NOIP 2008 2007,去的时候只有一个念头,就是来年再来,结果混了个省级一等奖,第一题快排 100 分,第二题模拟,90 分,第三题随机化搜索,30 分,一共 220 分,跟分数线一样。

于是我放下了 OI,没有再搞。高三的 NOIP 2008,我也去了。初赛没复习,过了。复赛之前做了不到十道题,在机房呆了不到一周,就去了。结果,第一题水,100 分;第二题水,100 分;第三题我没见过这道大家都见过的题,0 分;第四题 cheat,10 分。于是总分 210,二等奖。于是我一二三等奖都得全了,紧接着开始了保送之旅。

以上流水帐多处纯凭记忆,而我记忆力非常差,所以未必都准确,见谅。

大家公认的,我是真正搞 OI 的人里做题最少的,总共也就几十道,还有不少是在考场做的。我自认为,我的水平也就是 NOIP 二等水平,碰上了 NOIP 2007 的水题大赛才侥幸一等。高中竞赛三年,我只留下了一万多行代码,或许跟刷题的大牛不在一个数量级上,自然,熟练程度和水平也就不再一个级别上。

我觉得,竞赛有 3 条路:一,一等奖 + 绝好的成绩;二,牌;三,多科一等。而我,哪条路都没走成,竞赛只搞了一科,物理竞赛夭折了;竞赛成绩只有一个省一,别说牌,省队都没考;成绩在学校(山东省实验中学)三年都是三四百名,一点没有进步,保送生里倒数。最后能有这结果也算是幸运了(北航预录)。

或许,现在说这些已经没有什么用了,我们已经成了后无来者的一群人。

Tags:,

Related Posts

启程—— NOIP 2008

Thursday, November 13th, 2008

23:45 的火车,去烟台, NOIP 2008。

最后的一次 NOIP,努力吧!

God bless all...

Tags:,

Related Posts

[OI][Vijos 1107]环游大同 80 天

Sunday, October 26th, 2008

话说这题是一个搜索题。

我采用的是两次 DFS 的方法,也就是任意取一个点开始 DFS,找到这次 DFS 时深度最深的点(也就是从所选点开始最长路径的终点),然后从这一点(可以证明,这一点是最长路径的端点)开始再进行 DFS,这次 DFS 的深度就是要求的路径长度。

算法就是这样了,不过这个算法的正确性我一开始也不太确定,下面来证明一下:

大家看图:

设最长路径为 AB ,一开始任选的点为 P。取路径 PB 上的一点 Q,使得 AQ 与 PQ 只有一个公共点 Q(也就是使得从 A 走到 Q 再走到 B 不会走回头路)。设 AQ=a,QB=b,QP=s,不妨设 a<b。

要证明这个算法的正确性,也就是要证明从 P 开始的最长路径的终点一定是 A 或 B。假设从 P 开始的最长路径的终点是 C ,设 CP=c。

由假设知, c>s+b。由于从从 P 开始的最长路径的终点是 C,所以第二次 DFS 将从 C 开始,所得最长路径为 CB=c+s+b>s+b+s+b,又因为 a<b,故CB>s+b+s+b>s+a+s+b>a+b=AB,这与 AB 是最长路径矛盾,故假设不成立,命题得证。

时间复杂度 O(CR),空间复杂度 O(CR)。

代码还是非常 ugly,偷了很多懒,改一下的话应该能更快些。

P.S. 停止切题,准备期中考试。(其实这个星期就没做题)

Tags:,,,

Related Posts

[OI][Vijos 1214]伤心的AsukaNoKaze

Sunday, October 19th, 2008

这题算是个数论题。

其实也没用到什么数论结论,首先手算找找规律。发现,对于 \forall x\in (\frac{n}{i+1},\frac{n}{i+1}],x\in {\mathbb Z}n ~{\mathtt div}~ x 为常数i - 1,于是这一区间内的数就可以只算一次,然后将结果乘以区间内整数的个数就行了。但当i>\sqrt{n}时,每个区间的长度\frac{n}{i}-\frac{n}{i-1}<1,这样就得不偿失了,所以当i<=\sqrt{n}时每个区间处理一次,当i>\sqrt{n}时,进行朴素的计算。

div 运算就这样解决了,剩下的取余可以由整除的结果生成,对于\forall x\in {\mathbb Z},有n ~{\mathtt mod}~ i = n - i(n ~{\mathtt div}~ i),每个区间内,n ~{\mathtt div}~ i为定值,所以令first=\frac{n}{i+1},last=\frac{n}{i},k=n ~{\mathtt div}~ i=i-1,则对于区间(first,last],有\sum\limits_{i=first}^{last}{n ~{\mathtt mod}~ i}=\sum\limits_{i=first}^{last}{n- i(n ~{\mathtt div}~ i)}=\sum\limits_{i=first}^{last}{n-i\cdot{}k}=n\cdot{}(last-first)-k\sum\limits_{i=first}^{last}{i}=n\cdot{}(last-first)-k\frac{\cdot{}(first+1+last)(last-first)}{2}=n\cdot{}(last-first)-\frac{(first+1+last)(last-first)(i-1)}{2}。同样地,当i>\sqrt{n}时,进行朴素的计算。

时间复杂度 O(\sqrt{n}),空间复杂度 O(1)。

算法就是这样了,刚开始写的时候 TLE 了,原因是作为循环条件的 sqrt(n) 没有提前计算出来,于是导致了很多不必要的运算,多么低级的错误……

C++ 代码在这里

P.S. 突然想做编号是大家生日的题目,这题编号是我一个朋友的生日,自己的生日编号的题目的状态是暂不提供……

Tags:,,,

Related Posts

[OI][Vijos 1059]积木城堡

Thursday, October 16th, 2008

一年没写代码了,这周又开始拿起我那二把刀,开始切题了……

看到我们的小妹妹写了积木城堡这个题,于是我也从这题开始了……

简单的 0/1 背包,渐进时间复杂度(大概)是 O(N*n*n),渐进空间复杂度(大概)是 O(N*n*n),其中 N 为城堡数量, n 为组成每个城堡的积木数。

这题有着 Vijos 的一贯传统,就是题目描述令人 confused,就这题来说,从中间抽取积木还能使城堡不倒,不得不说是有一定功力,抽出的积木就扔在一边,不能不说是浪费。其实这都可以在题目中说清楚的。

开始做,一开始用了 bitset (在 NOIP 中允许使用),结果 TLE ;后来优化了读入,还是 TLE,后来砍掉了 bitset ,用 boolean array,提交无数次后(Vijos 最近服务器有问题,运行程序忽快忽慢,随机 TLE 的现象时有发生),终于 AC 了。

代码可以看这里,其他 vijos 的代码也在那里。

事实证明, bitset 的效率并不高,竞赛的时候应远离 bitset …… (这也可能跟 Vijos 所用编译器的实现有关)

Tags:,,,

Related Posts