【比赛记录】2021年4月ICPC昆明站

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

【⽐赛记录】2021年4⽉ICPC昆明站
退役记
整个XCPC,从2017年10⽉买了第⼀本书《挑战程序设计竞赛》开始,⼀直学到参加2021年4⽉ICPC昆明站为⽌,历时3.5年的超长XCPC ⽣涯终于结束了。

整个⼤学⽣活除了XCPC真的⼏乎什么都不剩下了(可能唯⼀是2020年6⽉到9⽉摸鱼去腾讯参加了⼀段实习吧)。

在退役的⼀场拿到了第⼀个也是最后⼀个⾦奖,还是⾦奖的倒数第⼀名,还是去掉打星队伍后的⾦奖的倒数第⼀名,能说什么呢,真的只是幸运吧。

从选赛站开始说吧,队友们都想去线下参加,我不太赞成线下因为我觉得到时候可能搞核酸隔离什么的就⿇烦死了,事实证明线下推迟得太厉害直接等到现在疫苗都普及了。

⼀开始考虑去不去澳门,虽然有港澳通⾏证但是怕境外真的要核酸隔离什么的,⽽且时间太赶了(没想到推迟到⽐昆明还后),就选了昆明。

出了报名表之后看见很多强队,就有点慌了,仔细⼀个⼀个查强队们的历史战绩,⾁眼可见⽐我们强⼀截以上的⼤概有接近50队,当时都已经⽆所谓了,战胜20个强队拿⾦牌什么的,我已经不指望了。

不过后⾯我们队伍每星期的三四六⽇都会开⼀场4⼩时的XCPC来练习配合,逐渐的⼤家很默契,在很多个赛区的录像⾥(在不⼩⼼看了赛后榜和听了赛后讨论关键字的情况下)拿了银牌⾦牌,觉得希望是逐渐提升的,但是具体提升是多少实在不清楚。

联想起wls等使⽤CF分对区域赛成绩进⾏的估计,CF2000分对应⾦牌实⼒,仔细算了⼀下我们是2047分,也真的有⾦牌实⼒。

回想起南京卡的那个树上背包,后来在div1的C见过,是个2400分难度的题,那么我感觉可以估计⾦牌题就是2400分难度,所以平均分是2047分的科技互不相同的三个⼈,在时间延长3⼩时并且配合默契的情况下搭配着打出2400分的题,是不是就是这个理论的来源呢?
最后证明这个理论可能是正确的,J题和M题都是要⼤家配合着通过的:J题M⼤佬和Q⼤佬⼀起从多个⾓度理解构造,然后⼀起检查代码是否实现有问题(没错我们真的有code review),还assert了⼀发确认代码实现没有错(意思就是算法错了),虽然后⾯数组开⼩了发⽣段错误(⽜客⽹OJ居然会提⽰RE的种类?!)罚了20分钟,那时候可能⼼急了,还好全场只有那⼀次的⼩dirt,相⽐其他⼈的超过dirt次数我们最后真的就靠6分钟的罚时优势胜出;M题是q⼤佬推了很久的区间前缀和作差,然后指出是离散化后两棵对应区间的权值线段树的差值,然后在这个差值上⾯找不超过x的数的前缀和,然后他翻了翻板⼦发现他的主席树没有离散化的!我想了下好像⽐赛前⼀天晚上没睡着看了看2019年去徐州站的时候带的板⼦,⾥⾯有我亲⼿撸的全功能主席树!打开两年前的东西⼀看发现两年前的⾃⼰已经帮现在的⾃⼰离散化好了,建⽴主席树的整个流程也有详细的中⽂+代码的⽰意,还提供了全功能主席树的各种版本的实现指导!12分钟敲完整个主席树然后套上Q⼤佬推出的询问公式,再对⼀对样例,总共花了18分钟就过了这个卡了4个⼩时的M题!这就是传说中的“现在的你⼀定会感谢两年前努⼒的⾃⼰”吗?!作为⼀个两年没有见过杜教筛和主席树的⼈,新的模板⾥⾯都直接跳过了这俩了,没想到这⼀场退役站都出了,真的是不知道说什么了。

回过头说⼀下I题和K题吧:
I题是计算⼏何担当M⼤佬完全⼀个⼈单推的,另外两个⼈题⽬都没看,然后就1A了,学了⼏年的计算⼏何在关键时刻终于依靠快速实现和0dirt争取到罚时优势拿到⾦牌,M⼤佬应该很开⼼!
K题是个⿇将题,最后看榜发现真的很多队伍都不会打⿇将,就像我们队伍不会这个主席树⼀样。

