2019CSP总结

美好的时光总是过的这么快。第一次体验了不用写作业的一周,真是“腐”心一发不可收拾。

很早之前还在盼着比赛,一转眼已经成为亲切的怀恋。

Day0周五

中午时,熊老师给我们开了一个小会,大致讲了要认真审题,正确估计题目难度,自身水平,正确选择题目去做,提高正确率,摆正好心态等几个方面。

坐上车的那一刻,激动的心情难以平复。仿佛又回到了从前,那段与同学一同度过的美好的秋游时光。此时的心情是复杂的,即有对比赛的淡淡的忧虑,又有对旅途的期待。

车行两小时,便到了广州,我们住的酒店。

打开房门,一股被窝的幽香扑鼻而来,仿佛是脱离了家长的“囚禁”的自由的宣言,仿佛是挣脱了牢笼的鸟儿飞翔的身姿。一股脑钻进被窝,久违的温暖与气息顿使浸透了我的全身——是啊,自上次住宾馆以来没有一年也有数月了。

然而最令人激动的是,没有了管理与理智,我和房友(刘盛邦,一个很不错的房友,就是在保存和检索证件方面有所欠佳)便拿了手机,先是给家长大了电话,又是四处拍照,再者就是大开杀戒,或是玩起游戏,或是聊起QQ。

到了10点,便准时躺下了。伴着窗外悠扬的卡拉OK的歌声,怀着一个美好的期许和激动的心,慢慢地进入到异地的梦境中去。

还记得,黑暗中,迷迷糊糊不知是谁裹着被子偷偷看手机,发出微弱的光。

Day1周六

早晨,耳畔隐约响起morning call,又有闹钟铃声,终于醒来,7点不到,就已经收拾好了东西,来到了二楼的餐厅。

进到餐厅,已是人山人海,但仍有各式各样的食物,鸡蛋,牛奶,面包,随意拿了几样,就已吃得肚腩挺起,毫无再食之力。似是因吃学校的菜吃久了,便觉得酒店的早餐是如此美味的吧。

7:40。

所有同学都准时到了车上,出发去考场。在车上,刘盛邦终于放下屠刀,立地成佛,开始摆弄起算法竞赛进阶指南。不一会,广州二中,下了车,莫名的紧张感卷袭全身,来到赛场,一排排电脑整齐摆放于内,仿佛又回到了我们学校的机房,那个熟悉的让小苗生根发芽的地方。

8:25。

“下面宣读竞赛宣言——”

又是熟悉的语段。

“各位选手是否清楚以上细则?”

“是——”

监考员微微点头,有低下来看着手腕上的表,又抬头看向天空。时候不早了吧。终于在8:29时,监考员转过身,拿起一支粉笔,在黑板上写下了解压文件的密码“Ren2zhen0si1kao9?”。随即考场一片敲击键盘声。

......

回归紧张的考试中:

第一题:

考的是思维,难度适中。

但是只能拿95分,原因是没有开unsigned long long

据说long long的范围是 -2^63 ~ 2^63-1 ,

而unsigned long long的范围是0~2^64-1。

莫名丢了5分

第二题:

树上括号问题,题目大意是:给你一棵树,让你求对于每一个点,从根节点到这个点的连续子序列为合法括号序的数量的总和。

不会正解。

只打了个n^2+n log n 的解法,比赛后才发现不用那个log,直接n^2。

枚举节点,直接计算上面的答案加上以这个点为结尾的合法括号序的答案即可。

至于正解,先设g[i]表示 i 以这个点为结尾能往前找到的合法括号序的个数,那么每次我们找到最深的一个点使得这个点到当前dg到的x这一段括号序是合法的(即前缀和a[x]==a[y]),那么这个点x的答案可以由找到的点y的父亲的g值+1转移过来,因为上一段是合法的接上这一段合法的括号序仍然是合法的,+1是y~x这一段括号序。

因此可以用倍增维护从当前这个点到上面的区间最小值。

当a[x]小于等于倍增跳到的点时就可以结束了,因为等于时找到了y,而小于时则是不合法的括号序。

第二种方法则是设last[x]表示从根节点到x中深度最深的没有匹配过的左括号的编号,当dfs到的这个点是左括号是,它的last就是它自己,而是右括号时,它就可以用它与它父亲的last匹配,那么它的last就是它父亲的last的父亲的last。

这样就直接建立了递推关系直接进行递推。

第三题:

玄学问题。

打了个10分暴力。

然而考试后却发现文件名还是调试的文件名而没有改过来,因此又少了10分。

因此,最后的检查至关重要。

第一天估分:95+50+10=155

出来后听到同学们都估的是210。

上午伤身费脑后,中午又收到了来自各方面的打击,下午又要继续奋战,不知算是放松心情还是一场恶战。

来到普及圣地,又勾起了2年前的回忆。

第一题:统计8个字符中1的个数。一个循环(或者8个变量)。

第二题:

给你一个人的乘车时间表,乘坐A车要一点钱,而B车可以从之前距离上B车小于45分钟的一张最早的价格不比B车小的A车记录中用一张优惠券抵消,问你最后花费。题目保证了每个时间点不同。

本来打了队列+一棵权值线段树,但是后来才发现直接往前枚举45位就好了,因为每个时间都不同。

第三题:

