CSP2019游记

本文记录了一场编程竞赛的实战经历,从题目解析到算法设计,再到代码实现与调试,全面展示了参赛者的思考过程与技巧应用。重点介绍了表达式树、动态规划、贪心算法等核心概念的应用,以及面对难题时的策略调整。

Day -不知道多少

第一轮

题出得挺好,终于没有鬼畜的CCF赞歌了

考得还行

Day -1

复习了Tarjan并伪证了一遍,然后颓废了

安利E17大失败

放了几十个满贯

给某同学科普了一些不好的东西,现在他好像自闭了 我谢罪

Day 0

继续肝Tarjan然后想自闭了

于是写了个左偏树,调自闭了

下午看了今年的博客 发现鸽子本性暴露无遗,跟去年完全没法比了……

看了几篇题解,越看越内疚,就关了

不敢写下去了

Day 1

(直接跳到发题)

密码认真思考……emm……

打开题,一股表达式树的气息扑面而来

T1啥玩意啊

T2啥玩意啊

T3啥玩意啊

……

仔细读题

T1好像是模拟

T2树上括号匹配子串个数?

T3……?

8:30开始写

把构造方法都告诉你了,模拟无误……

模鬼啊,2642^{64}264

下意识地转成二进制发现是个SB题,切了

8:45

T2一眼DP

用回文树的思想乱搞一下……

然后越推越自闭

……先考虑链的情况

……发现没什么区别

然后冷静下来,重新推一波,推出了一个O(n4)O(n^4)O(n4)的优秀DP做法

开始思考括号序列的性质

情况复杂是因为两个可以拼成一个

然后发现如果把一个不能拆分的合法子串称为一个"基本串",那么一个位置结尾最多有一个基本串。

证明:

反证法,设某个位置结尾有两个基本串,设为SSSTTT,其中∣S∣≤∣T∣|S|\leq |T|ST

由基本串定义,TTT的前∣T∣−∣S∣|T|-|S|TS位一定不合法

考虑括号序列的求法:将每个字符入栈

因为SSS合法,所以在栈中会消完,所以剩下的是TTT的前∣T∣−∣S∣|T|-|S|TS位,和TTT合法矛盾。

然后用栈维护基本串在哪里,记录栈顶和栈大小,回溯的时候还原

写出来一发过小样例美滋滋

……然后WA了中样例

造一组小的测出来不对,调试发现栈顶写成了栈大小……

修改后过了中样例

测大样例

激 寒 营 业 不 可 避

什么垃圾样例啊

……然后爆栈了

……然后发现忘了扩栈命令

于是开虚拟机测过了

丢了不管了

9:40

T3一眼不可做

……暴力10分差评

想了个显然的贪心,然后显然挂了

思考了一下完全没思路,10:20

骗分吧

先写个O(n!)O(n!)O(n!)

链的情况好像可以直接贪心?

写一波发现很精神污染

11:00

大脑一片混乱,于是上了个厕所(雾)

回来马上发现可以分治(大雾)

写出来不停WA,被排列过去映射过来搞晕了

把条理理清之后过了自己写的样例

……再测一组WA了

心态崩了,不写了

11:30

开虚拟机编译通过

……然后想起了扩栈命令

水过剩下30min

预计100+100+10=210

出来发现全世界都210

Day 2

由于写这篇游记时隔太久,所以忘了很多细节

打开题面,一股硬核的气息铺面而来。

T1阅读题 读了半天读懂了

T2显然不是DP就是神仙贪心

草样例三爆ull了啊

T3断一条边求所有重心标号和

感觉很可做,但就是不会做

这时

对于type=0type=0type=0的所有测试点,保证最后输出的答案≤4×1018\leq4×10^{18}4×1018

你真棒

怎么比昨天还难啊……看来错怪D1T3出题人了

开始肝T1

……相当于每行最多选1个,每列不能过半,贡献为选的所有数的积,求总贡献

显然DP

数次读错题,一直在想怎么把所有列的信息压缩,怎么都退不出来

到9:30

……10点钟想不出来就打暴力吧

脑子一闪,注意到“不能过半”,这个性质一直没用

会不会有什么特殊性质?

不能过半什么意思?就是比其他加起来都多

也就是最多只有一列过半!

然后容斥就可以了!

f(i,j)f(i,j)f(i,j)表示当前在第iii行,最多的一列选了jjj个的方案数

写了一半发现完全假了,要确定哪一列最多

f(i,j,k)f(i,j,k)f(i,j,k)表示当前在第iii行,第jjj列选了kkk个的方案数

写出来死活过不了样例

唉……?

好像某一行可以不选

可是不选的不统计入总数啊

于是极其硬核地设f(i,j,k,l)f(i,j,k,l)f(i,j,k,l)表示当前在第iii行,第jjj列选了kkk个,一共选了lll行的方案数并推出了极其硬核的方程

iii滚一下就可以了 复杂度O(n3m)O(n^3m)O(n3m) 可能卡得过去?

然后写出来极其硬核的代码,还是过不了样例

10:00

上个厕所,回来一眼就发现下标输错了(弥天大雾)

然后顺利过了所有样例

然后造一组极限数据T了

重新算一下,过得了才有鬼了……

于是只有84分 感觉很近了,但就是想不出来

10:30 弃了

后面只能暴力了……

T2推了一下毫无进展,于是直接O(n3)O(n^3)O(n3)dp艹36分走

T3直接暴力拿40,然后链似乎很好做 共计55

(实际上后面完美二叉树也水得要死)

预计84+36+55=175

那我上不了400啊……

粗略看了一下好像水不了多少分了

于是Linux编译测空间走人

–End–

公无渡河。
公竟渡河!
渡河而死;
其奈公何!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值