我们的实现就是枚举舍弃的牌和新加⼊的牌,然后dfs去check是否和牌,中间加⼊了⼀堆乱七⼋糟的剪枝并且这些剪枝⼀度把正确答案给剪掉了!我感觉这题确实是不好搞的,要有⽐较丰富的代码实现功底(卡常经验)和⽐较丰富的dfs经验。

第⼀件事就是搜索的时候状态的设计,这⾥是传统的⽤cnt[x][y]表⽰第x种花⾊的第y张牌的数量,放在全局数组⾥⾯进栈⼊栈时修改。

然后搜索的应该是“每张牌去组合出什么牌型”⽽不是“由哪些牌型组合以及这个牌序由哪些牌组合”,这个假如第⼀步就错了应该就会写得很憋屈吧。

然后就是要记录是否当前已经⽤过了雀头,否则就会搜索出AABBCCDDEEFFGG这种七对⼦,或者更离谱的AABBCCDDEEEFFF这种什么牌型都不是的组合。

然后就是要考虑怎么减少dfs的重复搜索问题,⼀种思路是对牌型状态进⾏hash,记录某种牌型是否是和牌牌型,这个我写了⼀下我就放弃了(好像清华是这样写的)。

我改成枚举每⼀张牌参与的牌型是什么,也就是说假如这⼀张牌 (x,y) 参与组成a个雀头b个刻⼦c个顺⼦,⼀张牌组成顺⼦是指它作为顺⼦的最⼩的那张牌出现,那么需要满⾜下⾯的条件:
1、若a==1 ,则现在dfs的状态中,必须没有雀头,否则就有两个雀头了,是⾮法状态直接跳过。

2、 2a+3b+c==cnt[x][y] ,也就是恰好等于这张牌的所有出现次数,⽴刻在这⼀层就把这张牌的所有出现次数⽤完,这样以后就再也不会搜索等价的牌的状态了,这样避免了你搜索我我搜索你。

3、cnt[x][y+1]≥c,cnt[x][y+1]≥c,也就是这张牌真的能组成c个顺⼦,把后⾯的连续两张牌也⽤掉。

除此之外要注意,字牌是不能组成顺⼦的,还好打过⽇本⿇将,不然看半天都不知道错哪。

第⼆种剪枝是:check成功之后要及时返回,因为这⾥只问是不是和牌,没有问和什么牌型,这⾥写成“在这⼀层及时返回”就⽐“在上⼀层不进⼊下⼀步搜索”要简单。

第三种剪枝是:可⾏性剪枝,每种花⾊的牌,也就是cnt[x] ,都必须是 3k或者 3k+2 的数量,并且为 3k+2 的花⾊必须只有恰好⼀种。

这是⼀个超级⼤的剪枝,因为后⾯搜索⽴直之后听什么牌的情况,调⽤dfs前是随便枚举⼀张牌的话,⼤概率连花⾊内部的数量都凑不全。

这个剪枝应该可以在暴⼒枚举“进张”的时候剪除掉90%的dfs搜索树,是真的直接从树根⼀⼑剪掉了,是不是应该改叫“剪根”呢?
第四种剪枝是:重复枚举剪枝,这个是要在调⽤dfs前进⾏的,⽅法是给⼿上的牌排个序,然后枚举打出某⼀张牌的时候,若前⼀张牌和现在的牌⼀样,则说明已经枚举过了,直接跳过这张牌的枚举。

第五种可能的“优化”是:优先搜索字牌,因为字牌的牌型是固定的,只能有3k+2这种组合,假如是先搜索别的最后搜索字牌,这个步骤会重复在dfs的每个叶⼦出现,这样⼦调整搜索顺序会让搜索树的叶⼦消耗更多,但是枝⼲分叉更少,这个“优化”可能会是负优化。

这次⽐赛只⽤了前四种剪枝,从结果上看还好没写第五种,要不可能罚时就失去了那6分钟的优势了。

写完M题的时候还有30分钟,⼿⾥还有⼀个不知道15怎么⽤的C题,实在已经假得放弃希望了。

相当于挂机到结束看封榜了,看见最后是38名当时觉得挺失落的吧,因为感觉打星队伍不会有这么多在前⾯,M⼤佬执意要拿打星队伍名单数⼀数,发现前⾯打星的⼈刚好是3个,真的就正式队伍第35名最后⼀个⾦牌呗?不过我学了3年的数学,最后真的和⾃⼰预测的⼀样,⼏乎没有机会⽤上了,因为需要⽤数学的题可能已经是稳⾦之后了。