设f[i]表示前i天的最大价值。则f[i]=max{f[ j ]+g[ f[ j ] ]}。其中g[i]表示花费和为i的最大价值,这就是一个背包。

时间复杂度O(n^3*1000)。

然而实际上我们发现在某一天买若干件物品再等到某一天卖实际上是等价于一天一天地买后再到第二天卖最终得到的价值的。

因此我们可以直接做n次背包就可以了。时间复杂度O(n^2*1000)。

第四题:

一遍从1开始的spfa,记录每个点到达的时间分别为奇数和偶数的最小步数,最后比较一下输出即可。

估分360,感觉炸了。

到了晚上,刘梓安等人又掀起了点宵夜的热潮。同时还边吃边腐,空气中弥漫着腐败的味道。我的房友也是在10点后才回到房间,这才匆匆洗澡睡觉。而我则聊了会儿QQ,再写了一点作业,时间总在不知不觉中溜过去了。

这天晚上快11点才睡的。

Day2周日

早上实在是起不来,睡眼朦胧,瞌睡连天,整个脑袋都是蜜蜂的嗡嗡声在作响。果然还是昨晚没睡好。心想今天早上的比赛会不会因此而受到影响呢?

虽然是这么想,但仍有些不甘心,总想着今天得更加努力,更要多拿点分,在早餐的盘子里,我用肠粉和鸡蛋摆了一个“300”的字样。

来到考场。

迅速进入考试状态。

第一题:

又不会做,只好打了一个暴力,32分。

然而其他人却打dp可以拿到84分,看来我还是和同学们有差距啊。

84分做法:

我们可以用总数-不合法方案数。

总数就是每一行(总和+1)乘起来-1,表示每一行可以选这么多数也可以不选,但是最后不能一个数都不选。

可以发现不合法方案就是每一列选的个数超过选的总数的一半,因为这一列已经不合法了(超过总数的议案),所以其他列一定是合法的。根据这个性质我们就只用做一次容斥了,那么我们可以设f[i][j][k]表示这一列(设为第l列)的前i行中选了一共选了j行,第l列一共选了k个的方案。

首先f[i][j][k]=f[i-1][j][k](i>1)

如果选a[i][l]这个数,f[i][j][k]+=f[i-1][j-1][k-1]*a[i][l]

若果不选a[i][l]这个数,f[i][j][k]+=f[i-1][j-1][j]*(sum[i]-a[i][l])(这一行其他数的总和)。

最后ans就减去f[n][j][k](k>j/2)就可以了。

时间复杂度是O(mn^3)。

我们考虑如何优化dp,我们发现n是优化不掉的,并且我们只需要k>j/2就可以了,那么其实可以将j和k压为一维dp,将式子化一下,得到:k-j/2>0

2k-j>0

j-2k<0

(j-k)-k<0

观察发现,j-k是除了这一列中其他选的数的个数,而k是这一列的个数,因此,我们相当于用一个新的j'=j-2k表示前i个数中不选这一列的数的个数与选这一列的个数的差为j'时的方案数。

那么f[i][j]就可以从三种递推。

f[i][j]=f[i][j-1]

如果选a[i][l],f[i][j]+=f[i-1][j+1]*a[i][l]。

如果不选a[i][l],f[i][j]+=f[i-1][j-1]*(sum[i]-a[i][l])。

最后我们要减去的答案就是那些f[n][i](i<0)。

这样就能优化到O(mn^2)了。

第二题:

题目大意是:给你一个数列,让你将这个数列分成若干段,使得每一段的数值和不递减,且此段的价值为数值和的平方,求所有段的和的最小值。

这题我原来想的贪心是将一个数往前和后面的较小的数中合并,但是这个贪心是错误的。

于是我又想到分段尽量要多且最后一段尽量要小,于是就从每个点往前找到第一个可以转移的点,直接转移。

第三题:

求删掉每条边后两棵子树的重心编号总和。

考试打了个暴力,链的情况最后没有时间打了,又少了15分。

而二叉树的情况,LZA大佬也打了出来,而我又不会打。

正解是处理出每个点的重儿子和次重儿子。

然后对于一棵树的重心,我们直接倍增跳重儿子,然后直到最深的一个点使得上面点数小于等于n/2。因为两个重心一定是连在一起的,所以我们只需要再判断一下它的父亲是否满足父亲的子树小于等于n/2即可。

那么对于枚举的每条删边,对于深度较大的节点所在的子树可以相当于一棵树的处理方法。

而对于另一棵数,我们同样从根往下跳,当跳到删的边的时候(这个可以用dfs序判断),我们就跳它的次重儿子,再按照之前同样的方法处理即可。

这次比赛虽然成绩不是很理想,但是还是收获很多的。

首先要注意细节,检查很重要,检查要检查文件夹,文件名等。最重要的是内存,其实在考试中C++已经提示了内存太大了,只是我没有放在心上,所以不论遇到了什么问题都要小心谨慎,放在心上,不能随意应付。

而我打完题目后主要是没有时间检查,这说明我的能力上还是有所欠缺,思维不够快,没有想清楚再打。

dp考了一半题目,主要dp思想方法上有点欠缺,因此还需加强在此方面的学习。

这次考试的考点有:

倍增

链表

dp

差值法dp

单调队列优化dp

高精度

类树链剖分

发布了199 篇原创文章 · 获赞 201 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/zsjzliziyang/article/details/103130844