2018山东省赛回忆与总结
标签: ACM省赛 总结
真的没想到会打得这么烂。
比赛过程
开场前我们就决定好队长看a-d,田大佬看e-g,而我看h-j。
开场之后,我看了h,i并没有想到思路,然后j题还没有看懂题意,队长就过掉了c。然后田大腿告诉我f题可做,而且当时有三四个队已经过掉了。我看了下题意就去写容斥了,然后差不多二十分钟才写完并wa了一发。队友说a可以写了,于是我打印了f代码去一边找bug,发现运算过程中有些地方忘记取模可能会导致溢出,算法也存在一些问题,而队友则很快过掉了a题。我又回来写F,把算法改正,也修正了很多细节,造了一组比较强的样例也没有卡掉我的程序,自信满满的交上去又wa了。队友猜测可能是运算过程中取模之后出现负数,然后再减去一个接近MOD的值会爆long long,然后我就把所有运算都加上了强制转换__int128,又wa了一发。
这个时候我们三个心态都有点崩,已经开场两个多小时,才只过掉两题,而奕神的队已经五题在冠军位置领榜。我觉得可能是我写崩了,让队长重新写一次f,自己去找别的题。首先是博弈的题,想了一下dp又感觉数据范围太大不可行。然后没找到其他可做题,我又开始想f问题出在哪里(因为当时除了a、c,F是过题人数最多的)。队长写f也写崩了几次,后来交上去也wa掉了,好像后来又折腾几次还是没过。我上去找我写的f的bug,我对算法很自信,觉得只会是细节的问题。
中途找bug期间,队友跟我说了e题也有很多人过了,然后我看了下题意,提出了一些想法但是不知道怎么实现,队友说可以维护前缀最小和次小值,然后我觉得很靠谱,暂时弃掉f一发过了e。之后就是我们轮流上来找f的bug。后来我说f题可能数据有问题,但是其他很多队都过了又不是很确定有问题。队长终于决定要打表找bug,这个时候大概还有不到两小时就结束了,我把打表的活甩给队长之后去看别的题了。
然后立马就发现,之前博弈题的数据范围看错了//汗,然后立马推出了dp的状态和方程,趁着队长打表想好了每一步具体怎么写。然后感觉很稳了就去写了博弈也就是g题,一发过了。
过掉e和g的人数比f少很多。我开始怀疑这个题是不是有除了容斥之外的抖机灵算法。然而虽然想到了但是感觉实现很麻烦,所以也没有写。队长提出用打表程序对拍找错,我们在表里选了一些感觉比较难算对的数据,结果我的程序都通过了。然后队长索性用程序对拍了十万的数据,结果还是只证明了我的程序的正确性。
比赛还剩下不到一个小时,我跟队友说f的数据肯定有问题,比赛完了我要黑了这个题。只做了四题的我们必须再搞一个才能拿金。队友说应该继续做f,但我觉得应该开b,大概想了差不多十分钟b题,我们认为应该二分答案,然后每次二分求一个最大杀戮数,但是就是没有想到怎么求这个最大杀戮数,只要解决了这个问题这个题就很稳了。队友感觉b无望之后继续想f,我偷偷想b题,然而并没有想出来,比赛完了问奕神说是用二分图最大匹配求,恍然大悟。就这样最后一个小时也用没了。
最后两分钟,我把F代码打印了出来。
比赛中的问题
我觉得打这么烂有下面几个方面的原因
1. 实力不够
- 首先是实力上的。比赛完奕神告诉我b题是用二分图最大匹配写时,我想到很久之前exam上贪心专题有一个题跟这个题很类似,然而当时没有学会二分图没做出来,后来也不了了之。最近一个月的组队训练赛,也有两次用到二分图的匹配算法,通常都是还没有学会又要开始补新一场训练赛的题了。而且山大有一支队伍全程没有搞f也还是拿到了7题
2. 过于紧张
- 其次是比赛过程中没控制住心态。一开始写F犯各种低级错误,后来时间剩一个多小时时,还是着急的只想搞出F,我觉得是因为紧张失去了做出正确选择的能力。
3. 不敢勇于开新题
- 事实上当比赛结束后我也还有很多题不知道题意包括D,而从他们的讨论中我知道D是可以用树链剖分写的(据说不用树剖暴力也可以过),如果能把搞F的时间拿出来一点来写D也不会结局这么惨。在以后的比赛中,不管有没有在卡题,三个人都应该把所有有人过的题看一遍,思考下思路。
4. 平时训练
- 首先是训练中留下的一些坑没有及时填掉,所以失去了B题。
- 训练后补题时我总是会花很多时间在还没有人补出来的题上,有时候虽然补出来了但是收获可能不值花这么多的时间
- 训练赛中有些队友做出来的题,赛后就懒得去补一下。其实这种题有队友教反而收获会更大。
- 日常训练太放松了,没有正式比赛时的紧张感
4. 策略问题
- 这次栽在了F上,因为F简单且过的人多所以我们更愿意花时间去搞。下次即使遇到这种简单的过的人多的题,一旦花费时间超过40分钟就应该果断开新题,因为不能排除是数据有问题。(跟好多人说了我要黑了这个题,结果后来才知道F根本没数据
当初省赛报名后不久,我收到邮件老师要让我们队去参加江苏省赛。比赛完问乐神才知道只派了奕神队和我们队,真的对不起老师的期望,我难受的饭吃不下去。无论如何下个月江苏省赛也要打的像个样子。
语言混乱,表达不清,还请海涵。
当时的f代码
```cpp #include ll crs=min(r[1],r[2],r[3])-max(l[1],l[2],l[3])+1;
if(crs<0) crs=0;
crs%=MOD;
ans=(ans - crs*(r[4]-l[4]+1)%MOD+MOD)%MOD;
ll crs2=min(r[3],r[4])-max(l[3],l[4])+1;
if(crs2<0) crs2=0;
crs2%=MOD;
crs=min(r[1],r[2])-max(l[1],l[2])+1;
if(crs<0) crs=0;
crs%=MOD;
ans=(ans - crs*crs2%MOD+MOD)%MOD;
crs=min(r[1],r[2],r[4])-max(l[1],l[2],l[4])+1;
if(crs<0) crs=0;
crs%=MOD;
ans=(ans - crs*(r[3]-l[3]+1)%MOD+MOD)%MOD;
crs=min(r[2],r[3],r[4])-max(l[2],l[3],l[4])+1;
if(crs<0) crs=0;
crs%=MOD;
ans=(ans - crs*(r[1]-l[1]+1)%MOD+MOD)%MOD;
crs2=min(r[2],r[3])-max(l[2],l[3])+1;
if(crs2<0) crs2=0;
crs2%=MOD;
crs=min(r[1],r[4])-max(l[1],l[4])+1;
if(crs<0) crs=0;
crs%=MOD;
ans=(ans - crs*crs2%MOD+MOD)%MOD;
crs=min(r[1],r[3],r[4])-max(l[1],l[3],l[4])+1;
if(crs<0) crs=0;
crs%=MOD;
ans=(ans - crs*(r[2]-l[2]+1)%MOD+MOD)%MOD;
ll L=max(l[4],max(l[1],l[2],l[3])),R=min(r[4],min(r[1],r[2],r[3]));
crs = R-L+1;
if(crs<0) crs=0;
crs%=MOD;
ans=(ans + 3LL*crs%MOD)%MOD;
ans = (sum - ans + MOD)%MOD;
cout << ans << endl;
}
}
// 没过好像是因为没有return 0?
</details>