2019年的徐州站和2020年CCPC的⽹络赛应该是我参加的正式赛⾥⾯唯⼀⽤到数学的吧。

流⽔账
H签到题,打好⽂件发现过了400个⼈,哇真滴nb,CF都不敢这么搞。

没啥好说的,不过想diss⼀下那个10秒过题的。

L签到题,⼀开始q⼤佬就开了这个,我觉得还挺难的,后来觉得应该不要从图的⾓度考虑,直接贪度数,结果也是不对,突然意识到是不是每有⼀次下降就要开⼀种新的颜⾊(虽然也是错的)。

后⾯还是直接归纳了,放a[i]的时候前⾯有j<i且a[j]>a[i]的,这些颜⾊都会和ai连边,所以每种颜⾊只需要保存最⼤值,这个就线段树或者树状数组维护⼀下后缀和就⾏。

I题,计算⼏何,m⼤佬偷偷1A的,都没来得及看。

然后开J题,并⾏排序,每次可以交换两个位置,问最少交换⼏次。

⼀开始m⼤佬搞个每次每个环siz减半的,看起来很对,然后交上去挂了。

与此同时,⼀车⼈过了M,但是我们死活不知道M是⼲嘛的,还在想是不是不强制在线的话搞个莫队,或者弄个奇怪数据结构维护前⾯连续可取的⼀段和后⾯的⼀堆离散的点,但离散的点总是O(n)个,实在没想到怎么做。

搞不懂为什么全世界都会M,想着可能我们陷⼊坑⾥了。

换题,我去搞K,打⿇将。

q⼤佬说这个⿇将让我写,很快就⾏。

hhh事实上我写了很久。

K很快可以dfscheck到⾃摸,⽤的各种奇丑的dfs,这时q⼤佬告诉我这套⿇将可以有⽆穷张同样的牌,我这个就应该不对了,⽽且不知道怎么check⽴直,想了想直接暴⼒枚举换掉哪张然后调⽤上⾯的⾃摸就⾏了。

m⼤佬说想交⼀发assert看看是哪⾥错了,我其实是不太想的,可能我当时觉得J还是有机会的吧。

⼜过了⼀段时间,K的⽴直搞出来了,不过⼀直多了⼏种答案,打印出来看看。

这时m⼤佬就交⼀发assert给J,WA了,这时说明J是算法问题不是实现问题,从结果来看这20分钟是完全值得的。

我想好之后,给K换了枚举刻⼦数量和顺⼦数量的⽅法,然后给搞了⼏个阴间剪枝,想着要不交上去试试吧。

这时J题m⼤佬和q⼤佬也⼤
呼“只需要操作两次”,反正没听懂,头⼀直晕晕的,他们交上去段错误了,居然!居然开⼩了!改了之后就过了。

我的阴间剪枝跑得飞快,K在J的2分钟之后就过了。

然后⾃闭的时间就开始了,期间去看了看C,觉得是个区间DP,想假了复杂度上去连T两发,是真的没睡醒。

然后往往复复不知道是看C还是看D,都不知道他们咋搞的,以为D是南京H的复现,上去演了⼀发,算咯。

在4⼩时封榜之后,准确说是15:07,q⼤佬突然意识到M这个东西可以⽤前缀和对应节点作差,然后求⼀段区间和加上去模拟。

然后这个东西看起来就很主席树,这时候让q⼤佬去上机,我和m⼤佬看看有什么细节。

不过q⼤佬的主席树没有离散化,就下来了,我突然想到昨晚我记得我两年前的板⼦⾥⾯有我的码农⼼⾎,找出来的时候是15:12,然后⼀路⼿速爆抄,再调了7分钟,在15:30的时候提交了⼀发1A。

然后其实当时就有点不太想继续做了,就开始装模作样的给C题反复交假算法,哈哈哈。

挺有意思的吧,假如当时去看G可能30分钟可以?但是作为⼯具⼈的我已经很疲倦了,没有⼈能写了,我觉得还是放弃吧。

封榜出来38名,当时觉得有点可惜,m⼤佬⾮要去数数前⾯有多少个打星的,我觉得哪有这么多⾦牌打星队啊,算了吧。

结果⼀看真的有刚好3个,我们就最后⼀个⾦牌的位置。

Processing math: 100%。

相关文档
最新文档