• 2018山东省赛回忆与总结


    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 #include using namespace std; typedef long long ll; const ll MOD=1e9+7; ll f(ll a,ll b,ll c,ll d){ ll l=max(a,c),r=min(b,d); ll ans=r-l+1; if(ans<0) return 0; return ans; } ll min(ll a,ll b,ll c){ return min(a,min(b,c)); } ll max(ll a,ll b,ll c){ return max(a,max(b,c)); } int main(int argc, char const *argv[]) { int t; scanf("%d", &t); while(t--){ ll l[5],r[5]; ll sum=1; for (int i = 1; i <= 4; ++i) { scanf("%lld%lld", l+i,r+i); sum=sum*(r[i]-l[i]+1)%MOD; } ll ans=0; ans=(ans + f(l[1],r[1],l[2],r[2])*(r[3]-l[3]+1)%MOD*(r[4]-l[4]+1)%MOD)%MOD; ans=(ans + f(l[2],r[2],l[3],r[3])*(r[1]-l[1]+1)%MOD*(r[4]-l[4]+1)%MOD)%MOD; ans=(ans + f(l[3],r[3],l[4],r[4])*(r[1]-l[1]+1)%MOD*(r[2]-l[2]+1)%MOD)%MOD; ans=(ans + f(l[4],r[4],l[1],r[1])*(r[2]-l[2]+1)%MOD*(r[3]-l[3]+1)%MOD)%MOD;
    	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>
  • 相关阅读:
    vmware Unable to open kernel device "\.Globalvmx86": The system cannot find the file 的解决方法
    nc和telnet配合使用
    linux下批量替换文件内容
    Linux动态库的导出控制
    goang Receiver & interface
    Go与C语言的互操作 cgo
    Go fsm
    Git多账号登陆
    mysql 安装与配置、使用
    Reverse Integer
  • 原文地址:https://www.cnblogs.com/sciorz/p/9002180.html
Copyright © 2020-2023  润新知