Codeforces Round 1152 (div. 2)

时间:2022-11-10 11:26:44

奇差。ABC三题,排名400。

首先是策略问题。

由于第一眼看到D的时候感觉不太会做,于是去看E。

一看到E这不欧拉回路吗,可做可做,

于是——我不会欧拉回路!

手推。推了半天啥也没弄出来,

于是大概按照样例琢磨了一个小小的(错的)思路,

于是——WA!

想了想发现有个反例,也不会改,

想回去做D,但是——the contest has ended!!!

我怎么没看时间呢???

啊啊啊。。。

D多么简单。。。

1152d:首先把状态改变为(i,j),表示到了第i个位置,打开的左括号有多少。
那么我们就考虑dp。
dp状态就是dp(i,j)表示以(i,j)这个状态开始的子树中最多有多少条边。
转移的时候枚举走dp(i+1,j+1)和dp(i+1,j-1)。
然后我们观察在哪些地方才去取一个到儿子的边。
根据trie的形状,我们取i为奇数的到儿子的边更合算一点。
那就做完了。

大家都是这个做法。只是有人用了记忆化搜索。

1152e:首先考虑建图,就是把b[i]和c[i]连无向边。
那么肯定先要离散化。
那么问题就被转化成这个图能不能求一条欧拉路径。
其实写起来非常简单。。。
就是如果当前这条边并没有被用过,直接走上去,
直到跑完再输出走到的那个顶点。
我也不知道这样为什么是对的。
只是考完看了刘汝佳的书才知道的。

大家也都是这个做法。还有人贴了板子?

中间遇到的问题
d:我在考试中几乎所有的时间都在e上,所以d就没有时间考虑。考完发现其实不难。
wa4:这个是贪心错了在偶数层取到儿子的边了。
e:考试的时候不会欧拉路径,只好手推,但想不出一个比较对的做法
wa5:这个是没有考虑可能有欧拉回路的情况。
wa8:这个是欧拉路径求错了的情况。
tle11:原来我只是用了vector存图,那么就会发生每到一个节点就重新遍历一遍这个点的所有边的情况,那么重复走两个节点的情况就炸了。后改用multiset存图,每走过一条边就删掉,不会出现重复的情况。