Battle of the Brains
ACM
ACM,algorithm
当我跑步的时候,我在想些什么
十一 7th
“Pain is inevitable.Suffering is optional.”
这句话据说是一个马拉松运动员跑步时激励自己候念的魔咒.
42.195公里,心里不想着形形色色的情况,怕是没办法坚持下来.
我跑完之后回忆了一下我心中想的最多的一个词或者是一句话…
结果很让我羞愧,我这粗俗的人心中默念最多的话就是”fuck”了吧,好在这句咒语起了作用让我坚持了下来
0km:
好多人啊.挤的密密麻麻的,还不时有跑友互相打招呼,好不热闹
我们学校真拉轰,跑马拉松还扛着个旗子跑有木有.
人家扛着旗子跑,我空手跑怎么说也得跟上.
好的,目标就是跟着旗子跑了
5km:
速度还不错,跟着大部队,也不气喘,也不吃力,感觉还能加速
听到周围发出”哇,跑全程还背着旗”,”哇,竟然是杭电的”,”我们也不能输”的唏嘘声
这么光荣的事怎么得我也得掺上一把
我得主动请缨,也抗上一段路
10km:
把旗子交出去之后,仿佛力气也随之流失,加上一个上坡,怎么觉得跑不动了,唉,撑到下一站喝下运动饮料应该会好点吧
补给站到了,没想到停下来喝了口饮料,和旗子就已经相差50m了
看着前面旗子飘扬,真想赶上啊,可是不管我怎么提速,旗子怎么就越来越远呢?
啊,又过了一个上坡,一个拐弯,旗子看不见了.
15km:
膝盖好疼,一定是平时训练少了
感觉马拉松发的衣服好刺人,胸口刺刺的,耍流氓就耍流氓吧,脱光了跑
咦,刚刚那超过的我小巧姑娘竟然这么能跑,怎么说也不能输给一个看上去这么较弱的姑娘啊
如果当时你在场,就会发现这么一幕:一个几乎裸体的猥琐男追着一个清纯的姑娘在跑.
20km:
那姑娘在进了一条隧道之后就跟丢了,顿时觉得前途一片黑暗
大腿根部抽筋好痛,保持不住了,我要停下来走走,这里人这么多,还是等等到没什么人的地方停下来休息吧
2公里的折返点遇到了扛旗大队,叫我慢慢跑
悲剧,已经被他们拉出了这么远了
时限4小时的气球兔子(跑步期间有MM带着兔子的发卡,身后吊着个气球,帮助大家掌握各个时限)带着一帮人从我身边华丽而过,要是能保持之前的速度,说不准可以在4小时内跑到呢,可怜现在我只能无奈着看着这波人消失在视野中
前面是一个医疗站,我去问一下有木有止痛剂或者麻醉剂,想注射一针让我能做机械运动
可恶,刚刚那个医生说只接收伤员
25km:
如今只能走100m,做几个活络胫骨的运动然后跑500m,而且这跑近乎于步行.
妈的,刚刚收容的放弃人员的车子竟然向我鸣笛,示意我上车,我竟然已经搓到这个地步了
TMD我要是上车我就不是胡浩,腿抽得废了也不上车
又被两个一起出发的朋友超过.
路边一老汉正在用一支奇怪的喷雾剂,不管怎么样,借来用一下吧,希望能有效果
30km:
喷雾剂竟然起效果了,大腿不抽筋,又能跑了.
一个外国MM听着nano6从我身边一瘸一拐的缓慢跑过.
要是我的nano6修好了估计也可以这么一边听音乐一边跑吧
于是我不要脸的用我那蹩脚我英语上前说我们一起跑吧.MM爽快的答应了
可惜跑步的时候光顾着喘气了,都没力气交流
就这样,我们两个人像蜗牛一样走走停停.
期间遇到了到阿里的补给站,很大方的递过来两瓶佳得乐
结果MM说不要,于是我很尴尬的一手一瓶没开的佳得乐,拖着残腿的双腿,一路蹒跚着(跑了两公里后交给了路旁的志愿者)
35km:
时限5小时的气球兔子在我们休息的时候从身边跑过.
跑步过程中我才知道原来跑马拉松是有时间限制的,超过5小时就没有证书云云…
为了这5个小时留下点纪念的东西,不得不咬着牙着这最后的期限跑.
这个时候我的腿又抽了,但是不管怎么样,都得跑了,不然5个小时没跑到脸就丢大了.
但是国外的那个MM在一个补给点停下来喝水了,后来没有跟上,可惜啊,连最简单的”I’m HuHao,what’s your name”都没交流上.
气球兔子说他跑到的时间大概是4h58m,身后400m开外的人已经没有希望了,我连回头看的力气都没有,怕一回头身体就失去了平衡或者停下脚步,完全是机械运动
好饿啊.跑完一定要好好吃一顿!
41km:
遇到了我们学校一起的张键,他在30km的时候超过了我,眼看现在他就要被气球兔子耍在身后了,给他鼓劲叫他跟上
庆幸的是他最终以”4h59m59s”的成绩完成了比赛,成为这次马拉松最幸运的人,他那证书太给力了,早知道我也在终点前停一会,等最后一秒再迈过去
42km:
最后想来个华丽丽的冲刺,结果发现脚已经麻木,只能维持原速.恐怕一停下来就没力气再向前迈一步了
终点:
终于有吃的了,我从来没有像现在这么饿,接到食物不管怎么的,随便挨着个东西就坐倒在地上一顿猛吃,吃完后还不要脸问志愿者再要了一份…
虽然一直认为马拉松这玩意又不是技术活,只要咬着牙,只要够不要命,够自不量力,不管谁都能做到
但是这次在半途就抽筋的情况下还坚持跑完,我都不得不佩服一下自己了.
别人说跑全程需要准备三个月,我才准备了20天,累计跑步70km.实在太勉强了
持续跑步,没事就去跑个20,30圈,来年再战
Popularity: 6% [?]
如果你是ACMer,你会选择哪个职业?
八 19th
2011阿里巴巴程序设计公开赛
八 19th
【完全版】线段树
七 25th
精彩不亮丽,起落是无常
六 2nd
在去美国的飞机上,看了之前买来一直没看特地留在飞机上看的《伯符》,描绘了小霸王孙策的精彩而不亮丽的一生:江东猛虎孙策17岁丧父,10年建以其惊人的速度打下江东,开创大业,成为当时最年轻的强大军阀之一,最后却在形势一片大好的情况下命陨于吉之手。
“精彩不亮丽,起落是无常”成为了他这一生的总结。想不到这句话恰恰也成了我ACM-ICPC最后一场比赛的总结。
随着Poucher幽默发言和倒计时的结束,2011 World Finals开始了,我找了道题目描述最短的E题开读,了解题意后马上想出解法,坐标旋转45度后做二维区间统计,数据量正好合适,可搞。于是我开始coding,同时叫小丽帮忙推出坐标转化函数,边界情况RE一次后得到了全场第一个E的气球。这感觉有点梦幻,虽然平时刷水题的速度是挺快的,但是在全世界高手云集的情况下拿到first blood还是从来没有想过,加上赛前知道第一个AC某道题目的队伍能拿到1050$。很开心的和工作人员合影,这大概是我这次旅途最开心的一张照片。
之后开了很多队伍过了的C,J,K。
K题很简单,凸包后做简单枚举,1Y。
J题是背包,但是要输出方案,提交WA后先放一边。
C题识别图像,抓住有几个“洞”这特征后非常简单,2Y。
这时候感觉时间才过了不久,已经是3题并且有一题的代码找出bug后就能AC了,形势一片大好,很少有一场比赛有这么顺利过。
想到刘汝佳赛前和我说的finals的题往往要集两三人的智慧才能找到bug,于是我决定小丽和我一起debug。确实找到了一些bug,并且每次在修改提交前都感觉能AC了,点submit的手都有点激动的发抖,但是返回Wrong Answer的结果瞬间给我泼了冷水。在尝试N次且没有新思路和反例后,小丽想到了A的大致解法,我想了一遍觉得可行,但是看答案竟然和J一样是要输出最小字典序的方案,两小时debug无果的经历使我非常痛苦。现在的情形已经不容我犹豫,coding完A的代码后竟然直接就出了sample和自己造的一些例子,这种题通常都要debug一会才能出例子,小丽都在边上叫“哇,这么顺利,瞬出sample,有不祥的预感”。果然返回的Wrong Answer印证了不祥的预感,剩下的半个多小时在我们非常痛苦的debug中一点一点流逝了。
这次finals我的目标是不留一点遗憾,但这场比赛留给我的遗憾比以往任何一场都大。完美的开局,惨淡的结局。
今年和去年的finals题差好多,去年的中等题想到解法就能AC,今年的却不是考想法,而是trick,可能这才是正常的finals吧。赛后有一段时间一直在抱怨这类题目,工作中的bug至少还知道bug的一些特征,只要让我知道了bug在哪一定可以马上搞定。可惜抱怨没用,竞赛就是竞赛,哪怕只是一点点的错误,最后导致的结果也是天差地别。
一直想找种观念来排解内心的苦闷,前段时间看《圣经》里的《传道书》,里边的虚空论虽然可以排解人生一切苦闷,但是我却还没所罗门王得那种能看开一切的智慧。后来刘汝佳在GTalk上给我留言说有这种经历也是好的,我听了后渐渐释怀了,这场finals并不是终点,仅仅是我漫长道路上的一段小经历,并非没达到期望天就塌下来了,太阳还是照常升起,我的旅途也刚刚开始。这段经历没能让我旅途的起点足够高,却给我了旅途中更重要的智慧,因为每次痛苦过后就是成长。
我的ACM-ICPC的生涯以及最后一场比赛都是那么的精彩,但不亮丽,起落,却是无常。
接触计算机编程到第一次参加World Finals仅一年时间,精彩么?
最后一场比赛成为最遗憾的一场比赛,无常么?
哈~
Popularity: 17% [?]
【完全版】插头DP
二 24th
ZOJ Monthly, January 2011小结
一 30th
回家后就堕落了,没能在家里宅满一整天,天天出去玩,只做了一场TC,而且还扣分了(本来接近的红又越来越远,欲哭无泪啊).
11点半被叫醒,本来今天也不会做的,说好了和一个MM到外边骑马去,午饭都还没来得及吃,和晓立打了声招呼说不做了,不过匆匆扫了一眼题目发现竟然有一道插头DP,而且还是非常规六边形的.我去,当时我就想这道题除了我之外世上还有多少人能在比赛的时候AC它啊(容老衲自恋一番,捏哈哈哈哈哈哈),内心十分矛盾,一方面是和MM的约会,一方面是彰显我插头功底的时候.当时心内还是准备和MM出去玩的>_<
好在这的时候MM打电话过来说那个骑马场过年关门了,要到年后才能开,一个外在的因素让我不用做抉择使得我如释重负.
于是开始做这次的月赛:
J:首先在刷牙洗脸上厕所的时候想了想这六边形的独特之处:有六个边,不过和常规的一样只能有两个度.
好在这题的宽是确定的8,不过却是左边对齐,而不是上边对齐,而长度可能会有10,这又显的稍稍麻烦一点
在纸上画了画(家里笔和纸都没,翻了半天找到小学时候的作业本的铅笔,好在一样好用^_^),发现轮廓线都会变,OMG,这么神奇.
0246列的时候轮廓线只有15个单位,到1357就变成了17个单位,并且是从中间多出来的,不好搞不好搞…
并且0246的时候只有两个已知插头,1357有四个(关键就是那多出来的两个).
于是细心分解后把插头的对应转移关系理清楚,我多设置了两个bit来保持多出来的轮廓,万事准备OK,开始coding.
足足敲了250行,差不多是我写过的插头里边短时间敲出来的最长的代码了,主要是奇偶列还要分出来写,情况还真的是很多.
好在sample给的还算和谐,没有给超级简单没用的sample,还是让我找到了很多个编码时的bug.自己出了几个验证性sample也过了,提交结果是WA,修改了几个漏洞之后发现题目竟然还读错了,多加了一个条件(圈的长度要大于3,题目说的是至少是3,但是小于3也够不成圈啊)我还为这条件想了好久,加了好多个判断,于是反斜杠反斜杠,终于返回了一个期待N久的Accept,哇靠,那敢情,比进finals了还激动..
接下去就正常了,晓立已经把H和I搞定,我看了下过的人最多的D,推敲一下是网络流(小菊花在吃年夜饭,我好久没搞网络流,不过也只好我自己上了),由于笔记本没装dropbox,叫晓立那边仍个模板过来,结果网络流模板太多,丢了好几个才丢中,边界RE TLE了几次后也顺利过了.
接着A过的人比较多,一看就是打表的题,于是马上叫晓立写个暴力的,我去看G,属于比较简单的DP,手指5和9那里的关系(当时我就想不通为什么5个手指可以按9个键=.=)搞了一会后出sample就1A了,晓立接着也搞定了A
还剩15分钟,挣扎着看了一下B,和小丽讨论一下发现没希望了….后来AC大牛说我们OJ有个简化版的(当时还是他教天涯的,而我又是请教天涯的,当时印象中他和我说了两个方法,我就记得一个特殊的递推的方法.残念)
哈哈,今天做出了J题还是蛮开心的,虽然没能和MM出去玩T^T,晚上出去找朋友逛去,坚决不再家里宅一整天时间
附上J题代码(算是插头的一个模板,本来想寒假整理的,不过资源全在实验室电脑里没带回家,还是等回去再发完全版插头dp好了,有兴趣的可以先研究下下面代码):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 | #include <cstdio> #include <string> #include <algorithm> #include <cstring> using namespace std; #define LL long long int n , m = 8; bool maze[11][9]; const int HashSize = 300007; struct HashMap { int HashChart[HashSize] , sz; int MSK[HashSize]; bool A[HashSize]; bool B[HashSize]; LL dp[HashSize]; int next[HashSize]; void clear() { sz = 0; memset(HashChart, -1, sizeof(int) * HashSize); } inline void push(int msk, bool a, bool b,LL val) { int x = (msk * 4 + a * 2 + b) % HashSize; for (int it = HashChart[x] ; it != -1 ; it = next[it]) { if (MSK[it] == msk && A[it] == a && B[it] == b) { dp[it] += val; return ; } } MSK[sz] = msk; dp[sz] = val; A[sz] = a; B[sz] = b; next[sz] = HashChart[x]; HashChart[x] = sz ++; } } HM[2]; HashMap *src = HM; HashMap *des = HM + 1; LL plugDP() { src->clear(); src->push(0,0,0,1); for (int i = 0 ; i < n ; i ++) { for (int j = 0 ; j < m ; j ++) { des->clear(); for (int k = 0 ; k < src->sz ; k ++) { int msk = src->MSK[k]; LL val = src->dp[k]; bool a = src->A[k]; bool b = src->B[k]; //printf("%d %d %d %d {",i,j,a,b); //for (int it = 0 ; it < 15 ; it ++) { // printf("%d ",(msk >> it) & 1); //} //puts("}"); if (j & 1) { bool p = ((msk >> (j*2)) & 1); bool q = (j == m - 1) ? false : ((msk >> (j*2+1)) & 1); int cnt = 0; if (p) cnt ++; if (q) cnt ++; if (a) cnt ++; if (b) cnt ++; if (maze[i][j] == true) { if (cnt == 0) { msk &= ~(1 << (j*2)); msk &= ~(1 << (j*2+1)); des->push(msk , false , false , val); } continue; } if (cnt > 2) continue; if (cnt == 2) { msk &= ~(1 << (j*2)); msk &= ~(1 << (j*2+1)); des->push(msk , false , false , val); } else if (cnt == 1) { //1 int nmsk = msk; if (i != n - 1 && !maze[i+1][j]) { // if (b && ((msk>>(j*2-1)) & 1))continue;//length 3 nmsk |= (1 << (j*2)); nmsk &= ~(1 << (j*2+1)); des->push(nmsk , false , false , val); } //2 if (j != m - 1 && !maze[i][j+1]) { // if (q && ((msk>>(j*2+2)) & 1)) continue;//length 3 msk &= ~(1 << (j*2)); msk |= (1 << (j*2+1)); des->push(msk , false , false , val); } } else if (cnt == 0) { if (j != m - 1 && i != n - 1 && !maze[i+1][j] && !maze[i][j+1]) { msk |= (1 << (j*2)); msk |= (1 << (j*2+1)); des->push(msk , false , false , val); } } } else { bool p = (j == 0) ? 0 : ((msk >> (j*2-1)) & 1); bool q = ((msk >> (j*2)) & 1); a = ((msk >> (j*2+1)) & 1); if (maze[i][j]) { if (!p && !q) { b = false; msk &= ~(1 << (j*2)); msk &= ~(1 << (j*2+1)); if (j) msk &= ~(1 << (j*2-1)); des->push(msk , a , b , val); } continue; } if (p && q) { b = false; msk &= ~(1 << (j*2)); msk &= ~(1 << (j*2+1)); if (j) msk &= ~(1 << (j*2-1)); des->push(msk,a,b,val); } else if (p || q) { //1 int nmsk = msk; if (!maze[i][j+1]) { // if (q && a) continue; //length 3 b = true; nmsk &= ~(1 << (j*2)); nmsk &= ~(1 << (j*2+1)); if (j) nmsk &= ~(1 << (j*2-1)); des->push(nmsk , a , b , val); } if (i == n - 1) continue; //2 if (!maze[i+1][j]) { nmsk = msk; b = false; nmsk |= (1 << (j*2)); nmsk &= ~(1 << (j*2+1)); if (j) nmsk &= ~(1 << (j*2-1)); des->push(nmsk , a , b , val); } //3 if (!maze[i+1][j+1]) { nmsk = msk; b = false; nmsk &= ~(1 << (j*2)); nmsk |= (1 << (j*2+1)); if (j) nmsk &= ~(1 << (j*2-1)); des->push(nmsk , a , b , val); } //4 if (j && !maze[i+1][j-1]) { // if (p && ((msk >> (j*2-2)) & 1)) continue;//length 3 nmsk = msk; b = false; nmsk |= (1 << (j*2-1)); nmsk &= ~(1 << (j*2)); nmsk &= ~(1 << (j*2+1)); des->push(nmsk , a , b , val); } } else { if (i == n - 1) continue; //1 int nmsk = msk; if (!maze[i][j+1] && !maze[i+1][j]) { b = true; nmsk |= (1 << (j*2)); nmsk &= ~(1 << (j*2+1)); if (j) nmsk &= ~(1 << (j*2-1)); des->push(nmsk , a , b , val); } //2 if (!maze[i+1][j+1] && !maze[i+1][j]) { nmsk = msk; b = false; nmsk |= (1 << (j*2)); nmsk |= (1 << (j*2+1)); if (j) nmsk &= ~(1 << (j*2-1)); des->push(nmsk , a , b , val); } //3 if (!maze[i+1][j+1] && !maze[i][j+1]) { nmsk = msk; b = true; nmsk &= ~(1 << (j*2)); nmsk |= (1 << (j*2+1)); if (j) nmsk &= ~(1 << (j*2-1)); des->push(nmsk , a , b , val); } if (j && !maze[i+1][j-1]) { //4 if (!maze[i][j+1]) { nmsk = msk; b = true; nmsk &= ~(1 << (j*2)); nmsk &= ~(1 << (j*2+1)); nmsk |= (1 << (j*2-1)); des->push(nmsk , a , b , val); } //5 if (!maze[i+1][j]) { nmsk = msk; b = false; nmsk |= (1 << (j*2)); nmsk &= ~(1 << (j*2+1)); nmsk |= (1 << (j*2-1)); des->push(nmsk , a , b , val); } //6 if (!maze[i+1][j+1]) { nmsk = msk; b = false; nmsk &= ~(1 << (j*2)); nmsk |= (1 << (j*2+1)); nmsk |= (1 << (j*2-1)); des->push(nmsk , a , b , val); } } } } } swap(src,des); } } for (int i =0 ; i < src->sz ; i ++) { if (src->MSK[i] == 0 && src->A[i] == false && src->B[i] == false) return src->dp[i]; } return 0; } int main() { int m; while (~scanf("%d%d",&n,&m)) { memset(maze , false , sizeof(maze)); for (int i = 0 ; i < m ; i ++) { char str[3]; scanf("%s",str); maze[ str[0] - 'A' ][ str[1] - 'A' ] = true; } printf("%lld\n",plugDP()); } return 0; } /* 2 12 AC BC AD BD AE BE AF BF AG BG AH BH 2 13 AB AC BC AD BD AE BE AF BF AG BG AH BH 3 7 BB AD BD CD BF AH CG 3 15 AA BA CA AB BB CB AC BC CC AD BD CD BF AH CG 3 16 BB AD BD CD AE BE CE AF BF CF AG BG CG AH BH CH */ |
Popularity: 16% [?]
[zz]让IT人士远离慢性疲劳
一 16th





近期评论