VK Cup 2012 Round 1

来源:互联网 发布:黑手党3和dlc 知乎 编辑:程序博客网 时间:2024/04/26 22:34
周六下午战了一下这场的 virtual,过程大致如下:

A 上来脑残错 WA 一发,之后改过;D 看到是个大裸题,不过上来看成了 <=K 的个数,我想这不是树分治+树状数组(sb),粘了个树分治模板后发现度错题了(没粘原题的我感觉已经很良心了)。。想改成 nlgn 的,不过看 K 那么小,直接 nlgnK 搞了 1Y。。其实改了的话也就两三行的事儿,而实际上树形 DP 也是可以随便做的。。;然后看 B,发现很简单就做了,中途因为一度不知道该怎么写这个题犹豫了一会儿(sb)。。然后 1Y;然后看 C,想想想发现不会w。。最后看 E,感觉预处理一些东西然后搜索可过,开始写,可惜写着写着就乱了临结束前然后好不容易写完跑个 90001 得花好几秒,稳 T,然后就结束了。。最后 R164 滚粗

A、水

B、水

C、感觉这题才是 5 道里最叼的 = =。

大多数题解的做法:从大到小枚举答案串中的最大字母,关键在于这个最大字母只能出现一次,那我们就求一下当前最大字母能得到的对应最长子串长度(就是 overlap 的子串长度),再以最大字母为中心把每个串分成两部分,2 * 2 分治。

这个做法是 4^30 的,可以先通过一个简单优化弄成 2^30 的,就是如果两个子串是包含关系的话答案就是短子串的长度,每 4 个分支中会有 2 个这样的。

按理来说,考虑到这里就已经是 1^30 的复杂度了,基本所有过了的程序写到这里就不写了,不过我死活没想明白为啥做到这就是 2^30 了= =。

所以我又加了个优化,就是对于两个串,如果中间有交集,那我其实可以砍掉一个分支,因为两个分支的关系是包含的。

如果中间没有交集,我就还是 2 个分支,不过这两个分支中最多只有一个能再分出 2 个分支,所以最后就 O(1^30) 了。

zbdy 的做法:从大到小枚举最大字母,然后不递归的搞,可以二分(也可以直接算)出左右端点在当先最大字母形成的块中所在位置,然后直接判断,感觉叼飞了。

D、K 才 500,随便怎么树DP,或者树分治都可以

E、我看有的人不是搜索做的,飞一样快。。不过没太看懂是怎么搞的。。

直接预处理出长度为 i,前面几位是 j 的素数扔进一个 vector 里然后搜就行了;注意最后一层是可以不用搜到底的,搜到底我就 T 了,搜 n - 1 层直接加上最后一层 vector 对应的大小就可以过
0 0