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 ightarrow i}SG(i))(sum(x)=oplus_{SG(i)=x}h_i)。如果有一个(sum(x) eq 0),先手必胜;否则必败。

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

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

原文地址:https://www.cnblogs.com/xzz_233/p/10798276.html