Codeforces Round #556 题解

Codeforces Round #556 题解


Div.2 A Stock Arbitraging

傻逼题

Div.2 B Tiling Challenge

傻逼题

Div.1 A Prefix Sum Primes

傻逼题,先放2,1然后放完2然后放完1

Div.1 B Three Religions

有三个字符串\(s_1,s_2,s_3\)和一个主串\(s\),每次操作改变一个\(s_i\)(插入或删除字符),每次操作完之后问\(s\)是否可以分成\(3\)个子序列正好是\(s_1,s_2,s_3\)。任意时候\(|s_i|\leq 250\)

\(nxt[x][i]\)表示主串上字符\(i\)\(>x\)上第一个出现的位置。

\(f[x][y][z]\)表示三个串分别匹配到\(x,y,z\)需要主串的最短长度。

那么这个可以\(O(1)\)转移,只要枚举拼起来的最后一个字符就行了。

插入最多改变\(251^2\)\(f\)值,每次插入dp一遍多出来的\(f\)就行了。

https://codeforces.com/contest/1149/submission/53513066

Div.1 C Tree Generator™

有一个合法的括号序列,每次交换两个括号(保证还是合法)求这个括号序列对应的树的直径

Orz zsy碾标算

直径相当于选一段,匹配完括号以后剩下最多的括号数

然后(因为zsy太强了)等于这一段分成两段后面的权值和-前面的权值和最大值,其中左括号权值为1,右括号为-1,证明显然

所以在线段树上维护一堆东西。。。就行了

要维护的:最大/最小前/后缀和,最大前/后缀的\(d\)值,序列整体\(d\)值,权值和,答案

一段的\(d\)值就是将这一段分成两段后-前权值最大值

https://codeforces.com/problemset/submission/1149/53591504

Div.1 D Abandoning Roads

我是sb。。考场上读错题了。。。

有一张图只包含边权为\(a,b(a<b)\)的边。对于每个点\(p\)求一个最小生成树满足\(1\)\(p\)距离最小。

显然最小生成树会先取完\(a\),那么先预处理出\(a\)边组成的联通块。\(1\)\(p\)的最短路边权为\(b\)的边一定连接两个不同的联通块,而且都会走到一个之前没走过的联通块。那么可以状压所有联通块,最短路的同时记一下走过哪些联通块了,走\(b\)边时判一下新的联通块有没有走过。点数是\(O(2^nn)\)级别的。

可以发现如果一个联通块点数\(\leq 3\),那么在这个联通块先走\(b\)边出去再走\(b\)边回来是没有意义的,因为这样至少走\(2b\),而这个联通块内部最长也就最多\(2a\)。所以不需要记这些联通块,点数降到\(O(2^{n/4}n)\)就可以直接做了。

https://codeforces.com/contest/1149/submission/53592086

Div.1 E Election Promises

有一张有向无环图,每个点有权值。双方轮流操作,每次操作降低一个点的权值然后任意修改这个点所有后继的权值。不能操作者输。判断先手胜负,如果先手胜输出第一步走的一个可行方案。

先摆结论:\(SG(x)=\mathbb{mex}_{x\rightarrow i}SG(i)\)\(sum(x)=\oplus_{SG(i)=x}h_i\)。如果有一个\(sum(x)\neq 0\),先手必胜;否则必败。

如果所有\(sum\)\(0\),先手操作了点\(i\),那么操作后一定有\(sum(SG(i))>0\)。后手就再次操作使得\(sum(i)=0\)。操作方法就是找到最大的\(i\)满足\(sum(i)>0\),然后可以将所有\(sum\)修改为\(0\)

https://codeforces.com/contest/1149/submission/53593317

posted @ 2019-04-30 22:08  菜狗xzz  阅读(1000)  评论(0编辑  收藏  举报