比赛时间安排
7.40-7.50
t1 可持久化trie??冷静冷静,若干个数,所以还是先好好暴力吧(笑)
t2 dfs会写,感觉数据范围挺小的
t3 kmp ?
7.50-8.10
t3第一档写完,刚开始一直错,发现是kmp开头结尾有多余字符了,索性直接新开一个串,用函数kmp,就过了
8.10-9.00
那这t3 60不是送的吗?区间修改单点查询,难熬是线段树?算了,还是差分吧。写完后发现样例不对,和暴力打表对比了一下,发现子串的贡献加错了,重新想了一下,应该是前缀和,于是改了之后样例过了。然后对拍,拍5秒左右都没有问题,那就先放个大一点的数据跑久一点吧,结果直接出错了,答案多了1,我在想会不会是重复字符多就有可能错,于是小数据只有ab的拍了一下,发现确实很快就错了,发现不能直接把d数组变成前缀和,而是要新开一个记录d的前缀和,然后就过了
9.00-9.10
t2 暴力写完
9.10-9.40
t1暴力写完
9.40-10.25
觉得这种异或类问题怎么着也要用线性基吧,就上了,类比01trie,尽量让d的二进制位上是0的位置变成1,在答案^D[i]的同时,d也要异或,这样才能保证一直找的都是最优的,不然可能原来这一位是0,异或了一个线性基之后变成1了,但是又被异或掉了
10.25-11.10
想t1的下面几档,感觉数据范围没差多少,而且很明显是根号做法,那就莫队呗,然而一个严肃的问题,我忘了怎么删除线性基了,极其自闭,最后写了一个固定左端点,右端点跑的做法(虽然一定会被卡),我的八纵八横啊!
11.10-12.00
怎么看怎么觉得t2是个dp,就开始推式子,突然想到online的入门t3,当时瞄了一眼题解,设的是s串的哪个位置匹配到了t串的哪个位置,我觉得挺好的诶(可惜转移没认真看),就设了状态f[i][j]已经考虑了前i个装甲,第i个装甲匹配的炮弹穿透力是j,的答案,此时应该先将装甲从小到大排序,才方便转移,而且顺序不影响结果嘛,然后就开始推,发现这样计算很奇怪,于是把f变成方案数,g是答案,g的运算基于f,结果最后还是调不出来
赛后总结反思
- 时间安排上还算可以,不过最后一个小时不太划算
- 能想到很多之前学过的东西,起码不空了
- 不要太死板,不会撤回线性基,那就直接拿新的数组存状态,然后回滚!爆哭
- 平常写题的时候一定要理解透彻
与正解的差距
T1
首先澄清,八纵八横并不是可撤销线性基,而是增添了时间的限制,那里面要求的是最大值,所以越高位越晚删除肯定更好,但是这里要求的是尽可能和d的补集匹配,就不一定了,所以还是不可做的
我是憨批,上面说错了,就是用这个!!!我人麻了啊
其实考虑什么匹配有什么关系呢,最终目的是让异或值最大啊,最高位越晚删除,一定会让异或值最大,啊杀了我吧
还有一个非常常用的思想,就是关于这种问题,可以从左到右枚举右端点,或者从右到左枚举左端点,每次加入,这样无论怎么查询,都是已经插入的元素(不过要判断一下插入时间是否越界了),就可以只扫一遍了,而莫队显然麻烦许多,所以之后离线也要多考虑这种方法